簡體   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