通过中间主机SSH连接机器
在我和教授的工作中,我需要通过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配置选项。这里有一个教程,详细解释了相关内容。