Paramiko和“远程Python”
我想通过SSH连接来控制一个远程的Python解释器,并且希望能用Python自己来驱动它。
我有一个基本的模板:
ssh.connect(servername, serverport, username, key_filename=key_filename)
transport = ssh.get_transport()
channel = transport.open_session()
channel.exec_command(PATH_TO_EXEC)
while True:
r, w, e = select.select([channel], [], [], 1)
if channel in r:
try:
if channel.recv_ready():
x = channel.recv(64)
elif channel.recv_stderr_ready():
x = channel.recv_stderr(64)
else:
continue
if len(x) == 0:
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
这个模板让我可以用pdb
和远程应用进行交流,比如用channel.set("command\n")
来发送命令。
这个方法在bash
和gdb
上都能很好地工作,但我就是无法从python
(版本2)获取输出流。
那么,Python是怎么处理它的输出流的呢?为什么我的代码在这里不管用呢?
2 个回答
2
根据你的目标,你可以选择以下两种方式(当然还有其他很多选择!)
如果你想通过 Python 来控制远程机器上的脚本执行,可以试试Fabric。在他们的网站上这样介绍:
Fabric 是一个 Python(2.5 或更高版本)库和命令行工具,旨在简化使用 SSH 进行应用部署或系统管理的过程。它提供了一系列基本操作,可以执行本地或远程的命令(通常是普通命令或通过 sudo),以及上传/下载文件的功能,还有一些辅助功能,比如提示用户输入或中止执行。
如果你想控制远程进程并将它们的输出整合到你主程序的流程中,可以使用multiprocessing 模块。根据PEP 371的介绍:
这个包还提供了服务器和客户端的功能(processing.Manager),可以实现对象和任务的远程共享和管理,这样应用程序不仅可以利用本地机器的多个核心,还可以在一组网络连接的机器上分配对象和任务。
2
除非你是在做学术研究,或者有特别的需求需要使用ssh,不然可以看看pushy这个工具。我自己没用过,但看起来挺成熟的。