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


248

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

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

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent -s`
    ssh-add
fi

Ответы:


348

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

ssh-ключ с парольной фразой, нет ssh-agent

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

SSH-ключ с парольной фразой, с ssh-agent

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

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

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

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

if [ -n "$SSH_AUTH_SOCK" ] ; then
  eval `/usr/bin/ssh-agent -k`
fi

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

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

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

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

SSH-ключ с парольной фразой, с ssh-ident

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

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

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

SSH-ключ с парольной фразой, с 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опцию в свой ~/.bash_profileвызов цепочки для ключей. При этом необходимо повторно вводить парольные фразы при входе в систему, как указано выше, но cronзадания по-прежнему будут иметь доступ к незашифрованным ключам после выхода пользователя из системы. На keychain вики-странице есть больше информации и примеров.

SSH-ключ без ключевой фразы

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

SSH-ключ с ключевой фразой, с ssh-agent , передавая парольную фразу ssh-add из сценария

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

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

#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact

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


1
Хорошо, но когда я помещаю ваш код в ~ / .bash_profile, мне приходится вводить пароль каждый раз, когда я вхожу в систему, я тоже этого не хочу. Я не беспокоюсь о безопасности вообще. эхо "пройти \ n" | ssh-add не работает
zdun8

3
@ user1607072 Да, так ведет себя ssh-agentфрагмент кода, ~/.bash_profileкак объяснено в ответе. Возможно, вы захотите взглянуть на keychainутилиту. При этом keychainнеобходимо ввести пароль при первом входе в систему после перезагрузки, но при последующих входах в систему keychainбудет подключаться существующий ssh-agentэкземпляр с дешифрованным ключом в памяти. Кроме того, есть возможность генерировать ssh-ключ без ключевой фразы, но это, конечно, не рекомендуется.
Томас Найман

3
@ user1607072 Хотя я настоятельно рекомендую один из более безопасных подходов, существует способ передачи ключевой фразы ssh-addиз сценария. Причина echo "pass\n" | ssh-addне работает в том, что ssh-addне читает пароль с stdin, но открывается /dev/ttyнепосредственно для чтения. Обновлен ответ, чтобы включить обходной путь для этого, используя утилиту под названием expect.
Томас Найман

1
@ user1607072 Это может быть немного излишним для вашего варианта использования, но Kerberos в сочетании с поддержкой SSH GSSAPI может также использоваться для входа без пароля ssh. Соответствующий метод аутентификации в ssh вызывается gssapi-with-mic. Это обычно используется в больших сетях, но, конечно, если у вас есть интерес к этому, возможно, стоит посмотреть.
Томас Найман

1
@ErickBrown: уже ответили здесь . Модуль Агента SSH должен быть остановлен при выходе из системы, если в диспетчере входа в систему systemd отключена задержка пользователя . Если задержка пользователя включена, экземпляр пользователя systemd и модуль агента SSH продолжают работать даже после закрытия последнего сеанса входа в систему.
Томас Найман

93

Добавьте это в свой ~/.bashrc, затем выйдите из системы и снова войдите, чтобы вступить в силу.

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

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


1
очень аккуратно, таким образом, у вас работает только один ssh-agent (: несколько агентов, как во втором решении @ thomasNyman, кажутся мне угрозой безопасности ...
drevicko

1
После исследования на различных сайтах и ​​чтения различных решений, это, кажется, самое ясное, прямое дело. Очень хорошо. +1
доктор Беко

1
лучше сделать это: `alias ssh = ssh-check-agent", и сделать так, чтобы версия check-agent делала выше. таким образом: a) вы получаете только одного агента и b) вы получаете агента только в случае необходимости
Эрик Аронесты

2
Я думаю -s по умолчанию, так что мы уже делаем это.
Коллин Андерсон

1
ssh-add -lвозвращает код выхода 0, когда у агента есть удостоверения, и 1, если его нет, поэтому вы можете вырезать grep из последней команды и использоватьssh-add -l > '/dev/null' || ssh-add
Grant Humphries

