繁体   English   中英

在远程服务器上运行本地python脚本

[英]Run local python script on remote server

我正在调试一些必须在我的虚拟机上运行的python脚本。 而且,我更喜欢在本地编辑脚本(在虚拟机之外)。 所以我发现每次将修改后的脚本scp到虚拟机都很繁琐 有人能建议一些有效的方法吗?

特别是,我想知道是否可以在远程PVM上执行python脚本。 像这样的东西:

python --remote user@192.168.1.101 hello.py //**FAKED**, served to explain ONLY

可以使用ssh。 Python接受连字符( - )作为参数来执行标准输入,

cat hello.py | ssh user@192.168.1.101 python -

运行python --help以获取更多信息。

虽然这个问题不是很新,而且已经选择了答案,但我想分享另一个好方法。

使用paramiko库 - SSH2的纯python实现 - 您的python脚本可以通过SSH连接到远程主机,将自身(!)复制到该主机,然后在远程主机上执行该副本。 远程进程的Stdin,stdout和stderr将在您的本地运行脚本上可用。 所以这个解决方案几乎独立于IDE。

在我的本地计算机上,我使用cmd-line参数'deploy'运行脚本,这会触发远程执行。 如果没有这样的参数,则运行用于远程主机的实际代码。

import sys
import os

def main():
    print os.name

if __name__ == '__main__':
    try:
        if sys.argv[1] == 'deploy':
            import paramiko

            # Connect to remote host
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect('remote_hostname_or_IP', username='john', password='secret')

            # Setup sftp connection and transmit this script
            sftp = client.open_sftp()
            sftp.put(__file__, '/tmp/myscript.py')
            sftp.close()

            # Run the transmitted script remotely without args and show its output.
            # SSHClient.exec_command() returns the tuple (stdin,stdout,stderr)
            stdout = client.exec_command('python /tmp/myscript.py')[1]
            for line in stdout:
                # Process each line in the remote output
                print line

            client.close()
            sys.exit(0)
    except IndexError:
        pass

    # No cmd-line args provided, run script normally
    main()

省略了异常处理以简化此示例。 在具有多个脚本文件的项目中,您可能必须将所有这些文件(和其他依赖项)放在远程主机上。

ssh user@machine python < script.py - arg1 arg2

因为cat | 通常没有必要

你可以通过ssh来做。

ssh user@192.168.1.101 "python ./hello.py"

您还可以使用文本编辑器或X11转发在ssh中编辑脚本。

我必须在使用Paramiko之前做到这一点,我想在运行ssh服务器的主机上运行动态的本地PyQt4脚本,该服务器连接了我的OpenVPN服务器并询问它们的路由首选项(拆分隧道)。

只要您连接的ssh服务器具有脚本的所有必需依赖项(在我的情况下为PyQt4),您可以通过在base64中对其进行编码并使用解码时的exec()内置函数轻松封装数据。信息。 如果我没记错的话,我的单行代码是:

stdout = client.exec_command('python -c "exec(\\"' + open('hello.py','r').read().encode('base64').strip('\n') + '\\".decode(\\"base64\\"))"' )[1]

它很难读取,你必须逃避转义序列,因为它们被解释两次(一次由发送者,然后由接收者再次)。 它也可能需要一些调试,我已经将我的服务器打包到PCS或者我只是引用我的OpenVPN路由脚本。

与发送文件相反,这样做的不同之处在于,它从不接触服务器上的磁盘,而是直接从内存运行(除非他们记录命令)。 您会发现以这种方式封装信息(尽管效率低下)可以帮助您将数据打包到单个文件中。

例如,您可以使用此方法在主脚本中包含来自外部依赖项(即图像)的原始数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM