[Tutor] Remote access from Windows PC to a Linux box

Mike Baker mibaker88 at gmail.com
Wed Apr 21 20:15:28 CEST 2010


Thanks Tim,

Your subprocess examples got me started in the right direction.  I've moved
on to a slightly more advanced problem that I need help with.

I want to remotely start a Tshark packet capture session on one of our Linux
machines in the lab.  I want to start the session from my Windows machine
running Python 2.5.  The output capture file needs to be saved on the remote
Linux machine.

The example below nearly does what I want.  It starts Tshark via Putty, runs
for 10 seconds then writes the capture file (out.txt) to a remote Linux
machine.  The problem is that the putty session hangs open while Tshark is
running. So, I can't execute additional Python commands until the Tshark
capture finishes.

I've experimented with the Unix nohup command, but it does not seem to work
as expected with Tshark.  If you call my function below with
>>> test_subp(alt_cmd=1)
then the nohup command is added to the subprocess command list (along with a
trailing '&' to send the command to background).  This should work.  Using
this alternate command, out.txt gets created, but is always empty.


Here is my code:
**********************************************
def test_subp(alt_cmd=0):
    '''Establish a Putty connection with one of our Linux machines in the
lab.
    Send Tshark command to start a data collection session over Putty.
    '''
    PLINK = 'C:\\Progra~1\\putty\\plink'
    sess_name='LabComp1'
    if alt_cmd:
        '''This command does not work as expected.  The tshark output file
(out.txt)is created,
        but there is nothing in it '''
        CMD_LIST=[PLINK,sess_name,'/usr/bin/nohup','/usr/bin/sudo
/usr/sbin/tshark', '-a', 'duration:10', '-i',  'wlan0', '-T', 'text',
'-V','>', 'out.txt','&'];
    else:
        'This command works great, writing tshark output to out.txt on the
remote machine.'
        'Unfortunately, this command hangs the putty session until the
tshark capture ends'
        CMD_LIST=[PLINK,sess_name,'/usr/bin/sudo /usr/sbin/tshark', '-a',
'duration:10', '-i',  'wlan0', '-T', 'text', '-V','>', 'out.txt'];
    print "The command list you are sending to the subprocess is: \n", "\t",
CMD_LIST

    PIPE = subprocess.PIPE
    p = subprocess.Popen(CMD_LIST, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate ()
    print 'stdout = ', stdout
    print 'stderr = ', stderr
*********************************************************************

For both runs (atl_cmd=0 or alt_cmd=1), the stdout and stderr printouts at
the end of the script are empty.

Any suggestions would be appreciated.

Thanks,

    Mike
*******************************************************************************************************

On Wed, Mar 31, 2010 at 7:42 AM, Tim Golden <mail at timgolden.me.uk> wrote:

> On 30/03/2010 17:29, Mike Baker wrote:
>
>> I'm trying to connect to a Linux box from my Windows machine and execute a
>> series of commands
>>
>> I want a script to always
>> execute the same series of commands without having to do so manually.   I
>> also have code that will execute a single command like cat a file and
>> write
>> the ouput to a new file. However, when I try to use the communicate object
>> in subprocess, my window hangs.
>>
>
>
> This works for me:
>
> <code>
> import os, sys
> import subprocess
>
> PLINK = "plink"
> REMOTE_USER = "tgolden at web30.webfaction.com"
> PIPE = subprocess.PIPE
>
> p = subprocess.Popen ([PLINK, REMOTE_USER, "ls"], stdout=PIPE)
> stdout, stderr = p.communicate ()
> print "#1:", stdout.splitlines ()[0]
>
> with open ("out.txt", "w") as f:
>  p = subprocess.Popen ([PLINK, REMOTE_USER, "cat .bashrc"], stdout=f)
>  p.communicate ()
> print "#2:", open ("out.txt").read ().splitlines ()[0]
>
> p = subprocess.Popen ([PLINK, REMOTE_USER], stdin=PIPE, stdout=PIPE)
> stdout, stderr = p.communicate ("ls\nexit\n")
> print "#3", stdout
>
> p = subprocess.Popen ([PLINK, REMOTE_USER], stdin=PIPE, stdout=PIPE)
> p.stdin.write ("ls\nexit\n")
> stdout, stderr = p.communicate ()
> print "#4", stdout
>
> </code>
>
> A few things to note, none of which I believe to be germane to the
> issues you're experiencing:
>
> * You almost never need to use shell=True on a Windows call to subprocess.
>  If in doubt, don't use it.
>
> * Definitely better to pass the list-of-params style as the first param
>  of subprocess.Popen; it sorts out issues with embedded spaces etc.
>
> * The open ("...", "w") in your second example *may* be closing the
>  file immediately. I doubt it, since you'd expect Popen to hold a
>  reference, but I haven't checked the implementation.
>
> TJG
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20100421/e358211b/attachment.html>


More information about the Tutor mailing list