我正在嘗試編寫一個使用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 –