У меня есть вопрос о различных способах, значениях и ошибках с использованием SSH-агента.

Я использую Ubuntu 14.04 LTS в Amazon Web Services.

Каковы различия между различными способами использования SSH-агента?

Это первое:

eval 'ssh-agent -s'
ssh-add id_rsa

Чтобы проверить, является ли эта функция шага, я использую команду ssh localhost чтобы проверить, не запрашивает ли соединение пароль.

Однако в других случаях, когда я использовал эту команду, мы получали отказанное соединение, или соединение запрашивало у нас кодовую фразу. Затем, чтобы решить эту проблему, я нашел другой способ:

eval "$(ssh-agent)"
ssh-add id_rsa

Тем не менее, иногда мы снова получали отказанное соединение, или соединение запрашивало у нас пароль, но я нашел третий способ решения проблемы:

exec ssh-agent bash
ssh-add id_rsa

Проблема в том, что я не понимаю причину, потому что иногда мне приходится использовать один или другой - с тем же дистрибутивом (Ubuntu 14.04 LTS) в одном сервисе (AWS). Какая разница между ними?

1 ответ1

2

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

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