Вот 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