Как я могу запустить ssh-add автоматически, без подсказки пароля?

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

Я знаю, что есть способ добавить некоторые строки в файл bash_profile, но мне все равно нужно вводить пароль каждый раз при перезагрузке /входе на конкретный компьютер.

, если [-z "$ SSH_AUTH_SOCK"]; тогда
    eval `ssh-agent -s`
    SSH-добавить
фи
200 голосов | спросил zdun8 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 16 Sep 2013 14:31:36 +0400 2013, 14:31:36

14 ответов


284

Это типичный пример компромисса между безопасностью и удобством. К счастью, есть несколько вариантов. Наиболее подходящее решение зависит от сценария использования и желаемого уровня безопасности.

ssh-key с парольной фразой, ssh-agent

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

ssh-key с парольной фразой, ssh-agent

Добавление следующего в ~ /.bash_profile автоматически запустит ssh-agent и загрузит ssh-ключи (ключи) при входе в систему:

, если [-z "$ SSH_AUTH_SOCK"]; тогда
  eval `ssh-agent -s`
  SSH-добавить
фи

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

Чтобы убить ssh_agent при выходе из системы, добавьте следующее в ~ /.bash_logout

, если [-n "$ SSH_AUTH_SOCK"]; тогда
  eval `/usr /bin /ssh-agent -k`
фи

или следующее: ~ /.bash_profile

trap 'test -n "$ SSH_AUTH_SOCK" & & & & & eval `/usr /bin /ssh-agent -k` '0

Создание нескольких экземпляров ssh-agent можно избежать, создав постоянный коммуникационный сокет для агента в фиксированном месте в файловой системе, например, в Ответ Collin Anderson . Это улучшение по сравнению с повторением экземпляров нескольких агентов, однако, если явно не убить, дешифрованный ключ все еще остается в памяти после выхода из системы.

На настольных компьютерах, ssh-агентах, включенных в среду рабочего стола, таких как Gnome Keyring SSH Agent , может быть лучшим подходом, поскольку, как правило, их можно заставить запрашивать парольную фразу при первом использовании ssh-ключа во время сеанса входа в систему и хранить дешифрованный закрытый ключ в памяти до конца сеанса.

ssh-key с парольной фразой, ssh-ident

ssh-ident это утилита, которая может управлять ssh-agent от вашего имени и загружать удостоверения по мере необходимости. Он добавляет ключи только один раз, когда они необходимы, независимо от того, сколько терминалов, сеансов ssh или входа, которые требуют доступа к ssh-agent. Он также может добавлять и использовать другой агент и другой набор ключей в зависимости от подключаемого хоста или из каталога ssh. Это позволяет изолировать ключи при использовании перенаправления агентов с разными хостами. Он также позволяет использовать несколько учетных записей на сайтах, таких как GitHub.

Чтобы включить ssh-ident, установите его и добавьте следующий псевдоним в свой ~ /bash_profile:

alias ssh = '/path /to /ssh-ident'

ssh-key с парольной фразой, keychain

keychain - небольшая утилита, которая управляет ssh-agent от вашего имени и позволяет ssh-agent оставаться включенным при завершении сеанса входа в систему. При последующих логинах, keychain будет подключаться к существующему экземпляру ssh-agent. На практике это означает, что кодовая фраза должна вводиться только во время первого входа после перезагрузки. При последующих входах используется незашифрованный ключ из существующего экземпляра ssh-agent. Это также может быть полезно для разрешения аутентификации RSA /DSA без пароля в запросах cron без ssh-ключей без пароля.

Чтобы включить keychain, установите его и добавьте что-то вроде следующего в ~ /.bash_profile:

eval `keychain --agents ssh --eval id_rsa`

