2015-11-22 53 views
2

我可以使用子進程從本地執行python環境的腳本,但由於跨平臺問題,我必須在遠程服務器上執行它,並在本地機器上取回結果。在遠程機器上執行程序python

目錄parserpath包含一些第三方模塊,它們可以使用解析器路徑目錄中存在的腳本run.sh執行。但是,此解析器路徑目錄存在於遠程服務器上。 這就是我所擁有的,但是這隻有在parserpath是一個本地目錄時纔有效。我如何SSH到遠程目錄並運行腳本run.sh?

def run_parser(filename): 

    current_dir = os.getcwd() 
    parser_path="/parserpath" 
    os.chdir(parser_path) 
    subprocess.call("./run.sh " + filename, shell=True) 
    os.chdir(current_dir) 

回答

4

大多數Linux shell中,可以通過執行一個子shell中運行在不同的工作目錄下的命令

/home/usr> (cd /usr/local/bin;pwd) 
/usr/local/bin 
/home/usr> 

您可以通過ssh對遠程系統執行相同的操作。根據你使用的ssh客戶端,你可能會稍微減少一些。例如,使用paramiko s exec_command,將爲每個命令創建一個新的遠程shell,因此cd /path/on/remote/machine;./run.sh就足夠了。

有關Python 2.X的paramiko甲簡約例子是

import sys 
import paramiko 

try: 
    hostname, username, password, targetpath = sys.argv[1:5] 
except ValueError: 
    print("Failed, call with hostname username password targetpath") 

command = "cd {};pwd".format(targetpath) 
print("Command to send: {}".format(command)) 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(hostname=hostname, username=username, password=password) 
stdin, stdout, stderr = ssh.exec_command("cd {};pwd".format(targetpath)) 
print(stdout.read()) 
ssh.close() 

python3應該是相似的。還有其他選項,如Python的libssh2綁定,pexpect的ssh支持等等。

+0

謝謝,特別是指向paramiko圖書館。 – AMisra

1

使用SSH密鑰來自動執行通過SSH登錄的過程。以下是遠程執行腳本的代碼。

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], 
        shell=False, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE) 
+0

但我需要將工作目錄更改爲遠程計算機中的目錄。我怎樣才能做到這一點? – AMisra

+0

爲了簡單起見,我只是在您的主目錄中執行strict。但是,如果你不想這樣做,我建議傳遞你想運行的腳本的絕對路徑,否則就不需要改變目錄。看看這個鏈接更多的方向:https://gist.github.com/bortzmeyer/1284249。管理主動SSH連接所需的庫對於您的特定用例而言是不必要的複雜。 –

0

嘗試,SSH用戶@主機SH路徑/ run.sh