2015-11-22 52 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