Python 使用密码从命令行运行SCP

Python 使用密码从命令行运行SCP,python,command-line,centos,fabric,scp,Python,Command Line,Centos,Fabric,Scp,我需要一种方法从命令行用密码运行SCP 具体来说,这是因为我需要使用Python库结构将一台远程机器SCP连接到另一台远程机器,而不需要文件通过本地机器(这是一个大文件,两台远程机器之间的连接比我的本地机器与它们之间的连接快得多)这两台远程计算机正在运行CentOS 但是对于主要问题,这些细节都不是特别重要。首先,详细说明这样做的安全危害,只需运行ps-ww-fp就可以很容易地查看命令行参数。此漏洞就是scp不允许在命令行上传入密码的原因 因此,请确保您同意这样一个事实,即任何可以运行该命令的人

我需要一种方法从命令行用密码运行SCP

具体来说,这是因为我需要使用Python库结构将一台远程机器SCP连接到另一台远程机器,而不需要文件通过本地机器(这是一个大文件,两台远程机器之间的连接比我的本地机器与它们之间的连接快得多)这两台远程计算机正在运行CentOS


但是对于主要问题,这些细节都不是特别重要。

首先,详细说明这样做的安全危害,只需运行
ps-ww-fp
就可以很容易地查看命令行参数。此漏洞就是scp不允许在命令行上传入密码的原因

因此,请确保您同意这样一个事实,即任何可以运行该命令的人都可以看到纯文本的密码

SCP的作者认为你是如此愚蠢,以至于你会滥用在命令行上传递密码的能力。一、 另一方面,相信你已经在这一点上得到了充分的警告,如果你想这样做,你不应该被阻止

关于实际解决方案:

您需要在应该运行SCP的计算机上安装
expect

在我使用Python库结构控制运行CentOS的机器的具体案例中,我运行了以下程序来安装它:

from fabric.operations import sudo

sudo('yum -y install expect')
要在CentOS上直接从命令行运行它,只需执行以下操作:

$ yum -y install expect
(我假设您知道在您自己的操作系统上与yum等价的东西。)

安装expect后,您可以像这样运行SCP:

expect -c
'spawn scp <copy-from-username>@<copy-from-address>:<copy-from-path> <copy-to-path>;
 expect "*?es??o*"   {send "yes\r"; exp_continue}
        "*?assword:" {send "<copy-from-password>\r"};
 interact'
def putFromFileRepository(repoIP, repoUsername, repoPassword, repoPath, putPath):
    from fabric.operations import sudo

    # There are security implications from passing a password as an argument
    # on the command line, namely that command line arguments can be easily seen
    # from anywhere via 'ps -ww -fp <pid>'.
    # Thus scp doesn't allow passwords to be passed on the command line.
    # We'll install expect to make it possible.
    sudo('yum -y install expect')

    repoStr = repoUsername + '@' + repoIP + ':' + repoPath

    # expect has alien syntax - explained inline below.
    # see man expect for more details.
    sudo("expect -c 'spawn scp " + repoStr + ' ' + putPath + '; ' # Run SCP when started.
         + 'expect "*?es??o*" {send "yes\r"; exp_continue} '      # Reply yes to yes/no questions.
         + '"*?assword:" {send "' + repoPassword + '\r"}; '       # Give password when prompted.
         + "interact'")  # Start.