16

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

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


2
Применимо к тем, кто новичок в этом .ssh/configфайле: это относится ко sshвсему, что используется sshза ним, например scp, и может быть сделано для каждого хоста.
SEoF

Он по-прежнему запрашивает пароль каждый раз, когда я вхожу в систему и пытаюсь, например, git pull.
trainoasis

@trainosis Проблема заключается в том, что у вас, вероятно, нет запущенного экземпляра ssh-agent для хранения дешифрованного ключа (ключей) в памяти для будущего использования. Вам нужно только вводить пароль для данного ключа один раз за сеанс входа в систему при использовании ssh-agent.
eestrada

7

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

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

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

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


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

5

Вот обходной путь для автоматизации вашей парольной фразы 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.


2
Это echo my_passphraseбольшая дыра в безопасности. Сначала, после того, как вы ввели его, пароль записывается в текстовом файле в файле истории того, что вы когда-либо использовали. И вторые аргументы командной строки доступны для чтения в Unix ( ps -ef). Никогда не ставьте пароли в аргументах командной строки!
ceving

1
@ceving Добавление дополнительного пробела решает проблему с файлом истории. Добавлена ​​дополнительная информация.
Кенорб

@kenorb: Это не решает большую проблему с паролем, видимым в psвыводе. Файл истории обычно доступен для чтения только владельцу, но командные строки доступны для чтения всем пользователям системы.
Томас Найман

4

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

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

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

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

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

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

#!/bin/bash
# This script run a ssh-agent on a sub-shell and automatically ssh-add all keyfiles at once.
# This agent ends when you type `exit` to close the sub-shell.
exec ssh-agent bash -c "ssh-add /path/to/keyfile1 /path/to/keyfile2 ...; exec bash"

Примечания:

  • Команда для изменения или удаления ключевой фразы: ssh-keygen -p -f keyfile
  • В под-оболочке вы можете даже разветвлять больше терминалов, которые используют одни и те же разблокированные ключи, используя, например, команду вроде /path/to/yourterminal &(зависит от ОС)

Например, на Windows в Cygwin, /path/to/yourterminal &==>mintty &
Джонни Вонг

2
if [ ! -S ${HOME}/.ssh/ssh_auth_sock ]; then
  eval $(ssh-agent)
  ln -sf "${SSH_AUTH_SOCK}" ${HOME}/.ssh/ssh_auth_sock
fi
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}')

for k in "${ssh_keys}"; do
    for l in "${ssh_agent_keys}"; do
        if [[ ! "${k}" = "${l}" ]]; then
            ssh-add "${k}" > /dev/null 2>&1
        fi
    done
done

2

Раньше я использовал скрипт, упомянутый steampowered, сейчас я сделал нижеприведенный, потому что он не оставляет файлы лежать без дела.

Работает zshтолько на оболочке.

#!/bin/sh

AGENT_BIN=`which ssh-agent`
AGENT_ADD_BIN=`which ssh-add`
AGENT_PID=`ps -fe | grep ${AGENT_BIN} | awk -vuser=$USER -vcmd="$AGENT_BIN" '$1==user && $8==cmd{print $2;exit;}'`
if [ -z "$AGENT_BIN" ]; then
    echo "no ssh agent found!";
    return
fi
if [ "" -eq "$AGENT_PID" ]; then
    if read -sq "YN?Do you want to unlock your ssh keys?"; then
        echo ""
        output=`$AGENT_BIN | sed 's/echo/#echo/g'`
        eval $output
        $AGENT_ADD_BIN
    fi
