[英]SSH to machine through a middle host
在我與我的教授的工作中,我必須ssh到我們的服務器,然后從那里我進入每個節點來運行我們的程序。 我正在嘗試編寫一個python程序,它將讓我從本地計算機上執行遠程節點上需要執行的所有操作。 我將在節點上運行的命令是:
現在我在我的本地機器上創建我的輸入文件,將它們scp到服務器,然后我將文件復制到每個節點並在每個節點上運行我們的fluid_dynamics程序。 然后我反過來將輸出恢復到我的本地機器。
我正在看paramiko,但我無法弄清楚如何使用它從我的本地機器到節點,因為我必須通過服務器。 local -ssh - > server -ssh - > nodes
有沒有辦法在python中執行此操作,或者我應該嘗試其他方法,如:using:
os.system(ssh -t server ssh node 'command')
或者在服務器上為每個不同的命令(compile.sh,move_inputs.sh,retrieve_outputs.sh)創建一個bash腳本,然后只連接到服務器並運行bash腳本。
對不起,如果這沒有意義或措辭不當,任何幫助表示贊賞。
附加信息:我使用python的原因是因為我希望程序能夠生成輸入文件,將它們發送到節點並檢索輸出文件,並最終生成我們數據的圖形。 我已經有了一些代碼來生成輸入文件並從輸出中生成圖形。
你不需要Python來做到這一點。 檢查SSH的ProxyCommand配置選項 。 這是一個解釋詳細信息的教程 。
通過我的同事的技巧,您可以直接從本地到節點ssh / scp。
編輯你的〜/ .ssh / config:
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Host node1 node2 or node*
ProxyCommand ssh server 'nc -w 5 %h 22'
玩得開心!
你可以用Paramiko做到這一點:
proxy_command = 'ssh -i %s %s@%s nc %s %s' % (proxy_key, proxy_user, proxy_host, host, 22)
proxy = paramiko.ProxyCommand(proxy_command)
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host, username=user, password=password, sock=proxy)
stdin, stdout, stderr = client.exec_command('echo HELLO')
print "Echo: %s" % (", ".join(stdout.readlines()))
client.close()
它也適用於SFTPClient
:
proxy_command = 'ssh -i %s %s@%s nc %s %s' % (proxy_key, proxy_user, proxy_host, host, 22)
proxy = paramiko.ProxyCommand(proxy_command)
transport = paramiko.Transport(proxy)
transport.connect(username=user, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
您可以通過在服務器上創建到節點的隧道來執行此操作:
import os, sys, shlex
import subprocess
import paramiko
cmd = "ssh -f -N -p " + str(serverport) + " -l " + serveruser + " -L " + str(tunnelport) + ":" + nodehost + ":" + str(nodeport) + " " + serverhost
args = shlex.split(cmd)
tun = subprocess.Popen(args)
stat = tun.poll()
設置隧道后,您可以ftp到節點:
transport = paramiko.Transport(("127.0.0.1", tunnelport))
transport.connect(username=nodeusername, password=nodepw)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(localfile, remotefile)
或者,您可以使用paramiko.SSHClient()。connect(“127.0.0.1”,port = port,username = user,password = pw)和paramiko.SSHClient()。exec_command(command)連接並執行命令。
然后可以殺死隧道進程:
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
if cmd in line:
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
使用plink root@10.112.10.1 -pw password ls -l
下載plink並將其復制到您的Windows機器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.