[Tutor] Resend: Using pexpect to SCP files
Sander Sweers
sander.sweers at gmail.com
Tue Jul 19 14:12:03 CEST 2011
On 19 July 2011 13:20, Johan Geldenhuys <johan at accesstel.com.au> wrote:
It works fine for me in an interactive idle session.. Have you tried
this to see if works like this? Does the command work when run
directly from the command line?
> I am using pexpect in a script to SCP files to a inux server.
> Here is a snippet from the code:
>
> def doScp(self, user, password, host, path, files):
>
> fNames = " ".join(files)
> self.logger.log('Running command for %s' % fNames)
> try:
>
> self.child = pexpect.spawn("scp %s %s@%s:%s"%(fNames, user, host,
> path))
> # The script times out here:
Add a print here to see what is actually send to scp (or log it to your logger).
> i = self.child.expect(['assword:', r"yes/no"], timeout=30)
> except:
> self.logger.logException()
>
> if i==0:
> self.logger.log('Sending password')
> self.child.sendline(password)
> elif i==1:
> self.logger.log('Sending yes and password')
> self.child.sendline("yes")
> self.child.expect("assword:", timeout=30)
> self.child.sendline(password)
> try:
> data = self.child.read()
> self.logger.log(`data`)
> except:
> self.logger.logException()
The above 5 lines are only run when i == 1, not sure if this was intended.
> self.child.expect(PROMPT)
> self.logger.log('Done with SCP')
You never close the child so you *might*t have zombie processes
around. Which might cause the server not to respond to you. Regardless
It is always good to close so add self.child.close().
> This executes at the line " i = self.child.expect(['assword:', r"yes/no"],
> timeout=30)". From what I can see using tcpdump on the linux side, the scp
> traffic is going into the linux server, but it is not sending anything back.
> Is there anything obvious wrong here and is there a way I can see the exact
> command sent to out?
>
> The reason I chose to use pexpect is that is a pure Python method for doing
> interactive sessions for scp.
> Is there a different way of doing scp in a pure pythin self contained
> module? Piramiko is not an option because I cannot install it on the device
> I run my script on.
It works fine for me with the below function.
Br
Sander
def doScp(user,password, host, path, files):
fNames = ' '.join(files)
print fNames
child = pexpect.spawn('scp %s %s@%s:%s' % (fNames, user, host,path))
print 'scp %s %s@%s:%s' % (fNames, user, host,path)
i = child.expect(['assword:', r"yes/no"], timeout=30)
if i == 0:
child.sendline(password)
elif i == 1:
child.sendline("yes")
child.expect("assword:", timeout=30)
child.sendline(password)
data = child.read()
print data
child.close()
More information about the Tutor
mailing list