【问题标题】:How to use scp command in paramiko如何在 paramiko 中使用 scp 命令
【发布时间】:2013-02-22 06:27:29
【问题描述】:

我在 paramiko python 模块“find”和“scp”中使用了两个命令。 Find 命令工作正常并给出正确的输出,但 scp 没有给出任何输出。 我尝试了以下代码:

import paramiko

class SSH:

    def ssh_Connection(self):
        try:
            self.ssh = paramiko.SSHClient()
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh.connect('host_name',username='user',password='pass')

        except Exception, e:
            print "================================================"
            print 'ERROR: Remote connection failed with %s' % e
            print "================================================"


    def ssh_Commands(self):
        try:
            stdin, stdout, stderr = self.ssh.exec_command('find /result/main/ -name "*new.txt*"')
            for line in stdout:
                a = line.strip('\n')
                print a
                if a:
                    cmd = 'scp -r %s redhat@192.168.56.32:/results/main/' % a
                    print cmd
                    stdin, stdout, stderr = self.ssh.exec_command(cmd)
                    print stdout.read()
                    print stderr.read()

            self.ssh.close()
        except Exception, e:
            print "================================================"
            print 'ERROR: Commands Execution failed with %s' % e
            print "================================================"


if __name__ == "__main__":
    a = SSH()
    a.ssh_Connection()
    a.ssh_Commands()

但是这个程序不适合我..

Throwing an error:
Host key verification failed.
lost connection

如何在 paramiko 中使用 scp...有什么想法吗?

【问题讨论】:

    标签: python scp paramiko


    【解决方案1】:

    您可以使用 paramiko 的SFTPClient 将文件从本地复制到远程服务器。

    SFTPClient 的 put 方法会将本地文件复制到远程服务器。

    【讨论】:

    • +1 这个解决方案似乎更便携,即使 paramiko 客户端在 Windows 上运行它也可以工作。我什至会使用它来搜索文件,但 find 在本地工作并且速度更快。
    • 我试过 SFTPClient 它正在工作...但是我们怎样才能找到文件然后下载呢?我不想为 SFTPClient 创建另一个连接
    • 您可以在远程服务器上调用find -type f -name new.txt 命令并获取输出。从该输出下载这些文件。
    【解决方案2】:

    您正在执行命令的服务器 (host_name) 没有对您尝试 scp 到 (192.168.56.32) 的服务器的正确 SSH 访问权限,这就是它生成错误 Host key verification failed 的原因(其中表示 host_name 上的 known_hosts 文件中 192.168.56.32 的主机密钥与 192.168.56.32 返回的密钥不匹配。

    要么修复主机密钥,要么尝试像这样运行 scp:

    scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -r %s ...
    

    (也请注意,如果文件名包含空格,您的 scp 命令将失败,请在您的 scp 命令行上使用 "%s")。

    【讨论】:

    • 我已将 'scp -r %s redhat@192.168.56.32:/results/main/' % a 替换为 'scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -r % s redhat@192.168.56.32:/results/main/' %a 没有显示任何东西,甚至我的 find 命令输出也没有。
    • 尝试 sshing 到 host_name 并手动执行命令以查看它是否有效。
    • 显示一个警告:将“192.168.56.32”(RSA)永久添加到已知主机列表中。
    • 没关系,尽管这表明 scp-command 从未从您的脚本中调用过。不知道为什么,而且很难从这里调试。确保您使用与脚本完全相同的变量:相同的用户、密码等。
    • 一切都一样,但不知道为什么它不起作用...我尝试使用 SFTPClient,我可以下载文件,但如何找到文件是个问题