通过中间主机SSH连接机器

10 投票
5 回答
7020 浏览
提问于 2025-04-16 19:40

在我和教授的工作中,我需要通过ssh连接到我们的服务器,然后再从服务器连接到每个节点来运行我们的程序。我想写一个Python程序,这样我就可以在本地机器上完成所有需要在远程节点上做的事情。我要在节点上运行的命令包括:

  • 把文件从本地机器复制到远程节点
  • 在每个节点上运行一个程序
  • 把节点上的文件取回到我的本地机器
  • 可能还想复制一个Fortran程序并在节点上编译,同时检查节点上是否有程序在运行。

现在,我在本地机器上制作输入文件,然后用scp把它们传到服务器,再把文件复制到每个节点上,最后在每个节点上运行我们的流体动力学程序。然后,我再反向操作,把输出结果取回到本地机器。

我在看paramiko这个库,但我不知道怎么用它从我的本地机器连接到节点,因为我必须先通过服务器。也就是说,连接的顺序是:本地机器 -ssh--> 服务器 -ssh--> 节点。

有没有办法在Python中做到这一点,或者我应该尝试其他方法,比如:

os.system(ssh -t server ssh node 'command')   

或者在服务器上为不同的命令写一些bash脚本(比如compile.sh、move_inputs.sh、retrieve_outputs.sh),然后只需连接到服务器并运行这些bash脚本。

抱歉如果这说得不太清楚,或者表达得不好,任何帮助都非常感谢。

补充信息:我使用Python的原因是因为我希望这个程序能够生成输入文件,发送到节点并取回输出文件,最后生成我们的数据图表。我已经有一些代码可以生成输入文件和从输出中制作图表。

5 个回答

5

通过我同事的一个小技巧,你可以直接从本地用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'

祝你玩得开心!

6

你可以用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)
7

你不需要用Python来完成这个。可以看看SSH的ProxyCommand配置选项。这里有一个教程,详细解释了相关内容。

撰写回答