Не удается найти подстроку в выходных данных канала Парамико - PullRequest
0 голосов
/ 11 марта 2020

Python 3.7.4. Я запускаю сценарий bash, используя Paramiko:

        channel = ssh.get_transport().open_session()
        channel.get_pty()
        channel.invoke_shell()
        time.sleep(1)
        if channel.recv_ready():
            output = channel.recv(1024).decode('ascii')
        print(output)

        cd = 'cd test/'
        install = './test.sh'
        channel.send(cd + '\n')
        channel.send(install + '\n')

        while True:
            time.sleep(1)
            if channel.recv_ready():
                output = channel.recv(2048).decode('ascii')
                if (r'User \x1b[1mtest\x1b[m\x0f does not exist, creating test user..' in output):
                    print('Test script started successfully')
                    break
            else:
                time.sleep(1)
                if not(channel.recv_ready()):
                    break

Часть выходного значения в то время как l oop:

'cd test/\r\n[root@hostname test]# ./test.sh\r\nUser \x1b[1mtest\x1b[m\x0f does not exist, creating test user..\r\nuseradd: warning: the home directory already exists.\r\n(...)'

Я не могу понять почему (r'User \x1b[1mtest\x1b[m\x0f does not exist, creating test user..' in output) не соответствует действительности. Я попытался декодировать вывод в UTF-8, используя обычную строку с escape-последовательностью backsla sh, но это тоже не сработало.

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

1 Ответ

0 голосов
/ 12 марта 2020

Экранирующие последовательности, такие как \r \n или \x1b[1m, не будут иметь того же значения, если вы используете необработанную строку. Например, r"\n" означает буквально символ \, а затем символ n, но "\n" означает новую строку:

>>> print(r"\n")
\n
>>> print("\n")


>>> 

Так что сначала вы должны декодировать в utf-8, затем использовать обычную строку, а не сырой.

...