Как я могу (могу ли я?) Получить статус выхода из команды?

С помощью twisted.conchЯ работаю со следующими SSHChannel реализация, которая получает команду для запуска при создании экземпляра:

class CommandChannel(channel.SSHChannel):
    name = 'session'

    def __init__(self, command, *args, **kwargs):
        channel.SSHChannel.__init__(self, *args, **kwargs)
        self.command = command

    def channelOpen(self, data):
        d = self.conn.sendRequest(
            self, 'exec', common.NS(self.command), wantReply=True)
        d.addCallback(self._gotResponse)

    def _gotResponse(self, _):
        self.conn.sendEOF(self)
        self.loseConnection()

    def dataReceived(self, data):
        log.msg('dataReceived: data=%r' % data)

    def extReceived(self, dataType, data):
        log.msg('extReceived: dataType=%r, data=%r' % (dataType, data))

    def closed(self):
        reactor.stop()

Для этого я передаю команду оболочки, которая должна возвращать какой-то статус завершения. Могу ли я прочитать, что это за статус выхода? Я надеялся extReceived может быть мой путь, но это не похоже на это.

В моих журналах я вижу это, которое, кажется, должно быть подсказкой, где искать, но я не уверен, как следовать указанной подсказке:

2013-04-05 10:39:37-0400 [SSHChannel session (0) on SSHService ssh-connection
    on CommandTransport,client] unhandled request for exit-status

1 ответ

Решение

Есть два дополнительных обратных вызова, которые вы можете реализовать для этого. Это обратные вызовы на канале, так что вы уже достаточно близки.

Первый request_exit_status, Как только вы это осуществите, Conch больше не будет регистрировать, что exit-status запрос не обработан. Вот пример реализации:

def request_exit_status(self, data):
    """
    When the server sends the command's exit status, record it for later
    delivery to the protocol.

    @param data: The network-order four byte representation of the exit
        status of the command.
    @type data: L{bytes}
    """
    (status,) = unpack('>L', data)
    if status != 0:
        self._reason = ProcessTerminated(status, None, None)

Второй request_exit_signal, exit-signal отправлено вместо exit-status если команда завершается сигналом. Вот пример реализации:

def request_exit_signal(self, data):
    """
    When the server sends the command's exit status, record it for later
    delivery to the protocol.

    @param data: The network-order four byte representation of the exit
        signal of the command.
    @type data: L{bytes}
    """
    (signal,) = unpack('>L', data)
    self._reason = ProcessTerminated(None, signal, None)

Общая картина здесь такова, что когда SSHChannel получает запрос на foo, он попытается позвонить request_foo с байтами, составляющими запрос.

Другие вопросы по тегам