通过Python中的scp和os模块从远程服务器安全复制文件

通过Python中的scp和os模块从远程服务器安全复制文件,python,ssh,scp,Python,Ssh,Scp,我对Python和编程相当陌生。我试图通过python脚本在两台计算机之间复制一个文件。然而,代码 os.system("ssh " + hostname + " scp " + filepath + " " + user + "@" + localhost + ":" cwd) 不行。我认为它需要一个密码,如中所述。我没有得到任何错误日志,该文件将不会显示在我当前的工作目录中 但是,使用os.system(“ssh”+hostname+“命令”)或os.popen(“ssh”+hostnam

我对Python和编程相当陌生。我试图通过python脚本在两台计算机之间复制一个文件。然而,代码

os.system("ssh " + hostname + " scp " + filepath + " " + user + "@" + localhost + ":" cwd)
不行。我认为它需要一个密码,如中所述。我没有得到任何错误日志,该文件将不会显示在我当前的工作目录中

但是,使用
os.system(“ssh”+hostname+“命令”)
os.popen(“ssh”+hostname+“命令”)
的所有其他命令都可以工作。-><代码>命令=例如ls

当我尝试
ssh主机名scp文件user@local:目录
在命令行中,它不需要输入密码就可以工作

我尝试将
os.popen
命令与getpass和pxssh模块相结合,以建立到远程服务器的ssh连接,并使用它直接发送命令(我只测试了一个简单的命令):

但是我无法将命令发送到远程服务器(
print test
显示,hostname=local,而不是远程服务器),但是我确信连接已经建立。我认为建立连接比在bash命令中始终使用
“ssh”+hostname
更容易。我也尝试了一些解决办法,但我必须承认,由于缺乏有效期,我没有让它们发挥作用

非常感谢您的帮助。

我认为最简单(避免输入密码)和最安全的方法是先设置密码。完成后,您可以通过
ssh登录到远程系统user@hostname
,下面的bash命令将完成此任务:

scp some/complete/path/to/file user@remote_system:some/remote/path
相应的Python代码是:

import subprocess

filepath = "some/complete/path/to/file"
hostname = "user@remote_system"
remote_path = "some/remote/path"

subprocess.call(['scp', filepath, ':'.join([hostname,remote_path])])

您认为为什么需要执行
ssh主机名scp
?为什么不干脆
scpuser@hostname:file localdirectory
?出于安全原因,我更喜欢
子流程
模块,而不是
os.system()
。我没有考虑通过
scp进行复制的可能性user@hostname:file localdirectory
。它确实有效,但只有在我取消
user@
部分时才有效。我直到现在才知道
子流程
模块,但我会考虑它(正如我所说,我是python新手,正在学习,我需要一些时间来适应)
import subprocess

filepath = "some/complete/path/to/file"
hostname = "user@remote_system"
remote_path = "some/remote/path"

subprocess.call(['scp', filepath, ':'.join([hostname,remote_path])])