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