С точки зрения безопасности ssh-ident и keychain хуже, чем экземпляры ssh-agent, ограниченные временем жизни конкретного но они предлагают высокий уровень удобства. Чтобы улучшить безопасность keychain, некоторые люди добавляют опцию - clear к их вызову keychain ~ /.bash_profile. Выполняя эту кодовую фразу, необходимо повторно ввести логин, как указано выше, ноЗадания cron по-прежнему будут иметь доступ к незашифрованным ключам после выхода пользователя из системы. keychain страница wiki содержит дополнительную информацию и примеры.

ssh-key без кодовой фразы

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

ssh-key с парольной фразой, ssh-agent, передача парольной фразы ssh-add из сценария

Хотя может показаться простой идеей передать кодовую фразу в ssh-add из сценария, например. echo "passphrase \ n" | Â ssh-add, это не так страшно, как кажется ssh-add не читает парольную фразу из stdin, но открывает /dev /tty для чтения .

Это может быть ожидать , инструмент для автоматизации интерактивных приложений. Ниже приведен пример скрипта, который добавляет ssh-ключ с использованием парольной фразы, хранящейся в скрипте:

#! /usr /bin /expect -f
spawn ssh-add /home/user/.ssh/id_rsa
ожидать "Введите кодовую фразу для /home/user/.ssh/id_rsa:"
отправить «passphrase \ n»;
ожидать "Добавлена ​​идентификация: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
взаимодействовать

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

ответил Thomas Nyman 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 16 Sep 2013 16:21:39 +0400 2013, 16:21:39
73

Добавьте это в свой ~ /.bashrc:

если [! -S ~ /.ssh /ssh_auth_sock]; тогда
  eval `ssh-agent`
  ln -sf "$ SSH_AUTH_SOCK" ~ /.ssh /ssh_auth_sock
фи
экспорт SSH_AUTH_SOCK = ~ /.ssh /ssh_auth_sock
ssh-add -l> /dev /null || SSH-добавить

При первом входе в систему после каждой перезагрузки необходимо только ввести пароль. Он будет продолжать использовать один и тот же ssh-agent, пока он будет работать.

ответил Collin Anderson 20 J000000Monday15 2015, 19:48:40
9

Не тесно связан с вопросом OP, но он может быть полезен другим: поскольку 7.2.0 ssh (1) имеет возможность, позволяющую добавить ключ к ssh-agent при первой аутентификации; параметр AddKeysToAgent и может быть установлен в yes, no, ask или confirm code>, systemwide или в вашем личном файле .ssh /config.

Ссылка: https://www.openssh.com/txt/release-7.2

ответил Guilherme Salazar 15 +03002016-10-15T09:26:01+03:00312016bEurope/MoscowSat, 15 Oct 2016 09:26:01 +0300 2016, 09:26:01
4

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

, чтобы кэшировать разблокированные ключи, очевидно, необходимо разблокировать эти ключи. для разблокировки ключей, заблокированных парольной фразой, очевидно, необходимо знать эти фразы. любой метод, который не требует авторизации от человека (например, «набрав пароль»), не только сделает вашу систему небезопасной, но и сделает всю цель ssh-agent бессмысленной.

, сказав все это, вы можете просто использовать ssh-ключи, которые не защищены паролем (нажмите [Enter], когда вас попросят ввести пароль во время генерации ключа). поскольку пароль отсутствует, ssh-agent не нужно запрашивать у вас одно, чтобы (не) кэшировать его.

ответил umläute 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 16 Sep 2013 15:08:48 +0400 2013, 15:08:48
4

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

Скорее, я рекомендую написать скрипт, который открывает секцию sub-shell ssh-agent, причем все ключевые файлы автоматически добавляются и вызывается при необходимости для использования ssh. Если вы можете принять это, прочитайте дальше.

У вас будет два варианта:

  1. Удалите все парольные фразы для ваших ключей, у которых слабая безопасность , если ваши ключевые файлы украдены. (таким образом не рекомендуется )

  2. Используйте ту же ключевую фразу для своих ключей. Затем, когда вы ssh-add keyfile1 keyfile2 ..., вам нужно будет только ввести парольную фразу один раз, в раздел.

