Соединение Paramiko с Windows молча прерывается (похоже, успешно) - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь использовать paramiko для отправки команд powershell через ssh в окно Windows с OpenSSH.Команды кажутся успешными (код возврата 0), даже когда они должны потерпеть неудачу, и я не получаю никакой информации о каналах.Когда я пытаюсь использовать такие команды, как создание каталога, он не создается, и создается впечатление, что команды не достигают удаленной системы, но также не выдают ошибок.

Во-первых, вот мой код:

version = self.oscall.run_remote(['java', '-version'])

def run_remote(self, command): # Command is a list of command + args
    string = ""
    self.timeout = 300
    for arg in command:
        string = string + " " + arg
    self.client.connect(self.host, username=self.user, password=self.pw, timeout=self.timeout)
    self.transport = self.client.get_transport()
    self.transport.set_keepalive(1)
    self.channel = self.transport.open_session(timeout=self.timeout) # transport is abstract connection, session is socket
    if self.channel.gettimeout() == None: self.channel.settimeout(self.timeout)
    self.channel.exec_command(string)
    self.out = self.channel.makefile()
    self.err = self.channel.makefile_stderr()
    self.output = CallOutput(self.out, self.err, None)
    self.output.returncode = self.channel.recv_exit_status()
    self.channel.close()
    return self.output

class CallOutput(object):
    def __init__(self, out, err, rc):
        self.out = out.readlines()
        self.err = err.readlines()
        self.outfile = tempfile.TemporaryFile() 
        for line in self.out:
            if isinstance(line, unicode): line = line.encode('utf-8')
            self.outfile.write(line + '\n')
        self.outfile.seek(0)
        self.errfile = tempfile.TemporaryFile()
        for line in self.err:
            if isinstance(line, unicode): line = line.encode('utf-8')
            self.errfile.write(line + '\n')
        self.errfile.seek(0)
        self.returncode = rc

Извините за стену текста, но я пошел за полнотой.Это часть большого приложения.

Этот код прекрасно работает при подключении к Linux, поэтому я не ожидаю, что будет много маленьких ошибок.Код возврата всегда равен 0, даже для мусора, и никогда не будет никакого вывода на каналы.Если я запускаю команду только с помощью терминала, я получаю правильный вывод:

$ ssh testuser@testwin.internal.com 'java -version'
Warning: Permanently added 'testwin.internal.com,10.10.10.12' (ECDSA) to the 
list of known hosts.
testuser@testwin.internal.com's password:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
$ echo $?
0
$ ssh testuser@testwin.internal.com 'foo'
foo : The term 'foo' is not recognized as the name of a cmdlet, function, script file, or
operable program. Check the spelling of the name, or if a path was included, verify that the path
is correct and try again.
At line:1 char:1
+ foo
+ ~~~
    + CategoryInfo          : ObjectNotFound: (foo:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

$ echo $?
1

Единственное различие между нашими процессами Linux и Windows, о котором я могу думать, это то, что в Windows мы должны использовать пароль,поскольку мы еще не установили ssh без пароля.Какую странную особенность Windows мне не хватает?Любая идея будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 сентября 2018

Как обычно, все оказалось намного проще, чем я думал.

string = ""
for arg in command:
    string = string + " " + arg

Приведенный выше код выдает «какую бы команду не передали», и оказывается, что Windows крайне плохо реагирует на предыдущее пространство, в то время как linux это не волновало.Новый фрагмент кода выглядит так:

string = ""
first = True
for arg in command:
    if first:
        string = string + arg
        first = False
    else:
        string = string + " " + arg

Я оставляю название и детали те же, надеюсь, чтобы помочь любому, кто совершит точно такую ​​же ошибку, что и я.

...