парамико ssh висит в пакете.py на компьютере с Windows

#python #windows #ssh #paramiko

#python #Windows #ssh #парамико

Вопрос:

Я работаю как на Linux, так и на Windows. Как написано здесь во многих местах, я использую обходной путь stdout.channel.eof_received, чтобы избежать зависания parmaiko packet.py . Мой SSH-код для Linux:

 def SendCommand(self, Command, GetOutput=False,timeout=20):
    log.info('SSH : '   inspect.currentframe().f_code.co_name   'nWith: '   str(locals().items()))
    stdin, stdout, stderr = self.ssh.exec_command("echo '{}' | sudo -S {}".format(self.password, Command))
    resp = ''
    resperr = ''
    if GetOutput:
        endtime = time.time()   timeout
        while not stdout.channel.eof_received:
            time.sleep(0.5)
            if time.time() > endtime:
                stdout.channel.close()
                break
        outlines = stdout.readlines()
        outlinesstderr = stderr.readlines()
        resp = ''.join(outlines)
        resperr = ''.join(outlinesstderr)
    stdinstat, stdoutstat, stderrstat = self.ssh.exec_command('if [ $? -eq 0 ]; then echo OK; else echo FAIL; fi')
    outlines = stdoutstat.readlines()
    respstat = ''.join(outlines)
    log.info(f'SSHlog {Command} status:{respstat}')
    return [resp, resperr, respstat]
  

Это отлично работает.

но… когда я открываю SSH в Windows, это решение не работает. Я никогда не добираюсь до расширения EOF и всегда выхожу из цикла по таймауту… У кого-нибудь есть идея для другого обходного пути? В настоящее время я запускаю скрипт python поверх ssh, и иногда он зависает, когда я пытаюсь прочитать с помощью функции readline().

Мой SSH-код для Windows:

 def send_windows_command_getResp(self, command):
    timeout = 1
    ssh_stdin, ssh_stdout, ssh_stderr = self.ssh.exec_command(command)
    endtime = time.time()   timeout
    while not ssh_stdout.channel.eof_received:
        time.sleep(0.5)
        if time.time() > endtime:
            ssh_stdout.channel.close()
            break
    response = ssh_stdout.readline().rstrip()
    return response
  

Спасибо!