В обоих случаях вы можете написать такой файл сценария «ssh_keys_section.sh», как показано ниже:

#! /Bin /Баш
# Этот скрипт запускает ssh-agent на под-оболочке и автоматически ssh-добавлять все файлы ключей сразу.
# Этот агент заканчивается, когда вы вводите `exit` для закрытия суб-оболочки.
exec ssh-agent bash -c "ssh-add /path /to /keyfile1 /path /to /keyfile2 ...; exec bash"

Примечания:

  • Команда для изменения или удаления кодовой фразы: ssh-keygen -p -f keyfile
  • Внутри суб-оболочки вы можете даже развить больше терминалов, которые используют одни и те же разблокированные ключи, используя, возможно, команду типа /path /to /yourterminal & (зависит от ОС)
ответил Johnny Wong 11 FebruaryEurope/MoscowbWed, 11 Feb 2015 06:34:28 +0300000000amWed, 11 Feb 2015 06:34:28 +030015 2015, 06:34:28
2
если [! -S $ {HOME} /. Ssh /ssh_auth_sock]; тогда
  eval $ (ssh-agent)
  ln -sf "$ {SSH_AUTH_SOCK}" $ {HOME} /. ssh /ssh_auth_sock
фи
export SSH_AUTH_SOCK = $ {HOME} /. ssh /ssh_auth_sock

ssh_keys = $ (find -E ~ /.ssh -type f -regex '. * (rsa $ | pem)')
ssh_agent_keys = $ (ssh-add -l | awk '{key = NF-1; print $ key}')

для k в "$ {ssh_keys}"; делать
    для l в "$ {ssh_agent_keys}"; делать
        если [[ ! "$ {k}" = "$ {l}"]]; тогда
            ssh-add "$ {k}"> /dev /null 2 ​​& 1
        фи
    сделанный
сделанный
ответил Diego Roberto dos Santos 27 12017vEurope/Moscow11bEurope/MoscowMon, 27 Nov 2017 00:36:25 +0300 2017, 00:36:25
1
SSH_ENV = "$ HOME /.ssh /окружающая среда"

function start_agent {
     echo "Инициализация нового агента SSH ..."
     /usr /bin /ssh-agent | sed 's /^ echo /# echo /'> "$ {SSH_ENV}"
     эхо удалось
     chmod 600 "$ {SSH_ENV}"
     , "$ {SSH_ENV}"> /DEV /нуль
     /USR /бен /SSH-добавить;
}

# Исходные настройки SSH, если применимо

если [-f "$ {SSH_ENV}"]; тогда
     , "$ {SSH_ENV}"> /DEV /нуль
     #ps $ {SSH_AGENT_PID} не работает под управлением
     ps -ef | grep $ {SSH_AGENT_PID} | grep ssh-agent $> /dev /null || {
         start_agent;
     }
еще
     start_agent;
фи

Предоставление кредита здесь: https://www.cygwin.com/мл /Cygwin /2001-06 /msg00537.html

Это решение также одобрено здесь: http://mah.everybody.org/docs/ssh

ответил steampowered 9 Maypm16 2016, 19:35:26
1

Решение для единого входа для SSH может привести меня к pam_ssh .

Согласно этой статье , концепция такова:

  

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


  

На самом деле это довольно просто, вы просто создаете пару открытых /закрытых ключей для аутентификации себя на других компьютерах, а затем PAM запускает агент для загрузки ваших ключей после входа в систему, предоставляя одно решение для входа в систему все ваши удаленные машины. Это руководство проведет вас через настройку.

Я не подтвердил, что это действительно сработает.

ответил Michael 22 AM00000010000004831 2017, 01:57:48
1

