>>>>> Hussein B <hubaghd...@gmail.com> (HB) wrote:

>HB> Hey,
>HB> I'm trying to execute a command over a remore server using pexpect
>HB> +++++++++++++++++
>HB> url = 'ssh internalserver'
>HB> res = pexpect.spawn(url)
>HB> print '1'
>HB> res.expect('.*ssword:')
>HB> print '2'
>HB> res.sendline('mypasswd')
>HB> print '3'
>HB> res.sendline('ls -aslh')
>HB> +++++++++++++++++
>HB> What I want to do is to send a couple of commands and get the
>HB> response.
>HB> How to do this?
>HB> Thanks.

You can read the output with res.readline() in a loop or similar. The
problem is when to stop. You could look in the returned string for the
prompt and hope the prompt doesn't accidentally occur in the output.

You can also do res.expect(prompt) and get res.before() Same problem
with accidentally occurrence of the prompt.

Another way is to use a timeout, e.g. with read_nonblocking or
specifying a timeout at the spawn call.

You can also consider using paramiko instead of pexpect. It gives you
considerably more control. For each command you van open a `channel' and
that acts more or less similar to a socket, i.e. you get a decent EOF at
the end of the command's output. This implies that you have to create a
new channel for each command, but it stays within the same SSH
connection (SSH allows subconnections).

Example:

>>> import paramiko
...Mumbles about deprecated modules...
>>> hostname='server.example.net'
>>> port = 22
>>> t = paramiko.Transport((hostname, port))
>>> username = 'user'
>>> password = '********'
>>> t.connect(username=username, password=password)

Open a channel for a command

>>> chan = t.open_session()
>>> chan.exec_command('ls -l')
>>> chan.recv(999999)
'total 0\ndrwxr-xr-x  2 user group 60 Apr  2  2009 Mail\ndrwx------  2 user 
group  6 Dec 27  2008 tmp\n'
>>> chan.recv(999999)
''

That was end of file.
Open a new channel for a new command

>>> chan = t.open_session()
>>> chan.exec_command('cat')
>>> chan.send('abcdefghijklmn\n')
15
>>> chan.recv(99)
'abcdefghijklmn\n'
>>> 
-- 
Piet van Oostrum <p...@cs.uu.nl>
URL: http://pietvanoostrum.com [PGP 8DAE142BE17999C4]
Private email: p...@vanoostrum.org
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to