Как избежать запроса «Введите кодовую фразу для ключа», когда я выполняю операцию ssh на удаленном хосте?


45

Я использую ssh на удаленном хосте (linux, fedora) и хочу выполнить там ssh-операцию (git with bitbucket). На этой машине работает ssh-agent,

$ ps -e|grep sh-agent
 2203 ?        00:00:00 ssh-agent

но когда я хочу мерзнуть, мне нужно ввести пароль

$ git pull
Enter passphrase for key '/user/wgong/home/.ssh/id_rsa': 

Примечание: если я работаю на этом компьютере локально, он не попросит меня ввести фразу-пароль


1
Я не использовал его, но есть команда ssh-add, которая, я думаю, используется для подобных вещей
barlop

Ответы:


82

На мой взгляд, лучший способ использования SSH

Перед использованием Git добавьте ваш ключ в ssh-agent

Запустите ssh-agent, если он не запущен:

$ eval `ssh-agent -s`

Добавьте свой закрытый ключ, используя ssh-add

$ ssh-add ~ / .ssh / id_rsa_key
Введите ключевую фразу для /home/user/.ssh/id_rsa_key:
Идентификация добавлена: /home/user/.ssh/id_rsa_key
(/home/user/.ssh/id_rsa_key)

Проверьте, добавлен ли ключ (параметр является строчной буквой L):

$ ssh-add -l
2048 55: 96: 1a: b1: 31: f6: f0: ff: d8: a7: 49: 1a: e5: 4c: 94: 6f
/home/user/.ssh/id_rsa_key (RSA)

Попробуйте подключиться к вашему Git-серверу:

$ ssh git.example.com

Теперь вы можете использовать Git без дополнительных парольных фраз.

Другие способы

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt


но я использовал Git добавить ваш ключ к ssh-agent, тогда как это сделать? спасибо
лилия

@lily Извините, я не понимаю вашего вопроса.
Роман

1
Это решение, которое сработало для меня.
Skatox

2
Как мне сделать это постоянным? Проще говоря .bashrc?
oarfish

1
К вашему сведению, evalэто необходимо, потому что он выводит команды, которые экспортируют переменные среды, такие как SSH_AUTH_SOCK, которые необходимы. unix.stackexchange.com/questions/351725/…
wisbucky

21

Если у вас уже ssh-agentзапущен, вы можете добавить ключ, и вам нужно будет ввести пароль один раз, и только один раз для этого сеанса.

ssh-add ~/.ssh/id_rsa

Вы не говорите, какую операционную систему вы используете, но если это Linux и Gnome, то приложение «Пароли и ключи» (имя CLI:) seahorseможет управлять ими, поэтому они разблокируются при входе в систему (пароль не требуется) , В других средах рабочего стола Linux есть свои менеджеры. Я не уверен, что другие ОС здесь делают.


3

Основная причина запроса пароля состоит в том, что ваш ключ зашифрован, сравните эти два:

  • не зашифрован

    $ head ~/.ssh/id_rsa 
    -----BEGIN RSA PRIVATE KEY-----            
    AIIAogIBAAKCAQEAtOJQ0Z3ZbyzuknnHqn5oMCmNf8zGmERhW+g5Eftf9daZ5qvZ
    
  • зашифрованы

    $ head ~/.ssh/id_rsa 
    -----BEGIN RSA PRIVATE KEY-----    
    Proc-Type: 4,ENCRYPTED
    DEK-Info: AES-128-CBC,A95215C9E9FE00B8D73C58BE005DAD82
    
    ZAzLq/LbHSfOVkXtQz6M6U8yuAx2lIu9bH/k7ksgat92IDjZntRrT1XMpkYtjB+0
    

Таким образом, вы должны сделать одно из следующего:

  1. Если он зашифрован, вы можете попробовать удалить шифрование .
  2. Вы используете неправильный ключ. Если вы хотите использовать другой ключ, укажите другой файл или отредактируйте свой ~/.ssh/configи укажите другой файл идентификации ( IdentityFile).
  3. Запустите, ssh-add -lчтобы получить список всех ваших идентификационных данных (затем сравнить с локальными), и дважды проверить Stash, если вы используете правильные ключи (они существуют в конфигурации Stash).
  4. Если вы знаете ключевую фразу и хотите ее автоматизировать, попробуйте следующий обходной путь:

    PS="my_passphrase"
    install -vm700 <(echo "echo $PS") $PWD/my_pass
    DISPLAY= SSH_ASKPASS=$PWD/my_pass ssh-add - && rm -v my_pass
    

Поиск проблемы:

  1. Дважды проверьте, работает ли ваш SSH-агент ( eval "$(ssh-agent -s)").
  2. Перезапустите git через: GIT_TRACE=1 git pullили с помощью GIT_SSH_COMMAND="ssh -vv"(Git 2.3.0+), чтобы снова отладить вашу команду.
  3. Вы можете попытаться обойти запрос пароля (на который он будет перенаправлен true), но я не думаю, что это поможет. Если это требует, есть причина для этого, и это в основном требуется.

    DISPLAY= SSH_ASKPASS=/bin/true ssh-add
    

2

ssh-addПрограмма запускает агент , который может содержать (и обеспечивать) кодовую фразу. Способ использовать его удаленно - в родительской оболочке вашей интерактивной оболочки (чтобы агент не останавливался).

Вот несколько связанных вопросов:

Теперь ... при удаленном подключении , как правило, ваша команда не входит в систему как таковая, поэтому она не запускается ssh-add. Вы можете обойти это, выполнив скрипт, который

  • начинается ssh-agent
  • начинается ssh-add
  • добавляет ваш ключ
  • запускает команду, которую вы хотите.

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


ssh-addне запускается агент. Он подключается к уже работающему агенту.
Ams

Спасибо - я привык делать это в отдельных скриптах и ​​пропустил пропущенную часть.
Томас Дики

0

Вы можете легко удалить ключевую фразу вашего ключа, используя следующую команду

ssh-keygen -p

В первом приглашении введите путь к файлу (или нажмите Enter, чтобы изменить значение по умолчанию). Во втором приглашении введите старую фразу-пароль. Следующее приглашение, просто нажмите Enter, чтобы снять пароль.

Похоже, это самый простой способ!


0

Вы все равно получите запрос пароля для расшифровки закрытого ключа, даже если он загруженssh-agent до тех пор, пока соответствующий открытый ключ SSH не будет добавлен в удаленный ~/.ssh/authorized_keys.

Воспроизвести:

# We are about to ssh to localhost, therefore, unauthorized everyone.
$ rm ~/.ssh/authorized_keys

$ eval $(ssh-agent)
# Agent pid 9290

$ ssh-add
# Enter passphrase for /home/uvsmtid/.ssh/id_rsa: 
# Identity added: /home/uvsmtid/.ssh/id_rsa (/home/uvsmtid/.ssh/id_rsa)

$ ssh localhost
# Enter passphrase for key '/home/uvsmtid/.ssh/id_rsa':
# uvsmtid@localhost's password:
  # NOTE: See password prompt for private key
  #       (and only then prompt for remote login).
  #       Why? Isn't the private key is already loaded by `ssh-add`?

$ ssh-copy-id localhost
$ ssh localhost
  # NOTE: No password for private key anymore.
  #       The key is served by `ssh-agent`.

Достаточно запутанно. Пароль удаленного входа SSH будет достаточно в этом случае.

Я могу предположить, что это предотвращает добавление вашего открытого ключа (который связан с зашифрованным закрытым ключом) без знания пароля шифрования для соответствующего закрытого ключа. В любом случае это однократная процедура удаленного входа.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.