Ниже приведено обходное решение для автоматизации вашей кодовой фразы SSH.

  1. Создайте однострочный скрипт, который печатает вашу кодовую фразу на стандартный вывод, например:

    echo 'echo MY_SSH_PASSWORD'> ~ /.print_ssh_password & & & chmod 700 ~ /.print_ssh_password
    

    Важно: убедитесь, что вы копируете ведущее пространство не сохраняете свой пароль в своей истории .

И используйте один из следующих методов.

  • с использованием стандартного подхода ввода:

    cat ~ /.ssh /id_rsa | SSH_ASKPASS = ~ /.print_ssh_password ssh-add -
    
  • или именованный канал :

    1. Создайте именованный канал (вы также можете попробовать подстановка процесса ):

      mkfifo --mode 0600 ~ /.ssh_fifo
      
    2. Запустите ssh-add, указав программу, используемую для аутентификации:

      cat ~ /.ssh /id_rsa> ~ /.ssh_fifo | SSH_ASKPASS = ~ /.print_ssh_password ssh-add ~ /.ssh_fifo
      

    Смотрите: man ssh-add , чтобы узнать больше о SSH_ASKPASS.

ответил kenorb 11 +03002015-10-11T15:51:26+03:00312015bEurope/MoscowSun, 11 Oct 2015 15:51:26 +0300 2015, 15:51:26
1

Я использовал сценарий, упомянутый steampowered, теперь я сделал ниже, потому что он не оставляет файлы, лежащие вокруг.

Работа с оболочкой zsh.

#! /Bin /ш

AGENT_BIN = `какой ssh-agent`
AGENT_ADD_BIN = `который ssh-add`
AGENT_PID = `ps -fe | grep $ {AGENT_BIN} | awk -vuser = $ USER -vcmd = "$ AGENT_BIN" '$ 1 == user & & & & $ 8 == cmd {print $ 2; exit;} '`
если [-z "$ AGENT_BIN"]; тогда
    echo "no ssh agent found!";
    вернуть
