#shell #ssh #solaris #expect
#оболочка #ssh #solaris #ожидайте
Вопрос:
У меня есть следующий сценарий ожидания на сервере Solaris 11.4. Поскольку Solaris 11 не поставляется с ssh-copy-id или ssh-pass. Я хочу создать скрипт для автоматизации копирования моего ssh-ключа на более чем 100 серверов. После небольшого изучения Google expect кажется единственным вариантом — если только кто-то не знает лучше?
Я могу заставить скрипт скопировать ключ на целевой сервер, но мне нужно, чтобы скрипт не копировал, если ключ уже установлен.
Единственный способ, которым я могу это проверить, — это если ssh-логин проходит сразу, не запрашивая пароль. Моя проблема в том, как мне проверить наличие пустой подсказки? .
Если ключ не установлен, я получаю запрос пароля — тогда я могу использовать expect для ввода пароля и копирования ключа. Я пробовал тестировать на «» (пустой), но, похоже, все совпадает. Любой совет очень ценится.
#!/usr/bin/expect
set timeout 1200
set user [lindex $argv 0]
set host [lindex $argv 1]
set pass [lindex $argv 2]
set sshkeyfile [open ~/.ssh/id_rsa.pub r]
set sshid [read $sshkeyfile]
close $sshkeyfile
spawn ssh $user@$host "mkdir -m 700 ~/.ssh ; echo " $sshid" >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys"
expect {
"continue" { send "Yesn" ; exp_continue }
"Password" { send "$passr"; interact}
"" { send "exitn" ; exit 0 } # Exit if not asked for "continue/Password"
}
Комментарии:
1. Как выглядит приглашение вашей оболочки после успешного входа в систему?
Ответ №1:
Как насчет этого: ssh без команды; если пароль виден, задайте логическую переменную; когда вы нажмете приглашение оболочки, если переменная имеет значение true, добавьте к authorized_keys
#!/usr/bin/expect
set timeout 1200
lassign $argv user host pass
set sshkeyfile [open ~/.ssh/id_rsa.pub r]
set sshid [read -nonewline $sshkeyfile]
close $sshkeyfile
set sentPassword false
set prompt {$ $} ;# shell prompt ends with "dollar space"
spawn ssh $user@$host
expect {
"continue" {
send "Yesr"
exp_continue
}
"Password" {
set sentPassword true
send "$passr"
exp_continue
}
-re $prompt
}
if {$sentPassword} {
send "mkdir -p -m 700 ~/.ssh ; echo "$sshid" >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keysr"
expect -re $prompt
}
send "exitr"
expect eof
другие изменения:
lassign
для обработки аргументов командной строки в одной командеread -nonewline
чтобы исключить завершающую новую строку из открытого ключаmkdir -p
чтобы предотвратить сообщение об ошибке, если каталог уже существует.
Комментарии:
1. Гениально: работает как шарм.