2011-11-24 96 views
5

我对Python和编程很新颖。我试图通过一个python脚本在两台电脑之间复制一个文件。但代码通过Python中的scp和os模块从远程服务器安全复制文件

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

将不起作用。我认为它需要一个密码,如How to copy a file to a remote server in Python using SCP or SSH?中所述。我没有得到任何错误日志,该文件不会显示在我的当前工作目录中。

然而,每一个其他命令与os.system("ssh " + hostname + "command")os.popen("ssh " + hostname + "command")确实工作。 - >command = e.g. ls

当我尝试 ssh hostname scp file [email protected]:directory 在它的工作原理无需输入密码的命令行。

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

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显示,该主机名=本地,而不是远程服务器),但我敢肯定,连接已建立。我认为建立连接要比在bash命令中始终使用"ssh " + hostname更容易。我还尝试了How to copy a file to a remote server in Python using SCP or SSH?中的一些解决方法,但我必须承认,由于缺乏说明,我没有让他们工作。

非常感谢您的帮助。

+2

你为什么认为你需要做'ssh hostname scp'?为什么不只是'scp user @ hostname:file localdirectory'? –

+0

出于安全原因,在'os.system()'上使用'subprocess'模块。 – glglgl

+0

我还没有想过通过'scp user @ hostname:file localdirectory'复制的可能性。它确实有效,但只有当我取消'user @'部分时才有效。 – user1063572

回答

3

我认为最简单的方法(避免输入密码)和最安全的方法是先设置public/private key authentication。一旦做到这一点,你可以通过做ssh [email protected]登录到远程系统,以下bash命令会做的伎俩:

scp some/complete/path/to/file [email protected]_system:some/remote/path 

相应的Python代码将是:

import subprocess 

filepath = "some/complete/path/to/file" 
hostname = "[email protected]_system" 
remote_path = "some/remote/path" 

subprocess.call(['scp', filepath, ':'.join([hostname,remote_path])]) 
相关问题