Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Twisted在远程系统上运行命令_Python_Twisted - Fatal编程技术网

Python 使用Twisted在远程系统上运行命令

Python 使用Twisted在远程系统上运行命令,python,twisted,Python,Twisted,我正在尝试使用Twisted编写一个客户机/服务器,它将允许客户机在服务器上发出远程命令并实时接收响应数据。i、 e.如果我运行ssh服务器someProg.sh,我将“实时”看到结果,而不是在进程完成时一次看到所有结果。这种事情在美国可能发生吗?谢谢。当然。正如已经在评论中指出的,您可以通过以下方式完成此操作。这更具可伸缩性(您可以在不使用任何额外进程的情况下打开大量连接)和更具可移植性(它可以在Windows上工作),但它不会考虑您的OpenSSH配置,并且您必须编写一系列附加代码来处理主机

我正在尝试使用Twisted编写一个客户机/服务器,它将允许客户机在服务器上发出远程命令并实时接收响应数据。i、 e.如果我运行ssh服务器someProg.sh,我将“实时”看到结果,而不是在进程完成时一次看到所有结果。这种事情在美国可能发生吗?谢谢。

当然。正如已经在评论中指出的,您可以通过以下方式完成此操作。这更具可伸缩性(您可以在不使用任何额外进程的情况下打开大量连接)和更具可移植性(它可以在Windows上工作),但它不会考虑您的OpenSSH配置,并且您必须编写一系列附加代码来处理主机密钥验证之类的事情。另一个问题也没有直接解决您的主要问题,这是关于输出到达时正在处理的问题

简单的答案是“是”,但这里有一个演示程序,它生成了几个子流程,并在运行时显示它们的输出。您可以用另一个要生成的程序(即
ssh
)替换
sys.executable
,它的工作方式完全相同

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()

你可以用paramikolib


这似乎与感谢您的回复完全相同。我现在意识到,我的问题似乎暗示我特别想使用SSH,但实际上我正试图避免它。当我说我在编写客户机/服务器时,我的意思是我需要控制两端;我还希望在没有SSH所要求的身份验证的情况下运行。在这种情况下,您希望在服务器中执行
spawnProcess
,响应某些协议消息(即从
dataReceived
)而不是在
callLater
中,如本例所示。但请随意问一个更具体的问题,类似的标签:-)。谢谢;无缓冲标志(-u)实际上让我得到了我想要的行为。问题是如何使用Twisted,所以这并不能真正回答这个问题。
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