2015-09-03 2 views
1

Я пытаюсь создать скрипт, который автоматически вводит пароль «root» для копирования ssh-ключа из A в B. Так как ssh-copy не работает на B, а также не может быть установлен, я использовал :Expect Script - Auto Password

ssh [email protected]$ip mkdir -p .ssh 
cat "~/.ssh/id_rsa.pub" | ssh "[email protected]$ip" 'cat >> .ssh/authorized_keys' 

Передача ключа. Но B делеты его хранения при перезагрузке. Поэтому мне нужно автоматизировать этот процесс. Я думал, что сценарий ожидания будет самым простым решением? Однако я не очень разбираюсь в этом.

#!/usr/bin/expect 
#31.09.2015 

set timeout 30 

spawn ssh "[email protected]$ip mkdir -p .ssh" 
expect "password:" 
send "root\r" 
expect "(yes/no)? " 
send "yes\r" 

spawn cat "~/.ssh/id_rsa.pub" | ssh "[email protected]$ip" 'cat >> .ssh/authorized_keys' 
expect "password:" 
send "root\r" 

interact 

Кажется, что работает до первого посылает. Затем, однако, застревает и ждет ввода? (неправильный ожидаемый?)

+0

«Но B удалений его хранение при перезагрузке ", является ли это ожидаемым поведением? – msw

ответ

2

Это часть у вас возникли проблемы с:

spawn ssh "[email protected]$ip mkdir -p .ssh" 
expect "password:" 
send "root\r" 
expect "(yes/no)? " 
send "yes\r" 

После отправки пароля вы ожидаете 30 секунд для появления (yes/no?, но он может не отображаться, если вы ранее подключились к этой машине. Вы хотите условно ожидать, что у/п подскажете:

spawn ssh "[email protected]$ip mkdir -p .ssh" 
expect { 
    "(yes/no)? " { send "yes\r"; exp_continue } 
    "password:" { send "root\r" } 
} 
expect eof 

Эта форма команды ожидать позволяет искать несколько строк одновременно. Если первый вид - «(да/нет)?», Затем отправьте «да» и продолжайте эту команду ожидания. Когда вы увидите «пароль:», отправьте пароль и дайте команде wait.

Возможно, вы захотите изменить вторую команду появления , чтобы оболочка могла обрабатывать конвейер.

set cmd [format {cat "~/.ssh/id_rsa.pub" | ssh "[email protected]%s" 'cat >> .ssh/authorized_keys'} $ip] 
spawn sh -c $cmd 
0

spawn Доза не обрабатывает входное перенаправление так, как вы этого хотите. Простейшим решением является создание отдельного сценария оболочки, который будет выполнять копирование, и пусть expect обрабатывает только пароль.

Это то, что работает для меня:

cat copykey.sh:

#!/bin/bash 
ssh [email protected] "cat >> .ssh/authorized_keys" < ~/.ssh/id_rsa.pub 

cat copykey.expect:

#!/usr/bin/expect -f 
set timeout 30 

spawn ssh [email protected] mkdir -p .ssh 
expect "password:" 
send "password\n" 
expect "$ " 

spawn ~/copykey.sh 
expect "password:" 
send "password\n" 
expect "$ " 
+0

использовал ваш скрипт -> spawn id exp6 не открыт – TheCheatsrichter

+0

убедитесь, что доза '~/.ssh' не существует на удаленной стороне. – mofoe

+0

@TheCheatsrichter: это решило вашу проблему? Если нет, то какое исправление, если вы его нашли? – mofoe

0

нужно дать IP-адрес, имя пользователя, пароль, как аргумент командной строки (Remotelogin.exp)

#!/usr/bin/expect 
    set ip [lindex $argv 0] 
    set user [lindex $argv 1] 
    set password [lindex $argv 2] 
    spawn ssh [email protected]$ip 
    expect { 
    "(yes/no)?" { 

        send "yes\r" 

        expect "password:" 

        send "$password\r" 

       } 

    "password:" { 
        send "$password\r" 
       } 
      } 

`

Пример: ./Remotelogin.exp