Автоматизация ssh — добавление закрытых ключей с общим паролем

#bash #ssh #automation

#bash #ssh #автоматизация

Вопрос:

Я искал, но решения, которые я нашел, были сосредоточены только на использовании одного ключевого файла. Предположим, у меня есть набор закрытых ключей, для которых требуется один и тот же пароль (и что я доволен такой настройкой с точки зрения безопасности).

Как я мог бы создать bash скрипт, который считывает пароль stdin и вызывает ssh-add для каждого из закрытых ключей, используя один и тот же пароль?

У меня нет -p доступных для ssh-add .

Я пытаюсь избежать записи пароля в файл (даже если временный). Я пришел с этим до сих пор, но я не уверен, как поступить или возможно ли это:

 #!/bin/bash

if [ $(ps ax | grep [s]sh-agent | wc -l) -gt 0 ] ; then
    printf "> 'ssh-agent' is running.n"
else
    printf "> 'ssh-agent' needs to be running. Exiting.n"
    exit 0
fi

unset password
prompt="> Please input your password: "
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $'' ]]
    then
         break
    fi
    prompt='*'
    password ="$char"
done

printf "n> Adding key files...n"

## declare an array variable
declare -a arr=("key-1.ppk" "key-2.ppk" "key-3.ppk")

## now loop through the above array
for i in "${arr[@]}"
do
   #echo "$i"
   ssh-add "$i" < <(echo "$password")   

done
  

Также попробовал следующее, чтобы перейти в stdin :

 echo $password | ssh-add "$i"
  

Я также думал об использовании этого в цикле:

 {
/usr/bin/expect << EOF
  spawn ssh-add $HOME/.ssh/$i
  send "$passwordr"
  expect eof
EOF
}
  

Но тогда он попросит меня ввести пароль для каждого отдельного ключа, что противоречит цели автоматизации.
Если нет способа для одного spawn ssh-add получить один пароль через expect (только одно приглашение) и добавить к нему более одного ключа?

Ответ №1:

Если у вас одинаковый пароль для всех ключей, вы можете передать несколько ключей ssh-add , и он запрашивает пароль только один раз и добавляет все эти ключи в ssh-agent.

например:

 $> arr=("id_ecdsa" "new_test_key")
$> ssh-add ${arr[@]}
Enter passphrase for id_ecdsa:
Identity added: id_ecdsa (test_user@host_test)
Identity added: new_test_key (test_user@host_test)

$> ssh-add -l
256 SHA256:urYhdMK9UZyLl p8cC7ehdImYfvsmtJFtQmESWoczmM test_user@host_test (ECDSA)
256 SHA256:53obuQkRzLGW5iUJdmFPNvSK1quUSlCi4gbQkKsJinY test_user@host_test (ECDSA)

  

Комментарии:

1. Спасибо за информацию. Возможность ssh-add получать их в виде массива, подобного этому, упрощает задачу.

Ответ №2:

Пароль может быть передан через переменную среды :

 #!/usr/bin/env bash
  
read password

ssh_askpass=$HOME/.ssh_askpass

echo 'echo "$password"' > $ssh_askpass; chmod 700 $ssh_askpass

ppk=key-1.ppk
export password
SSH_ASKPASS="$ssh_askpass" ssh-add $ppk < /dev/null

rm -f "$ssh_askpass"
  

Комментарии:

1. Хотя это полезно, у него есть неудобства при записи на диск (конечно, я не указал это ограничение в своем вопросе). Проголосуйте за ваш ответ, поскольку он полезен.

2. @Blitzkoder, обновлено, теперь пароль передается переменной enviroenment.