SSH通过中间主机加工

时间:2011-06-16 02:57:58

标签: python ssh

在我与教授的合作中,我必须进入我们的服务器,然后从那里进入每个节点来运行我们的程序。我正在尝试编写一个python程序,它将让我从本地计算机上执行远程节点上需要执行的所有操作。我将在节点上运行的命令是:

  • 从本地计算机到远程节点的cp文件
  • 在每个节点上运行程序
  • 从节点检索文件到本地计算机
  • 也许可以复制一个fortran程序并在节点上编译它,并检查节点以查看是否有任何程序正在运行。

现在我在我的本地机器上创建输入文件,将它们scp到服务器,然后将文件复制到每个节点并在每个节点上运行我们的fluid_dynamics程序。然后我反过来将输出恢复到我的本地机器。

我在看paramiko,但我无法弄清楚如何使用它从我的本地机器到节点,因为我必须通过服务器。 local -ssh - > server -ssh - >节点

有没有办法在python中执行此操作,或者我应该尝试其他方法,例如: 使用:

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

或在服务器上为每个不同的命令(compile.sh,move_inputs.sh,retrieve_outputs.sh)创建一个bash脚本,然后只连接到服务器并运行bash脚本。

对不起,如果这没有意义,或者措辞不当,任何帮助都表示赞赏。

其他信息: 我使用python的原因是因为我希望程序能够生成输入文件,将它们发送到节点并检索输出文件,并最终生成我们数据的图形。我已经有了一些代码来生成输入文件并从输出中生成图形。

5 个答案:

答案 0 :(得分:7)

您不需要Python来执行此操作。检查ProxyCommand configuration option for SSH。这是一个解释细节的tutorial

答案 1 :(得分: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'

玩得开心!

答案 2 :(得分:4)

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

答案 3 :(得分:3)

您可以通过服务器创建到节点的隧道来执行此操作:

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)

答案 4 :(得分:1)

使用plink root@10.112.10.1 -pw password ls -l

下载plink并将其复制到您的Windows机器