簡體   English   中英

SSH通過中間主機加工

[英]SSH to machine through a middle host

在我與我的教授的工作中,我必須ssh到我們的服務器,然后從那里我進入每個節點來運行我們的程序。 我正在嘗試編寫一個python程序,它將讓我從本地計算機上執行遠程節點上需要執行的所有操作。 我將在節點上運行的命令是:

  • 從本地計算機到遠程節點的cp文件
  • 在每個節點上運行程序
  • 從節點檢索文件到我的本地計算機
  • 也許可以復制一個fortran程序並在節點上編譯它,並檢查節點以查看是否有任何程序正在運行。

現在我在我的本地機器上創建我的輸入文件,將它們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來做到這一點。 檢查SSHProxyCommand配置選項 這是一個解釋詳細信息的教程

通過我的同事的技巧,您可以直接從本地到節點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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM