2016-08-05 5 views
0

Я пытаюсь выполнить сценарий expect с петлей, которая пытается подключиться в ssh и посмотреть, возможно ли это (хороший пароль и доступный). Я попытался поместить результат в переменную, но записывается только конец stdout и не все stdout. Как я могу это сделать?Сценарий Expect и Bash

result=$(
(/usr/bin/expect << EOF 
    spawn ssh [email protected]$ip -o StrictHostKeyChecking=no 
    set timeout 2 
    expect ":" 
    send -- "$password\r" 
    expect ">" 
    send -- "show clock\r" 
    expect ">" 
EOF 
) 2>&1) 

спасибо.

+0

Можете ли вы уточнить, что вы имеете в виду (re: «записано только конец записи stdout, а не все stdout»)? tly в вашем выходе, что вы * ожидаете *, чтобы быть в своем выходе, и как вы проверяете? (Часто люди делают что-то вроде «echo $ result», который скрывает фактический контент). –

+0

Если я пишу: echo $ result Показывается только часть последней строки. – 77140B

+0

'declare -p result', как правило, лучший способ увидеть фактическое содержимое переменной - множество способов« эхо »может испортить вещи. Если есть вероятность, что скрытые символы перепутали вещи, 'printf '% q \ n'" $ result "также является улучшением. Но если вы * собираетесь использовать 'echo', по крайней мере, не оставляйте свои кавычки:' echo '$ result "', а не 'echo $ result'. –

ответ

3

Если вы пытаетесь автоматизировать отправку команды на другой сервер с помощью ssh:

  • Генерирования ssh ключа, вместо использования паролей:

    ssh-keygen -t rsa -b 2048 
    
  • Скопируйте его на сервер :

    ssh-copy-id [email protected] 
    

Теперь вам не нужно беспокоиться о пароле. Клавиши ssh действуют как пароли, и обычно много более безопасно. См. Их (SSH login without password, Why is using SSH key more secure than using passwords?) для получения дополнительной информации о ssh ключах.

Тогда вы можете просто использовать эту команду - нет expect, потому что вам не будет задан пароль. Он будет использовать ваш ключ ssh. Шахта находится по адресу ~/.ssh/id_rsa. Итак:

ssh [email protected] -i ~/.ssh/id_rsa "show clock;" 
  • -i обозначает файл идентичности, т.е. ваш ключевой файл ssh.

отправит команду на сервер SSH.

В целом в настоящее время:

ssh-keygen -t rsa -b 2048 
ssh-copy-id [email protected] 
ssh [email protected] -i ~/.ssh/id_rsa "show clock;" 

Три команды, и вы сделали это!

+1

И поскольку '~/.ssh/id_rsa' является (a?) Значением по умолчанию, вам не нужен аргумент' -i'. 'ssh id @ server show clock'. – chepner

+0

@chepner Это работает, но если вы похожи на меня, у вас есть много ключей 'ssh' для разных серверов. Я включил флаг '-i', поэтому ясно, что вы также можете выбрать, какой файл' ssh' использовать в этой команде. –

0

Позвонив в expectscript из сценария оболочки:

expect "/copySSHKey.exp <machine> <password> </.ssh/id_rsa.pub path>" 

Ожидайте сценарий:

#!/usr/bin/expect -f 

set machine [lrange $argv 0 0] 
set ip [lrange $argv 1 1] 
set pass [lrange $argv 2 2] 
set path [lrange $argv 3 3] 

set timeout -1 
spawn ssh-keygen -R ${machine} 
spawn ssh-copy-id -i ${path} [email protected]${machine} 

match_max 100000 

expect { 

    sleep 10 

    "password" { 
      send -- "$pass\r" 
      send -- "\r" 
      sleep 1 
      send_user " SSH key copied to $machine\n" 
    } 

    "$machine's" { 
      send_user " SSH key copied to $machine\n" 
    } 

    "password:*" { 
      send -- "$pass\r" 
      send -- "\r" 
      sleep 1 
      send_user " SSH key copied to $machine\n" 
    } 

    "machine" { 
      sleep 1 
      send_user " SSH key copied to $machine\n" 
    } 
} 

interact 
-1

Попробуйте использовать двойные кавычки ("), чтобы захватить выход подоболочка в Может быть, вы теряете данные из анализа. выпуски:

result="$(...)" 
+1

На самом деле не требуется для назначения - это контекст, в котором разделение строк и расширение glob отключено. Вы можете легко проверить это самостоятельно: 'var = $ (printf '% s \ n' hello жестокий мир '*'); declare -p var' и обратите внимание, что строки новой строки все еще существуют (они не заменяются пробелами, как это было бы, если бы было разделение строк с IFS по умолчанию), а также звездочка (не заменяемая списком файлов в текущий рабочий каталог). –

Смежные вопросы