Сценарий Bash, кажется, никогда не завершается

0

Я пишу скрипт, который должен установить права доступа к файлу с закрытым ключом и добавить его в 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. Сценарий, по-видимому, никогда не завершается, последним наблюдаемым эхо-сообщением является «Права доступа к закрытому ключу установлены».

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

С уважением

Maciek
источник

Ответы:

1

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

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

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

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

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

gmoshkin
источник
1
execне запускает новый процесс, он заменяет текущую программу в текущем процессе новой программой в том же процессе. Таким образом exec ssh-agent bash, строки в скрипте не будут выполняться, даже если ssh-agentпрограмма завершится.
8bittree