Ожидать сценарий для развертывания ключа SSH не работает - PullRequest
0 голосов
/ 13 декабря 2018

Цель моего скрипта - развернуть мой ключ ssh через ssh-copy-id на моем сервере 100.

Для достижения этой цели я использую 3 файла.

CreateParam

#!/bin/bash
 while read line;
   do
     IPSrv=`echo $line | cut -d":" -f1`
     Login=`echo $line | cut -d":" -f2`
     Passwd=`echo $line | cut -d":" -f3`
     ./deployssh.sh $IP $Login $Passwd
 done < ServerList.txt

Этот скрипт позволяет мне передавать IP, Login и Passwd в качестве параметров для моего ожидаемого скрипта.

ServerList.txt

Name:@IP:RootLogin:Password
....

Этот файл содержитИмя, адрес, IP-адрес, root-логин и пароль сервера.

deployssh.sh

#!/usr/bin/expect -f
set IPSrv [lindex $argv 1]
set Login [lindex $argv 2]
set Passwd [lindex $argv 3]

spawn ssh-copy-id $IPSrv@$Login -o StrictHostKeyChecking=no
expect -re "password:"
send -- "$Passwd\r"

Предполагается, что этот сценарий ожидания развернет мои ключи ssh на всех серверах, указанных в файле ServerList.Однако на данный момент это не работает.

Мне интересно, что я делаю не так, вы можете помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 13 декабря 2018

Ответ:

  1. Вы используете неправильное имя переменной: IPSvr vs IP
  2. Похоже, у вас есть ошибка "один за другим": при разбореServerList.txt вы хотите, чтобы поля 2, 3, 4

Небольшой обзор кода: вы можете упростить анализ в части оболочки - команда read может разбить строку наполя.В качестве бонуса этот метод позволяет поставить двоеточие в пароле.

#!/bin/bash
while IFS=: read -r hostname IP Login Passwd; do
    ./deployssh "$IP" "$Login" "$Passwd"
done < ServerList.txt

И, как ожидается, извлеките все слова из argv в одну команду и дождитесь завершения команды ssh-copy-id, прежде чемвыход.

#!/usr/bin/expect -f
lassign $argv IPSrv Login Passwd

spawn ssh-copy-id $IPSrv@$Login -o StrictHostKeyChecking=no
expect -re "password:"
send -- "$Passwd\r"
expect eof

Или, поскольку они оба довольно короткие, объедините их, используя среду для передачи переменных, и используйте заключенный в кавычки heredoc, чтобы оболочка не расширила ожиданияпеременные.

#!/bin/bash
export IP Login Passwd
while IFS=: read -r hostname IP Login Passwd; do
    expect <<'END_EXPECT'
        spawn ssh-copy-id $env(IP)@$env(Login) -o StrictHostKeyChecking=no
        expect -re "password:"
        send -- "$env(Passwd)\r"
        expect eof
END_EXPECT
done < ServerList.txt
...