else
    for f in "/proc/"*
    do
        cmdline=`cat "$f/cmdline"`
        if [ "${AGENT_BIN}" -ef "${cmdline}" ]; then
            export SSH_AUTH_SOCK=`cat $f/net/unix | grep --binary-file=text -oP '((/[^/]*?)+/ssh-[^/]+/agent\.\d+$)'`
            export SSH_AGENT_PID=${f##*/}
            break;
        fi
    done
fi

1
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
     echo succeeded
     chmod 600 "${SSH_ENV}"
     . "${SSH_ENV}" > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

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

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


1

Единый знак решения для SSH может привести меня к pam_ssh.

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

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


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

Я не проверял, что это на самом деле будет работать.


0

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

ssh-add -L|grep identities > /dev/null && ssh-add /path/to/ssh/private/key

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

0

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

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

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


0

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

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

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

/lib64/seahorse/seahorse-ssh-askpass /path/to/keys/here

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

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

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

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

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

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


0

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

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

# <sshpass> via typinator
# Updated: 2017-01-18_21h36
#
# apt-get update -y; apt-get install expect -qy

# Pass this value to ssh-add
PASSW="myfancypass123"

# Define a name for this script
THIS_SCRIPT="$(date +%Y-%m-%d_%H-%M-%S-%N)".sh

# Create a fresh directory to work from / Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la


# Output our bash script file - BEGIN
cat <<< '
#!/bin/bash

set -u     # Stop if an unbound variable is referenced
set -e     # Stop on first error
export HISTIGNORE="expect*";

# Normal CMDs
echo && echo "The process should take about 10 seconds:" && echo
eval "$(ssh-agent -s)"; sleep 0.5;

# Define VAR passed when this bash-script was launched
password="$@"

# Launch the expect magic
expect -c "
    spawn ssh-add /root/.ssh/id_rsa
    expect "?assword:"
    send \"$password\r\"
    expect "?password:"
    send \"$password\r\"
    expect eof"

export HISTIGNORE="";
export password="";
' > $THIS_SCRIPT
# Output our bash script file - END


# Ensure we are in the right path
cd ~/temp; ls -la; sleep 1;

# Run the bash script
chmod +x ./$THIS_SCRIPT; ./$THIS_SCRIPT "$PASSW"; unset password;

# Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la

0

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

Ваша фраза-пароль хранится в зашифрованном виде с вашим системным паролем и расширенной функцией деривации. При входе в систему системный пароль используется для расшифровки вашей парольной фразы и добавления ее к агенту.

https://github.com/capocasa/systemd-user-pam-ssh

Преимущество перед любым другим представленным решением заключается в том, что оно сочетает в себе безопасность, эквивалентную запуску ssh-add вручную при загрузке с минимальными усилиями. Он не требует дополнительных инструментов и имеет одну дополнительную зависимость, которая уже установлена ​​по умолчанию на большинстве систем (OpenSSL).


0

Моя установка на MacOS выглядит следующим образом (в .zshrc, или .bash_profileдля Баша людей):

# Kill then Load the ssh-agent and set the necessary env variables it outputs
sshRestart() {
    # if all else fails
    # pkill -u $(whoami) ssh-agent;

    if [ -n "$SSH_AUTH_SOCK" ] ; then
        eval `/usr/bin/ssh-agent -k`
    fi
    eval `ssh-agent -s`
    ssh-add ~/.ssh/YOUR_KEY_FILE
    echo "Restarted SSH agent"
}

if [ -z "$SSH_AUTH_SOCK" ] || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]] ; then
    eval `ssh-agent -s` > /dev/null 2>&1
    ssh-add ~/.ssh/YOUR_KEY_FILE > /dev/null 2>&1
fi

Эта || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]часть необходима в macOS, потому что по умолчанию установлено значение /private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners. Иначе @Thomas Nyman исчерпывающий ответ не получится, потому что $SSH_AUTH_SOCKвсегда настроен на что-то.

Тогда в .zlogout(или .bash_logoutдля людей Баша):

if [ -n "$SSH_AUTH_SOCK" ] ; then
    eval `/usr/bin/ssh-agent -k`
fi

Протестировано на MacOS Mojave 10.14.5

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