2016-10-21 5 views
0

Я пытаюсь использовать expect для автоматизации задачи как части более крупной программы python, и у меня возникли проблемы с отправкой команды ssh на удаленную машину. Я еще не использовал expect и не успел найти решение на странице руководства.Использование ожидать получить от ssh

Мне нужно использовать функцию автоматизации некоторых взаимодействий, прежде чем выполнить эту команду, но я удалил их здесь, чтобы упростить вопрос.

Ниже приведен упрощенный пример программы:

import subprocess 

expect = """ 
/usr/bin/expect <<EOF 

spawn ssh some_machine ls 
expect eof 
puts "$expect_out(buffer)" 
""" 

output = subprocess.check_output(expect, shell=True) 
print(output) 

Выход:

b'spawn ssh some_machine ls\r\n116029\r\nArchive\r\n\r\n(buffer)\n' 

По-видимому, содержит команду икру, а также «(буфер)» в конце. Я не уверен, почему это происходит. Я пытаюсь получить результаты только ls.

Если я включу режим отладки в ожидании, я вижу, что expect_out(buffer) настроен на то, что я хотел бы вернуть, но puts не отражает это.

Выход:

expect version 5.45 
argv[0] = /usr/bin/expect argv[1] = -d 
set argc 0 
set argv0 "/usr/bin/expect" 
set argv "" 
executing commands from command file 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {1753} 
expect: read eof 
expect: set expect_out(spawn_id) "exp7" 
expect: set expect_out(buffer) "116029\r\nArchive\r\n" 
<wrong output as above> 
+1

Почему вы используете 'expect' здесь? Вы просто запускаете команду и читаете ее стандартный вывод. Вы можете просто запустить 'subprocess.check_output ('ssh some_machine ls', shell = True)'. – larsks

+0

Я упростил сценарий для примера, но мне нужно использовать его для автоматизации некоторого взаимодействия, прежде чем я смогу собрать результат. – Matteo

+0

Кроме того, в вашем сценарии оболочки 'ожидать' отсутствует терминал' EOF' для соответствия '<< EOF'. – larsks

ответ

1

Вы можете запретить вывод журнала из Ожидайте с командой log_user:

log_user 0 
spawn ssh some_host ls 
expect eof 
puts "$expect_out(buffer)" 

Без log_user 0, я получаю:

$ expect -f sample.tcl 
spawn ssh some_host ls 
file1 
file2 

Добавляя log_user 0, Я получаю:

$ expect -f sample.tcl 
file1 
file2 

Там, кажется, некоторые странности, когда вы подаете ожидать сценарий с помощью стандартного ввода, но следующий, кажется, работает:

import subprocess 
import tempfile 

expect = """ 
log_user 0 
spawn ssh some_host ls < /dev/null 
expect eof 
puts "$expect_out(buffer)" 
""" 

with tempfile.NamedTemporaryFile() as fd: 
    fd.write(expect) 
    fd.flush() 
    fd.seek(0) 
    output = subprocess.check_output(['expect', fd.name]) 

print(output) 
+0

Единственный выход, который я получаю от этого: 'b '(buffer) \ n'' – Matteo

+0

В комментарии есть что-то не так, но я думаю, что вижу поведение, которое вы пытались описать. Взгляд ... – larsks

+0

Да, он работает, используя sample.tcl. Но когда я использую в python, он работает некорректно, и выход кажется только выше. Я продолжу расследование ... – Matteo