繁体   English   中英

在Python中创建和维护几个ssh会话

[英]Create and maintain several ssh sessions in Python

一旦我的程序启动,它将打开任意数量的ssh会话(用户定义)并无限期地在服务器上运行特定命令(同时为真循环)或直到用户退出。 出于效率原因,我想只创建一次会话,然后能够运行命令直到用户退出。

我怎么能在python中这样做? 我在另一个帖子中遇到了一个很酷的方法,它使用subprocess来运行命令并捕获它的STDOUT。 如何首先启动会话,然后运行循环命令?

任何链接到Python中的类似过程的东西也将受到赞赏。 这是我的第一个python应用程序。

暂时忽略Python,您可以通过添加它来复用ssh会话

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 1h

到你的~/.ssh/config文件。 连接到机器一次后,该机器的ssh会话将保持打开状态,此后的命令将在此机器上几乎立即执行。 然后,您可以根据需要使用Python子进程调用ssh并在该计算机上执行命令,并且可以重用会话而无需执行任何特殊操作。

如果您不想使会话多路复用成为默认行为(或者您正在为可能没有将其作为默认行为的其他用户进行部署),您也可以使用指向备用配置文件的-F标志调用ssh

选项1:您可以通过使用PIPE重定向输入来重新使用ssh进程。

这是一个基本的例子:

[(Z) </tmp> ]% touch input_file
[(Z) </tmp> ]% tailf input_file | ssh <remote_host>

现在尝试在文件中写入内容

[(Z) </tmp> ]% echo "date" >> /tmp/input_file

这是一种使用子进程模块在Python中使用它的方法。

import subprocess
SSH_CMD = "cat -| /usr/bin/ssh -o PasswordAuthentication=no -T -x %s "
HOSTNAME = "127.0.0.1"
s = subprocess.Popen(SSH_CMD%HOSTNAME , shell=True, close_fds=True, 
stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)

这启动了一个可以重复使用的子进程。 请注意,由于已知错误( http://bugs.python.org/issue2320 ),因此需要close_fds=True

>>> REMOTE_CMD = "date"
>>> s.stdin.write( REMOTE_CMD +
... "\necho 'remote command completed with exit code = '$?\n")
>>> s.stdout.readline()
'Thu Feb 16 20:01:36 PST 2012\n'
>>> s.stdout.readline()
'remote command completed with exit code = 0\n'

echo 'remote command completed with exit code = '$?\\n line用于知道远程命令已完成,并且已完成写入s.stdout。 这对于了解远程命令的退出代码也很有用。

要使用相同的子进程执行另一个远程命令:

>>> REMOTE_CMD = "uptime"
>>> s.stdin.write( REMOTE_CMD +
... "\necho 'remote command completed with exit code = '$?\n")
>>> s.stdout.readline()
' 20:02:17 up 28 days,  9:15, 48 users,  load average: 0.01, 0.02, 0.05\n'
>>> s.stdout.readline()
'remote command completed with exit code = 0\n'

回到你的问题,一旦你创建了一个ssh子进程,你就可以继续发送远程命令了。 用户退出后,您可以终止子流程。

>>> s.kill()

选项2:我从未使用过这个,但是ssh有一个ControlMaster选项可以重新使用ssh。 检查ssh_config的手册页(5)

尝试使用pexpect模块。 它允许打开和维护ssh会话,您可以重复使用它来发送多个命令。 您可以发送任何命令并期望基于您可以执行其他逻辑操作的特定输出。

尝试将它与多线程混合起来?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM