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

5 投票
1 回答
17827 浏览
提问于 2025-04-17 06:59

我对Python和编程还很陌生。现在我想通过一个Python脚本在两台电脑之间复制一个文件。但是这段代码

os.system("ssh " + hostname + " scp " + filepath + " " + user + "@" + localhost + ":" cwd)

却无法运行。我觉得可能需要输入密码,正如在如何使用SCP或SSH在Python中复制文件到远程服务器?中所描述的那样。我没有收到任何错误日志,文件就是没有出现在我当前的工作目录里。

不过,使用os.system("ssh " + hostname + "command")os.popen("ssh " + hostname + "command")的其他命令都能正常工作。-> command = e.g. ls

当我在命令行中尝试 ssh hostname scp file user@local:directory 时,它可以正常工作,而且不需要输入密码。

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

import pxssh
import getpass

ssh = pxssh.pxssh()
ssh.force_password = True
hostname = raw_input("Hostname: ")
user = raw_input("Username: ")
password = getpass.getpass("Password: ")
ssh.login(hostname, user, password)
test = os.popen("hostname")
print test

但是我无法将命令传递给远程服务器(print test显示,hostname = local而不是远程服务器),不过我确定连接是建立成功的。我原以为建立连接会比每次在bash命令中使用"ssh " + hostname要简单。我也尝试了一些在如何使用SCP或SSH在Python中复制文件到远程服务器?中的解决方法,但我必须承认,由于经验不足,我没能让它们正常工作。

非常感谢你的帮助。

1 个回答

4

我觉得最简单(可以避免输入密码)又最安全的方法是先设置公钥/私钥认证。一旦设置完成,你就可以通过输入 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])])

撰写回答