使用pexpect将文件scp到远程服务器

5 投票
4 回答
16161 浏览
提问于 2025-04-17 21:12

我正在尝试学习一些关于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。

希望这能解答你的疑问。如果还是不明白,告诉我,我会尽量把解释说得更清楚一些。

撰写回答