фи
если ["" -eq "$ AGENT_PID"]; тогда
    если read -sq "YN? Вы хотите разблокировать свои ssh-ключи?"; тогда
        эхо ""
        output = `$ AGENT_BIN | sed 's /echo /# echo /g``
        eval $ output
        $ AGENT_ADD_BIN
    фи
еще
    для f в "/proc /" *
    делать
        cmdline = `cat" $ f /cmdline "`
        если ["$ {AGENT_BIN}" -ef "$ {cmdline}"]; тогда
            экспорт SSH_AUTH_SOCK = `cat $ f /net /unix | grep --binary-file = text -oP '((/[^ /] *?) + /ssh - [^ /] + /agent \. \ d + $)' `
            export SSH_AGENT_PID = $ {f ## * /}
            ломать;
        фи
    сделанный
фи
ответил rmc 19 J000000Tuesday16 2016, 10:16:52
0

Добавьте это в свой ~ .bashrc файл:

ssh-add -L | grep identity> /dev /null & & & ssh-add /path /to /ssh /private /key
ответил Abukamel 6 Jpm1000000pmMon, 06 Jan 2014 16:47:30 +040014 2014, 16:47:30
0

Чтобы добавить ключ (возможно, без пароля) и убедитесь, что ssh-add не будет запрашивать пароль, несмотря ни на что, даже при работе под X :

DISPLAY = ssh-add -k /path /to /key </dev /null & gt; /dev /null

Статус выхода указывает на успех или неудачу.

ответил Keith Cascio 11 FebruaryEurope/MoscowbWed, 11 Feb 2015 04:56:28 +0300000000amWed, 11 Feb 2015 04:56:28 +030015 2015, 04:56:28
0

Если вы управляете морским коньком в качестве менеджера паролей ... Скорее всего, вы D

Другим решением, которое достигает цели, которую вы ищете, является просто добавление ключей ssh ​​к морскому коньку для автоматической разблокировки при входе в систему. Главное преимущество этого заключается в том, что вам никогда не нужно вводить пароль для ключей после входа в систему через gdm или независимо от того, что вы входите в систему, даже если у ключей есть пароль. Это ТРЕБУЕТ как закрытый ключ, так и открытый ключ. Они также ДОЛЖНЫ следовать соглашению об именах для морских коньков. По умолчанию допустимо (id_rsa для закрытого ключа и id_rsa.pub для открытого ключа ... На самом деле все, что есть privatekeyname и privatekeyname.pub )

Чтобы добавить ключ ssh к морскому коньку для автоматической разблокировки при входе в систему; (на fedora25, я не уверен, где путь находится на других дистрибутивах, хотя, скорее всего, он очень похож)

/lib64 /seahorse /seahorse-ssh-askpass /path /to /keys /здесь

Для меня это было

/lib64 /seahorse /seahorse-ssh-askpass ~ /.ssh /id_rsa

(seahorse автоматически предположит, что открытый ключ в моем случае был id_rsa.pub)

После выполнения команды морская пехота откроет небольшое небольшое поле пароля gtk, чтобы ввести пароль для закрытого ключа. или просто оставьте поле пустым, если вы создали ключ без пароля.

Морской конек не подскажет, все ли в порядке. Вам нужно будет попытаться выполнить ssh на целевой машине. Затем морская лошадь предложит вам разблокировать ключ с паролем графически (ЭТО БУДЕТ ТОЛЬКО СЛУЧАЙ ОДИН РАЗ), но на этот раз это должно выглядеть немного иначе: P (это также та часть, где морской конь делает морскую прогулку для ssh-add magic, я верю ) и предложите OPTION , чтобы разблокировать ключ при входе в систему, вы должны проверить этот параметр, чтобы достичь своей цели.

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

ответил AWildBeard 20 TueEurope/Moscow2016-12-20T19:25:01+03:00Europe/Moscow12bEurope/MoscowTue, 20 Dec 2016 19:25:01 +0300 2016, 19:25:01
0

Вот окончательный скрипт.

Обновите $ PASSW, затем скопируйте его в свой терминал

# <sshpass> через типографщик
# Обновлено: 2017-01-18_21h36
#
# apt-get update -y; apt-get install ожидать -qy

# Передайте это значение в ssh-add
PASSW = "myfancypass123"

# Определить имя для этого скрипта
THIS_SCRIPT = "$ (дата +% Y-% m-% d_% H-% M-% S-% N)". Sh

# Создать новый каталог для работы из /Очистить
rm -rf ~ /temp; mkdir -p ~ /temp; cd ~ /temp; ls -la


# Вывести наш файл сценария bash - НАЧАТЬ
cat <'
#! /Bin /Баш

set -u # Остановить, если ссылается несвязанная переменная
set -e # Остановить первую ошибку
export HISTIGNORE = "ожидать *";

# Нормальный CMD
echo & & echo "Процесс должен занимать около 10 секунд:" & & эхо
eval "$ (ssh-agent -s)"; сон 0,5;

# Определить VAR, когда был запущен этот bash-скрипт
пароль = "$ @"

# Запустить магию ожидания
ожидать -c "
    spawn ssh-add /root/.ssh/id_rsa
    ожидать "? assword:"
    отправить \ "$ password \ r \"
    ожидать "? пароль:"
    отправить \ "$ password \ r \"
    ожидать,

export HISTIGNORE = "";
export password = "";
'> $ THIS_SCRIPT
# Вывести наш файл сценария bash - END


# Убедитесь, что мы находимся на правильном пути
cd ~ /temp; ls -la; сон 1;

# Запустить скрипт bash
chmod + x ./$THIS_SCRIPT; ./$THIS_SCRIPT "$ PASSW"; unset password;

# Очистить
rm -rf ~ /temp; mkdir -p ~ /temp; cd ~ /temp; ls -la
ответил Pascal Andy 19 Jam1000000amThu, 19 Jan 2017 05:40:07 +030017 2017, 05:40:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132