Как избежать запроса парольной фразы каждый раз, когда я нажимаю на Bitbucket

217

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

$ cat .hg/hgrc 
[paths]
default = ssh://hg@bitbucket.org/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://hg@bitbucket.org/tshepang/bloog
searching for changes
...
tshepang
источник

Ответы:

337

Вам нужно использовать агент ssh. Краткий ответ: попробуйте

$ ssh-add

перед нажатием. Введите ваш пароль, когда его спросят.

Если вы еще не используете агент ssh, вы получите следующее сообщение:

Could not open a connection to your authentication agent.

В этой ситуации вы можете запустить один и настроить свою среду таким образом

eval $(ssh-agent)

Затем повторите ssh-addкоманду.

Стоит взглянуть на справочную страницу агента ssh .

jmtd
источник
2
Какой смысл evalвы могли бы просто напечатать ssh-agent?
Джеймс МакМахон
4
Он отображает некоторые команды, которые позволяют вам использовать его, и не выполняет их для вас; evalделает извинения.
tshepang
Не относится к исходному вопросу, но если у вас будут проблемы с GitHub, Bitbucket и т. Д., Убедитесь, что вы используете URL-адрес git / ssh, а не http, который будет запрашивать имя пользователя + пароль.
Чехословакия
И если у вас нет ключа по умолчанию или вы хотите добавить кратные,ssh-add /path/to/key
hoosierEE
46

Способ решить это с помощью ssh-agentи ssh-add:

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

После этого фраза-пароль сохраняется для текущего сеанса. и больше не будет спрашивать

Stefano
источник
7
Большинство людей вообще не хотят, чтобы их прослушивали из-за парольных фраз.
Connexo
26

Я использую Keychain для управления ключами SSH. Он также доступен в Debian и, вероятно, в Ubuntu с

apt-get install keychain

Вот страница пакета цепочки для ключей Debian . Как видите, проект не очень активный, но у меня работает. Я также прокомментировал немного об этом в другом ответе здесь

Фахим Митха
источник
2
// Это сработало для меня. Это намного лучше, чем ssh-agent, так как мне не нужно вводить пароль ssh каждый раз, когда я открываю терминал .
Натан Басанезе
@NathanBasane вы говорите, что с помощью цепочки для ключей вам не нужно вводить пароль ключа SSH каждый раз, когда вы открываете терминал? Как вы это настраиваете? потому что связка ключей продолжает запрашивать пароль каждый раз, когда я открываю терминал, только в первый раз, когда я открываю его после загрузки, хотя, но все же. Я не хочу вводить парольную фразу каждый раз.
m4l490n
@ m4l490n Нет, если вы используете связку ключей, вам не нужно вводить пароль ключа ssh каждый раз, когда вы открываете терминал. Но вам нужно ввести его один раз после загрузки. Фраза-пароль не сохраняется на диск - это небезопасно.
Фахим Митха
Для меня он спрашивает каждый раз, когда я вхожу в систему (у меня есть git-репозиторий + ключи ssh на удаленном сервере, и каждый раз, когда я делаю "git pull", мне нужно ввести фразу-пароль)
Martin Thoma
@MartinThoma Это выглядит неправильно. Убедитесь, что вы правильно настроили .ssh. В частности, правильно ли настроена ваша оболочка? Если это все еще не работает для вас, и вы не можете понять это, вы можете задать вопрос.
Фахим Митха
13

Создайте (или отредактируйте, если он существует) следующий файл ~ / .ssh / config:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
Несс-EE
источник
Но я использую разные пары ключей для каждого сервиса ...
connexo
@connexo вы можете заменить подстановочный знак «звездочка» вашим индивидуальным именем хоста, а «id_rsa» - соответствующим личным ключом
ness-EE
1
Мне нужно было добавить IgnoreUnknown AddKeysToAgent,UseKeychainчуть выше UseKeychain yes.
соотношение
1
Я получаю эту ошибку: «Неверная опция конфигурации: usekeychain» в строке «UseKeychain yes».
m4l490n
@ m4l490n: похоже, что UseKeychainопция была добавлена ​​в OpenSSH 7.1p2 (2016-02-28). Может быть, у вас есть предыдущая версия. openssh.com/txt/release-7.2
Chus
6

Для удобства оптимальный метод - это сочетание ответов jmtd и Faheem .

Использование ssh-agentодного означает, что ssh-agentдля каждого нового терминала, который вы открываете, необходимо создавать новый экземпляр . keychainпри инициализации запросит пароль для закрытого ключа (ключей) и сохранит его. Таким образом, ваш закрытый ключ защищен паролем, но вам не придется вводить пароль снова и снова.

Вики Arch рекомендует инициализацию брелки от /etc/profile.d/или вашего профиля оболочки, таких как .bash_profileили .bashrc. Это имеет недостаток в том, что он инициализирует вашу цепочку для ключей, как только вы открываете терминал.

Более гибкий подход заключается в сочетании keychainс конкретным tmuxсеансом. Итак, в .bash_profile:

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi

... и тогда это просто случай запуска защищенного tmuxсеанса по мере необходимости (запускается из связки ключей):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add

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

jasonwryan
источник
Как мне заставить это работать на удаленной машине? Я изменил второй скрипт для проверки $ SSH_CLIENT и, если он существует, не выполняйте urxvtc, просто tmux. Это работает, но проблема в части .bash_profile. При первом входе в систему появляется сообщение «сервер не найден: соединение отказано», что является выводом «tmux ls». Затем, когда я выполняю второй сценарий, tmux либо запускает новый сеанс, либо присоединяется к существующему, но подсказка цепочки для ключей отсутствует. Затем, когда я выхожу из сеанса, приглашение цепочки для ключей там ждет.
Jonyamo
Я обновил ответ, чтобы отключить вывод tmux, если сеанса нет.
Джейсонвриан
Спасибо, но это все еще не решило проблему с цепочкой для ключей. tmux создает новый сеанс, но сразу переходит к любому пустому приглашению. Только когда я выхожу из сеанса tmux, я вижу подсказку цепочки для ключей, запрашивающую мою фразу-пароль.
Jonyamo
Я думаю, что я должен прекратить говорить цепочку для ключей, так как цепочка для ключей выполняется только в .bash_profile. Проблема заключается в выполнении ssh-add. Хотя, если я запускаю ssh-add вручную после создания сеанса tmux, это работает.
Jonyamo
1
Пропустите второй скрипт и просто начните защищенный сеанс tmux с этого .profile- таким образом вы получите подсказку для ключей, как только войдете в систему.
Джейсонвриан
0

Вы можете использовать sshpass:

$ sudo apt-get install sshpass
$ sshpass -p 'password' ssh username@server

Вам просто нужно добавить, sshpass -p yourpassphraseпрежде чем добавить вашу обычную sshкоманду.

Belka
источник
2
Это звучит как действительно глупая идея. Разве это не сделает ваш пароль открытым текстом в истории вашей оболочки?
Connexo
Точно, но разве вы не должны защищать свой сеанс паролем?
Белка
1
Даже если вы это делаете, как часто рядом с вами сидит коллега и помогает вам / учится у вас?
Connexo