Is there a method of executing a command then continue the program without command termination

Hi I am trying to create a function which remotely executes my packet sniffing script on my raspberry pi using paramiko and ssh.

def startPacketReceiver():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(AutoAddPolicy())
    ssh.connect(RECV_IP_ADDRESS, username="pi", password="raspberry")
    ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("sudo gcc Code/test.c && sudo ./a.out")
    print("Done")

The test.c file is the packet sniffing script. It will only terminate with a CTRL-C (or equivalent method). It does not terminate naturally/eventually.

I want to be able to start the receiver and then quit the receiver e.g:

startPacketReceiver()
...
stopPacketReceiver()

Currently when I run the python script I never get the “Done” print message, meaning that the program is hung on the exec_command and will not continue until it is terminated.

Additional Info

The test.c file loops infinitely, essentially:

while(1)
{
    saddr_size = sizeof saddr;
    //Receive a packet
    data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);
    //fprintf(stderr,"%d",data_size);
    if(data_size <0 )
    {
        fprintf(stderr,"Failed to get packetn");
        printf("Recvfrom error , failed to get packetsn");
        return 1;
    }
    //Now process the packet
    ProcessPacket(buffer , data_size);
}

and so to stop it you must CTRL-C it.

Answer

You need to send your password to the sudo command. Please enable tty mode for executing your command by passing get_pty = True argument to exec_command function call. And then you need to pass your password through ssh_stdin file interface.

def startPacketReceiver():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(AutoAddPolicy())
    ssh.connect(RECV_IP_ADDRESS, username="pi", password="raspberry")
    ssh.stdin, ssh_stdout, ssh_stderr = ssh.exec_command("gcc Code/test.c && sudo ./a.out", get_pty=True)
    print("raspberry", ssh_stdin) # Your password for sudo command
    print("Done")
    return ssh, ssh_stdin, ssh_stdout, ssh_stderr

And then you can write your stopPacketReceiver to send Ctrl-C signal.

def stopPacketReceiver(ssh, ssh_stdin, ssh_stdout, ssh_stderr):
    print('x03', file=ssh_stdin) # Send Ctrl-C signal
    print(ssh_stdout.read()) #print the stdout
    print(ssh_stderr.read())