使用pexpect将文件scp到远程服务器
我正在尝试学习一些关于pexpect的知识,特别是我想把一个文件从我的笔记本电脑复制到一个远程服务器上。
我遇到了一些奇怪的情况:差不多相同的代码如果我逐行输入就能工作,但如果我把它作为一个脚本运行就不行。
这是我逐行输入的内容:
child = pexpect.spawn('scp pathdir/file.ext username@hostname:pathdir')
r=child.expect ('assword:')
r
它返回0,然后我输入密码完成了这个任务。
child.sendline ('password')
当我通过ssh连接到服务器时,我发现我的文件在那里。所以我把所有步骤整理成一个脚本;它没有报错,但文件却没有被复制……这是为什么呢?更重要的是,我该怎么解决这个问题呢?
这是我的脚本:
child = pexpect.spawn('scp pathdir/file.ext username@hostname:pathdir')
r=child.expect ('assword:')
print r
if r==0:
child.sendline ('password')
child.close()
我不太确定pexpect是怎么工作的,所以我打印了r来确认它是0。结果确实是。
4 个回答
-1
你需要在代码的最后加上 child.interact()
,这样之前写的所有命令才会被执行。
它的样子会是这样的:
child = pexpect.spawn('scp pathdir/file.ext username@hostname:pathdir')
r=child.expect ('assword:')
print r
if r==0:
child.sendline ('password')
child.interact()
child.close()
0
我遇到了同样的问题。这个问题发生在我把客户端的主目录(~/)指定为目标位置的时候。手动输入scp命令时这个方法没问题,但用pexpect的时候就不行了。后来我试着用相对路径或者绝对路径来指定目标目录,这样问题就解决了。
1
在发送密码之后,也就是:
child.sendline('password')
接下来写:
child.expect(pexpect.EOF)
这段代码会等到文件复制完成后再继续执行。
3
我最近也遇到了“相同”的问题。下面是我解决的方法。希望这能对你有所帮助。
你的问题是:
我不太明白pexpect是怎么工作的,所以我打印了r以确认它是0。结果确实是。
没错,它确实是零。
试试下面的代码:
try:
var_password = "<YOUR PASSWORD>" Give your password here
var_command = "scp pathdir/file.ext username@hostname:pathdir"
#make sure in the above command that username and hostname are according to your server
var_child = pexpect.spawn(var_command)
i = var_child.expect(["password:", pexpect.EOF])
if i==0: # send password
var_child.sendline(var_password)
var_child.expect(pexpect.EOF)
elif i==1:
print "Got the key or connection timeout"
pass
except Exception as e:
print "Oops Something went wrong buddy"
print e
child.expect可以接受多个参数。在这种情况下,你需要把这些参数放在一个列表里。在上面的例子中,如果pexpect.spawn的输出是“password:”,那么i
的值会是0;如果遇到EOF
而不是“password”,那么i
的值会是1。
希望这能解答你的疑问。如果还是不明白,告诉我,我会尽量把解释说得更清楚一些。