Вот 2 правила для начала:
Если вы явно не используете TCSH или тому подобное, вы будете использовать Bash, поэтому аргумент -s является избыточным.
В Bash eval не заботится об уровне цитирования, это означает, что eval "1 2" и eval 1 2 будут делать одно и то же. Однако кавычки все еще изменяют интерпретацию символов внутри:
print_args () { while [ $# -gt 0 ]; do echo "$1"; shift; done; }
eval "print_args 1 '2 3' 4" # prints "1", "2 3", "4"
eval print_args 1 '2 3' 4 # prints "1", "2", "3", "4"
Имея это в виду, вот что они делают:
eval 'ssh-agent'
eval ssh-agent
В любом случае строка ssh-agent анализируется вашей оболочкой (Bash) в команду ssh-agent и выполняется. Эта команда запускает ssh-agent в фоновом режиме и выводит некоторые настройки на стандартный вывод, такие как SSH_AUTH_SOCK=... Однако эти параметры не интерпретируются вашей оболочкой, что, в свою очередь, означает, что оболочка не будет знать, как связаться с агентом. Фактически, команда ssh-add , вероятно, выдаст ошибку: Error connecting to agent: Connection refused . По этой причине эта команда никогда не бывает полезной. Возможно , вы имели в виду , чтобы заменить одиночные кавычки ' обратными кавычками? (К сожалению, я не знаю, как вернуть кавычки, чтобы они отображались здесь во фрагментах встроенного кода.) Если так, читайте дальше.
eval "$(ssh-agent)"
eval $(ssh-agent)
eval "`ssh-agent`"
eval `ssh-agent`
В любом случае Bash сначала выполняет подстановку команд. Таким образом, он запускает ssh-agent , запускает программу ssh-agent в фоновом режиме и выводит настройки типа SSH_AUTH_SOCK=... Теперь начинается замена, поэтому Bash заменяет $(ssh-agent) своим выводом SSH_AUTH_SOCK=... Во-вторых, eval запускается, но теперь по тем промежуточным командам: eval SSH_AUTH_SOCK=... Таким образом, настройки, выводимые ssh-agent , импортируются в работающую оболочку, поэтому ssh-add будет знать, как найти процесс ssh-agent . Обычно это то, что вы хотите сделать.
exec ssh-agent bash
Это заменит вашу текущую оболочку на ту, в которой настройки, выведенные ssh-agent , уже включены. Однако это разрушает любые другие настройки оболочки, потому что новая оболочка не будет иметь их. Это хороший способ добавить настройки из ssh-agent , но только если вам не нужна текущая оболочка.
Учитывая все вышесказанное, не должно быть никакой разницы в том, как последующие команды ssh user@server работают между вариантами 2 и 3. Какие бы различия вы ни увидели ("иногда"), они связаны не с ssh-agent или настройками оболочки, а с сетевыми условиями.
Кроме того, чтобы сообщить ssh о подключении, не пытаясь использовать аутентификацию по паролю, попробуйте одно из:
ssh user@server -o BatchMode=true
ssh user@server -o PreferredAuthentications=publickey