- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我从这个开始……我根本不懂 Python;我在兜圈子,我根本不明白。我对替代和更简单的方法完全开放。
我的目标 :连接到不同的服务器,在每个服务器上运行相同的命令,然后(如现在/还没有)将输出用于生产性事情。惊人的。
我有什么 :在某处找到了一些代码(我会尝试找到一个链接并更新它)。我稍微修改了一下。它连接到不同的服务器,运行相同的命令。
问题 : 一切都完成后,我不知道如何停止 react 堆。我真的很想停止它而不按cntrl+c
.我想我需要推迟一些事情,但我不知道什么或在哪里。我觉得当 SSHChannel 关闭时,需要以某种方式冒泡到 SSHConnection,以停止服务......所以传输可以知道发生了什么?我一直想以某种方式包装每个 reactor.connectTCP(server, 22, factory)
以某种方式推迟。而且我觉得我可能需要一个 Controller 类。我尝试了这些东西,但没有正确尝试。也许gatherResults
可能会有所帮助,但是,我不知道到底该放什么。
from twisted.conch.ssh import transport, connection, userauth, channel, common
from twisted.internet import defer, protocol, reactor
import sys, struct
USER = 'username'
PASS = 'thisisforpersonalusesoicanstoreit!'
CMD = 'echo "merely this and nothing more"'
from twisted.python import log
import sys
log.startLogging(sys.stdout)
class ClientCommandTransport(transport.SSHClientTransport):
def __init__(self, username, password, command):
self.username = username
self.password = password
self.command = command
def verifyHostKey(self, pubKey, fingerprint):
print fingerprint
return defer.succeed(True)
def connectionSecure(self):
self.requestService(
PasswordAuth(self.username, self.password,
ClientConnection(self.command)))
class PasswordAuth(userauth.SSHUserAuthClient):
def __init__(self, user, password, connection):
userauth.SSHUserAuthClient.__init__(self, user, connection)
self.password = password
def getPassword(self, prompt=None):
return defer.succeed(self.password)
class ClientConnection(connection.SSHConnection):
def __init__(self, cmd, *args, **kwargs):
connection.SSHConnection.__init__(self)
self.command = cmd
def serviceStarted(self):
self.openChannel(CommandChannel(self.command, conn=self))
class CommandChannel(channel.SSHChannel):
name = 'session'
def __init__(self, command, *args, **kwargs):
channel.SSHChannel.__init__(self, *args, **kwargs)
self.command = command
self.data = ''
def channelOpen(self, data):
self.conn.sendRequest(
self, 'exec', common.NS(self.command), wantReply=True).addCallback(
self._gotResponse)
def _gotResponse(self, _):
self.conn.sendEOF(self)
self.loseConnection()
def dataReceived(self, data):
#self.data += data
print data
def request_exit_status(self, data):
(status,) = struct.unpack('>L', data)
# print 'exit status = ', status
class ClientCommandFactory(protocol.ClientFactory):
def __init__(self, command=CMD):
self.username = USER
self.password = PASS
self.command = command
def buildProtocol(self, addr):
protocol = ClientCommandTransport(
self.username, self.password, self.command)
return protocol
masters = ['server1','server2','server3','server4','server5']
factory = ClientCommandFactory()
for server in masters:
print server
reactor.connectTCP(server, 22, factory)
reactor.run()
getPage
对于 http 请求(确实有效),但我似乎无法使用 react 器和 ssh 连接重新应用它。
SSHChannel
中停止了校长。
closed()
如果工厂在其数组(或任何 python 调用的数组)中不再有连接。
class ClientCommandFactory(protocol.ClientFactory):
def clientConnectionLost(self, connector, reason):
print reason
014-10-16 13:42:58-0500 [SSHChannel session (0) on SSHService ssh-connection on ClientCommandTransport,client] closed last TCP connection
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] service stopped
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] connection lost
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion: Connection lost.
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] ]
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] connection lost
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion: Connection lost.
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] ]
2014-10-16 13:42:58-0500 [ClientCommandTransport,client] Stopping factory <__main__.ClientCommandFactory instance at 0x02323030>
2014-10-16 13:42:58-0500 [-] Main loop terminated.
最佳答案
所以首先这是行不通的,因为connectTCP
接受带有 IP address
的字符串作为第一个参数,您正在传递此列表中的元素:
masters = ['server1','server2','server3','server4','server5']
from twisted.conch.ssh import transport, connection, userauth, channel, common
from twisted.internet import defer, protocol, reactor
import sys, struct
USER = 'username'
PASS = 'thisisforpersonalusesoicanstoreit!'
CMD = 'echo "merely this and nothing more"'
from twisted.python import log
import sys
log.startLogging(sys.stdout)
class ClientCommandTransport(transport.SSHClientTransport):
def __init__(self, username, password, command, factory):
self.username = username
self.password = password
self.command = command
self.factory = factory
def verifyHostKey(self, pubKey, fingerprint):
print fingerprint
return defer.succeed(True)
def connectionSecure(self):
self.requestService(
PasswordAuth(self.username, self.password,
ClientConnection(self.command, self.factory)))
class PasswordAuth(userauth.SSHUserAuthClient):
def __init__(self, user, password, connection):
userauth.SSHUserAuthClient.__init__(self, user, connection)
self.password = password
def getPassword(self, prompt=None):
return defer.succeed(self.password)
class ClientConnection(connection.SSHConnection):
def __init__(self, cmd, *args, **kwargs):
connection.SSHConnection.__init__(self)
self.command = cmd
self.factory = factory
def serviceStarted(self):
self.openChannel(CommandChannel(self.command, self.factory, conn=self))
class CommandChannel(channel.SSHChannel):
name = 'session'
def __init__(self, command, factory, *args, **kwargs):
channel.SSHChannel.__init__(self, *args, **kwargs)
self.command = command
self.data = ''
self.factory = factory
self.factory.num_connections += 1
self.factory.connections.append(self)
def channelOpen(self, data):
self.conn.sendRequest(
self, 'exec', common.NS(self.command), wantReply=True).addCallback(
self._gotResponse)
def _gotResponse(self, _):
self.conn.sendEOF(self)
self.loseConnection()
self.factory.num_connections -= 1
self.factory.connections.remove(self)
if self.factory.num_connections == 0:
reactor.stop()
def dataReceived(self, data):
#self.data += data
print data
def request_exit_status(self, data):
(status,) = struct.unpack('>L', data)
# print 'exit status = ', status
class ClientCommandFactory(protocol.ClientFactory):
def __init__(self, command=CMD):
self.username = USER
self.password = PASS
self.command = command
self.connections = []
self.num_connections = 0
def buildProtocol(self, addr):
protocol = ClientCommandTransport(
self.username, self.password, self.command, self)
return protocol
masters = ['server1','server2','server3','server4','server5']
factory = ClientCommandFactory()
for server in masters:
print server
reactor.connectTCP(server, 22, factory)
reactor.run()
self.connections
和
self.num_connections
存储对工厂中连接的引用并计算连接数。然后在工厂的
buildProtocol
工厂将自己传递给
ClientCommandTransport
,这又将工厂的引用传递给
ClientConnection
,它最终将引用传递给需要它的工厂 - 到
CommandChannel
.每次
CommandChannel
的实例被实例化了,它有一个对工厂的引用,所以它把连接数加一并将自己添加到连接列表中,连接列表存储在工厂中。我假设
_gotResponse
完成任务/命令时触发回调。因此,每当它被触发时,它都会像以前一样失去连接,但现在,它还会减少连接计数器并从工厂中删除对自身的引用。它还检查是否有任何其他打开的连接,如果没有,它会停止 react 器。
Factory
->
ClientCommandTransport
->
ClientConnection
->
CommandChannel
而且我不确定将引用一直传递给工厂是否是最佳解决方案。
self.num_connections
并增加/减少它或
self.connections
,从列表中添加/删除实例并使用
len(self.connections)
看看是否还有任何打开的连接。
关于Python Twisted Conch - 如何通过多个连接停止 react 器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288862/
我有一个 Twisted Conch SSH 服务器,典型的场景是这样的: git 通过 OpenSSH 客户端 >>--- WAN1 --->> Twisted conch svr >>--- WA
我需要创建一个SSH服务器(已为该任务选择了twisted.conch),它将执行以下操作: 执行端口转发(附加的代码不执行该操作,我执行 不知道要修改什么) 在执行命令之前(或至少在执行之前或之后记
让我从这个开始……我根本不懂 Python;我在兜圈子,我根本不明白。我对替代和更简单的方法完全开放。 我的目标 :连接到不同的服务器,在每个服务器上运行相同的命令,然后(如现在/还没有)将输出用于生
关闭 Twisted conch SSH 连接的正确方法是什么?有没有明确的方法来做到这一点? 我见过的所有 Twisted conch 示例都会关闭 SSH channel ,然后停止 react
我正在考虑用 python 创建一个我可以运行的服务器,并将用作 SSH 服务器。这将让不同的用户登录,就像他们正常登录一样,但只能访问一个命令。 我想这样做是为了拥有一个系统,我可以在其中添加用户而
我用 Twisted Conch 写了一个 SSH 服务器。但是遇到了一个棘手的问题。假设用户A和用户B通过ssh命令登录到扭曲的ssh服务器。然后用户A在服务器上tail或者cat一个大文件(大于1
我目前正在通过蛮力学习 ssh/继续破解直到我理解它的方法。经过一些试验和错误后,我已经能够成功发送一个“pty-req”,然后是一个“shell”请求,我可以获得登录序言,发送命令并接收标准输出,但
我正在尝试使用简单的 ssh 服务器捕获 ssh 暴力破解尝试,代码如下所示并且有效,但是我无法将用户名/密码组合与其原始 IP 地址相匹配。 到目前为止,这是我能做到的最简单的事情,它不记录但只是打
在 Ubuntu 13.04 中,我已经从 tarball 安装了适用于 python-2.7 的 Scrapy。执行爬网命令会导致以下错误: ImportError: Error loading o
我是一名优秀的程序员,十分优秀!