我正在尝试编写一个使用Twisted的客户端/服务器,它将允许客户端在服务器上发出远程命令并实时接收响应数据。即如果我运行$> ssh server someProg.sh
,我将在“实时”看到结果,而不是在过程结束时立即看到结果。 Twisted中有这种可能吗?谢谢。使用Twisted在远程系统上运行命令
2
A
回答
4
绝对。正如评论中已经指出的那样,您可以通过connecting to the SSH server directly with Twisted's "conch" library来完成此操作。这是更具扩展性的(你可以在没有任何额外进程的情况下打开大量连接),并且更加便携(它可以在Windows上工作),但它不会考虑你的OpenSSH配置,你必须编写一堆额外的代码来处理像主机密钥验证一样。另一个问题并没有直接解决你的主要问题,也就是说,它是关于正在处理的输出。
简单的答案是“是”,但这里有一个演示程序,它生成几个子进程并随着显示它们的输出。您可以用sys.executable
替代另一个产卵程序(即ssh
),它将以完全相同的方式工作。
import os, sys
from twisted.internet.protocol import ProcessProtocol
from twisted.internet import reactor
from twisted.internet.defer import Deferred, gatherResults
script = """
import time
for x in range(3):
time.sleep(1)
print(x)
"""
class SimpleProcess(ProcessProtocol):
def __init__(self, id, d):
self.id = id
self.d = d
def outReceived(self, out):
print('Received output: {out} from: {proc}'
.format(out=repr(out), proc=self.id))
def processEnded(self, reason):
self.d.callback(None)
ds = []
for x in range(3):
d = Deferred()
reactor.callLater(
x * 0.5, reactor.spawnProcess, SimpleProcess(x, d),
sys.executable, [sys.executable, '-u', '-c', script],
os.environ)
ds.append(d)
gatherResults(ds).addBoth(lambda ignored: reactor.stop())
reactor.run()
-1
你可以使用的paramiko LIB http://www.lag.net/paramiko/
import paramiko
class XXX():
def ssh_processing(self, params):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_connection = ssh.connect(ip, username=params['username'] , password=params['password'])
result = self.exec_ssh(ssh, cmd)
def exec_ssh(self, ssh, cmd):
self._log('Exec [%s]' % cmd)
(stdin, stdout, stderr) = ssh.exec_command(cmd)
data = {
'stdin' : '', #self._read_all(stdin),
'stdout' : self._read_all(stdout),
'stderr' : self._read_all(stderr)
}
if len(data['stderr']):
msg = 'SSH Error: [%s]' % data['stderr']
self._error(msg)
if 'command not found' in data['stderr']:
raise Exception(msg)
return data
+1
问题是关于如何使用Twisted,所以这并没有真正回答它。 – Glyph
相关问题
- 1. 如何在使用Java的远程系统上运行SSH命令?
- 2. 如何通过java程序在远程系统上运行SSH命令(后续)
- 3. 使用系统命令运行RAILS_ENV = production
- 4. 如何在远程系统上执行BASH脚本的命令?
- 5. 在远程机器上运行命令
- 6. 远程运行系统
- 7. 使用python在linux上运行系统命令?
- 8. 使用Java在远程计算机上运行命令行
- 9. 在远程计算机上使用wmi python执行系统命令
- 10. 使用Maven运行远程命令
- 11. 使用Javascript运行远程命令
- 12. 使用ssh运行远程awk命令
- 13. 使用SQLPlus在远程Oracle服务器上运行命令行命令
- 14. 如何使用perl在远程计算机上运行命令?
- 15. 如何使用telnetlib3在python asyncio上运行远程命令
- 16. 使用不同凭据在远程PC上运行Powershell命令
- 17. 如何使用Perl在远程计算机上运行命令?
- 18. 使用ssh在远程计算机上运行命令
- 19. 确定应用程序是否在远程系统上运行
- 20. 使用perl在一行中运行多个系统命令
- 21. 如何使用WMI作为非管理员用户在远程Windows系统上运行命令?
- 22. Rails应用程序在远程计算机上运行命令
- 23. 如何在命令提示符下从远程系统运行tsql
- 24. 如何在远程服务器上运行命令行程序
- 25. 从C++应用程序运行系统命令不同于命令行
- 26. 在PowerShell中运行远程cmd命令
- 27. 使用python运行远程Windows机器上的命令
- 28. 从R运行sudo的系统命令?
- 29. 登录MySQL时运行系统命令
- 30. Jquery Button OnClick运行系统命令
这似乎是http://stackoverflow.com/questions/4617507/best-way-to-run-remote-commands完全相同的副本-thru-ssh-in-twisted –