启动程序后,它会打开任意数量的ssh会话(用户定义)并无限期地在服务器上运行特定命令(同时为真循环)或直到用户退出。出于效率原因,我想只创建一次会话,然后能够运行命令直到用户退出。
我怎么能在python中这样做?我在另一个帖子中遇到了一个很酷的方法,它使用subprocess
来运行命令并捕获它的STDOUT。我怎样才能首先启动会话,然后运行循环命令?
任何指向Python中类似进程的东西的链接也将受到赞赏。这是我的第一个python应用程序。
答案 0 :(得分:6)
暂时忽略Python,您可以通过添加此
来复用ssh
个会话
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 1h
到您的~/.ssh/config
文件。连接到机器一次后,该机器的ssh会话将保持打开状态,此后的命令将在此机器上几乎立即执行。然后,您可以根据需要使用Python子进程调用ssh并在该计算机上执行命令,并且可以重用会话而无需执行任何特殊操作。
如果您不想使会话多路复用成为默认行为(或者您正在为其他用户部署),您也可以使用ssh
标志指向备用配置文件来调用-F
可能没有它作为默认值。)
答案 1 :(得分:4)
选项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
行用于知道远程命令已完成,并且已完成写入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)
的手册页答案 2 :(得分:0)
尝试使用pexpect模块。它允许打开和维护ssh会话,您可以重复使用它来发送多个命令。您可以发送任何命令并期望基于您可以执行其他逻辑操作的特定输出。
答案 3 :(得分:-1)
尝试将其与多线程混合使用?