2011-11-24 94 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])]) 
相關問題