Я пишу скрипт, который должен установить права доступа к файлу с закрытым ключом и добавить его в ssh, чтобы его можно было использовать позже:

echo "Setting up the private SSH key..."

if [[ $EUID > 0 ]]; then
  echo "This script needs to be run as root/sudo"
  exit 1
fi

#CmdLine Argument Parsing
for i in "$@"; do
    case $i in
        -k=*|--key=*)
        KEY="${i#*=}"
        ;;
    esac
done

if [ ! -e "$KEY" ]; then
    echo "Error: The private key file $KEY does not exist"
    exit 1
else
    echo "Private key found..."
fi

sudo chmod 600 $KEY
echo "Private key permissions set..."

exec ssh-agent bash
eval `ssh-agent -s`

echo "SSH Agent restarted..."
sudo ssh-add $KEY
echo "SSH Key added..."
echo "...done"

Сценарий выполняется с помощью: sudo bash ./myscript.sh --key=~/.ssh/mykey-rsa . Сценарий, по-видимому, никогда не завершится, последним наблюдаемым эхом было «Установлены разрешения для закрытого ключа ...».

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

С уважением

1 ответ1

1

Строка exec ssh-agent bash запускает новый процесс, который ожидает ввода пользователя. Команды, следующие за этой строкой, не будут выполняться, пока не завершится процесс ssh-agent .

Если вы хотите, чтобы ssh-agent bash выполнял некоторые команды, вы должны передать их по стандартному входному каналу, например так:

echo 'echo "hello world"' | ssh-agent bash

Таким образом, ssh-agent выполнит команды, переданные ему из stdin, и завершит работу. И следующие команды будут выполнены позже.

РЕДАКТИРОВАТЬ: @ 8bittree правильно отметил в комментарии, что exec фактически не запускает новый процесс, а вместо этого заменяет текущую программу в текущем процессе новой программой, поэтому строки после этой команды не будут выполняться ни при каких обстоятельствах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .