通过Python的scp和os模块从远程服务器安全复制文件
我对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])])