Как сделать ssh-добавить пароль для чтения из файла?

Я пытаюсь добавить ключ ssh-agent и хочу!--1--> чтение пароля из файла с помощью. Как это возможно?

Как автоматизировать этот процесс из сценария оболочки?

3 ответов


в зависимости от вашего дистрибутива и версии ssh-add вы можете использовать или не использовать -p опция ssh-add, которая читает парольную фразу из stdin таким образом:

cat passfile | ssh-add -p keyfile

если это не работает, вы можете использовать ожидал, инструмент Unix, чтобы сделать интерактивные приложения неинтерактивными. Вам придется установить его из диспетчера пакетов.

я написал инструмент для вас в expect. Просто скопируйте содержимое в файл с именем ssh-add-pass и установить исполняемые разрешения на него (chmod +x ssh-add-pass). Вы также можете скопировать его в /usr /bin или/usr/local / bin для доступа из поиска $PATH.

#!/bin/bash

if [ $# -ne 2 ] ; then
  echo "Usage: ssh-add-pass keyfile passfile"
  exit 1
fi

eval $(ssh-agent)
pass=$(cat )

expect << EOF
  spawn ssh-add 
  expect "Enter passphrase"
  send "$pass\r"
  expect eof
EOF

использование просто:ssh-add-pass keyfile passfile


вот некоторые обходные пути для систем, не поддерживающих -p:

$ PASS="my_passphrase"
$ install -vm700 <(echo "echo $PASS") "$PWD/ps.sh"
$ cat id_rsa | SSH_ASKPASS="$PWD/ps.sh" ssh-add - && rm -v "$PWD/ps.sh"

здесь ps.sh в основном ваш скрипт печатает вашу парольную фразу. См.: man ssh-add.

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


похоже на ответ kenorb, но не сохраняет секрет в файле:

$ SSH_ASKPASS=/path/to/ssh_give_pass.sh ssh-add $KEYFILE <<< "$KEYPASS"

где ssh_give_pass.sh есть:

#!/bin/bash
# Parameter  passed to the script is the prompt text
# READ Secret from STDIN and echo it
read SECRET
echo $SECRET

Если у вас есть секрет в файле $ KEYPASS, сначала прочитайте его в переменную с

KEYPASS=`cat $KEYPASSFILE`

также убедитесь, что ssh_give_pass.sh не редактируется неавторизованными пользователями - будет легко регистрировать все секреты, переданные через скрипт.