Solaris 11 ожидает проверки скрипта для ssh-ключа, который уже установлен? БЕЗ ssh-copy-id ssh-pass

#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. Гениально: работает как шарм.