![](/img/trans.png)
[英]Unable to run psql commands on remote server from local python script
[英]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.