Ожидается, что сценарий завершится ошибкой, если каталог существует - PullRequest
0 голосов
/ 01 мая 2020

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

Когда я пытаюсь создать каталог на целевом сервере, весь скрипт завершается с ошибкой:

    authorized_keys                                                                                                             100%  408   478.0KB/s   00:00
send: spawn id exp8 not open
    while executing
"send "$password\r""
    (procedure "check_host" line 5)
    invoked from within
"check_host $line"
    ("while" body line 2)
    invoked from within
"while {[gets $fp line] != -1} {
    check_host $line
}"
    (file "./transfer_keys.sh" line 29)

Это мой скрипт:

#!/usr/bin/expect

set timeout 20
set user my_user_name
set password my_pass
set auth_keys /home/my_user_name/.ssh/authorized_keys
set ssh_dir /home/my_user_name/.ssh

proc check_host {hostname} {
    global user password auth_keys ssh_dir
    spawn scp $auth_keys $user@$hostname:
    expect "password"
    send "$password\r"
    spawn ssh $user@$hostname
    expect "password"
    send "$password\r"
    expect "$ "                ;# adjust to suit the prompt accordingly
    send "mkdir $ssh_dir\r"
    send "chmod 700 .ssh\r"
    send "mv authorized_keys $ssh_dir\r"
    send "chmod 600 $ssh_dir/authorized_keys\r"
    send "exit\r"
    expect eof

}


set fp [open host.txt r]
while {[gets $fp line] != -1} {
    check_host $line
}
close $fp

Если я удаляю каталог ~/.ssh на целевом сервере и запускаю его снова, он работает нормально!

Как создать каталог ~/.ssh только на целевом сервере, если он не существует?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

За @glennjackman вы можете воспользоваться ssh-copy-id для копирования ключей publi c на другой сервер.


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

ssh -o BatchMode=yes $host : || echo "host $host requires password login"
1 голос
/ 01 мая 2020

scp не будет запрашивать пароль, если вы уже скопировали ключи авторизации, поэтому expect "password" будет отключен через 20 секунд. Когда будет выполнено следующее send "$password\r", scp будет завершено, и соединение будет закрыто, что приведет к ошибке.

Обычно expect используется не только для сопоставления с шаблоном, но и для указания команды, которая будет выполняться, если она совпадает. Просто объедините ожидание и отправку следующим образом:

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

Тогда отправка будет выполнена только в том случае, если будет замечено приглашение. Вы также должны добавить expect eof для этой команды scp, чтобы очистить соединение.

...