#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.