Прошу помощи.
Хочу нарисовать модуль, который подключается к 5 сервера по ssh и выполняет определенные команды + sftp команды (копировать - удалять файлы/директории).
Команды буду скармливать через txredisapi.
У меня сложность с conch.
Нарисовал для себя такой пример:
[code python]#!/usr/bin/env python
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
if __name__ == '__main__':
import sys
import p3
from twisted.internet.task import react
react(p3.main)
import os, getpass
from twisted.python.filepath import FilePath
from twisted.python.usage import Options
from twisted.internet.defer import Deferred
from twisted.internet.protocol import Factory, Protocol, ReconnectingClientFactory
from twisted.internet.endpoints import UNIXClientEndpoint
from twisted.conch.ssh.keys import EncryptedKeyError, Key
from twisted.conch.client.knownhosts import KnownHostsFile
from twisted.conch.endpoints import SSHCommandClientEndpoint
class NoiseProtocol(Protocol):
def connectionMade(self):
print "Connected to SSH"
self.finished = Deferred()
def dataReceived(self, data):
print "Server says:\n", data
class ConnectionParameters(object):
def __init__(self, reactor):
self.reactor = reactor
self.host = "192.168.87.100"
self.port = 22
self.username = "root"
self.password = None
self.keys = None
self.knownHosts = None
self.agent = None
self.keys = []
self.keys.append(Key.fromFile(os.path.expanduser("~/.ssh/id_rsa")))
knownHostsPath = FilePath(os.path.expanduser("~/.ssh/known_hosts"))
if knownHostsPath.exists():
self.knownHosts = KnownHostsFile.fromPath(knownHostsPath)
else:
self.knownHosts = None
def endpointForCommand(self, command):
return SSHCommandClientEndpoint.newConnection(
self.reactor, command, self.username, self.host,
port=self.port, keys=self.keys,
knownHosts=self.knownHosts)
def main(reactor):
parameters = ConnectionParameters(reactor)
endpoint = parameters.endpointForCommand(b"")
factory = ReconnectingClientFactory()
factory.protocol = NoiseProtocol
d = endpoint.connect(factory)
d.addCallback(lambda proto: proto.finished)
r = endpoint.existingConnection(factory.protocol.transport, b"/bin/ls")
d = endpoint.connect(factory)
d.addCallback(lambda proto: proto.finished)
r.addCallback(lambda proto: proto.finished)
return d[/code]
В логах на сервере видно - подключается и что то делает))
Но, мне не понятно 2 вещи:
1 - почему он пытается 2 раза подключиться, точнее устанавливает 2 раза соединие
из консоли
<twisted.conch.endpoints.SSHCommandClientEndpoint object at 0x104fc4790> Connected to SSH Connected to SSH
В идеале мне нужно делать команды в рамках одного соединения. Ну и реконектить, если отвалился.
Можно ли пример, если не сложно?
2 подключения по 2 команды + если можно с одной передачей чайла.
извините за наглость, просто не догоняю.