Як я можу запустити ssh-add автоматично, без запиту пароля?


247

Я хочу спілкуватися між декількома комп'ютерами в моїй мережі (статичний 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-агенти, що входять до середовища робочого столу, наприклад, Gnome Keyring SSH Agent , можуть бути кращим підходом, оскільки вони, як правило, можуть бути запропоновані для запрошення парольної фрази вперше, коли ключ 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

Зауважте, що, оскільки пароль зберігається в простому тексті в сценарії, з точки зору безпеки, це навряд чи краще, ніж мати ключ-ключ, що не має пароля. Якщо цей підхід буде використаний, важливо переконатися, що 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.
Thomas Nyman

1
@ user1607072 Це може бути трохи надмірним для вашого випадку використання, але Kerberos у поєднанні з підтримкою ssh GSSAPI також може бути використаний для безоплатних вхідних служб ssh. Викликається відповідний метод аутентифікації в ssh gssapi-with-mic. Зазвичай це використовується у великих мережах, але, звичайно, якщо у вас є інтерес до цього, можливо, варто розглянути.
Thomas Nyman

1
@ErickBrown: Уже відповіли тут . Блок агента SSH слід зупинити при виході, якщо у системного менеджера входу вимкнено затримку користувача . Якщо ввімкнено тривалість користувача, системний екземпляр користувача та блок агента 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-агент (: Кілька агентів, як у другому рішенні @ thomasNyman, здається мені загрозою безпеки ...
drevicko

1
Після дослідження на різних сайтах та ознайомлення з різними рішеннями цей тут видається найяснішим, прямо до суті. Дуже хороша. +1
доктор Беко

1
краще зробити це: `псевдонім ssh = ssh-check-agent", а версія контрольного агента зробить вищезгадане. таким чином: а) ви отримуєте лише одного агента; б) ви отримуєте агента лише тоді, коли він вам потрібен
Ерік Аронесті

2
Я думаю, -s - це за замовчуванням, тому ми вже робимо це.
Колін Андерсон

1
ssh-add -lповертає код виходу 0, коли агент має посвідчення та 1, коли цього не відбувається, ви можете вирізати grep з останньої команди та використовуватиssh-add -l > '/dev/null' || ssh-add
Grant Humphries

16

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

Довідка: https://www.openssh.com/txt/release-7.2


2
Застосовується для тих, хто не знайомий з .ssh/configфайлом: це стосується, наприклад, sshі всього, що використовується sshза ним, наприклад scp, і це можна зробити на основі хоста.
SEoF

Він все ще запитує мене щоразу при вході в систему та намагаюся, наприклад, git pull.
траїноз

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

7

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

Для кешування розблокованих ключів, очевидно, потрібно розблокувати ці ключі. Для розблокування ключів, які заблоковані парольною фразою, очевидно, потрібно знати ці парольні фрази.

Будь-який метод, який не потребує дозволу людини (наприклад, "введення пароля"), не лише зробить вашу систему незахищеною; це також призведе до безглуздість усієї цілі ssh-агента.

Сказавши все це, ви можете просто використовувати ssh-ключі, які не захищені паролем (натисніть, Enterколи запитаєте пароль під час генерації ключів). Оскільки паролю 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). Ніколи не вводьте паролі в аргументи командного рядка!
квітня

1
@ceving Додавання зайвого простору вирішує проблему з файлом історії. Додано додаткову інформацію.
kenorb

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

4

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

Я радше рекомендую написати сценарій, який відкриває підшкільну частину секції ssh-агента, з усіма автоматично доданими ключами файлів, і викликається, коли потрібно використовувати 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

Раніше я використовував сценарій, згаданий паровим набором, я вже зробив нижченаведений, оскільки він не залишає файлів, що лежать навколо.

Працює 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 для відкритого ключа ... Дійсно все, що є приватним ключем і приватним іменем.pub )

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

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

Для мене це було

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

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

Після виконання команди, морський коник відкриє поле милого маленького пароля gtk для введення пароля для приватного ключа. або просто залиште його порожнім, якщо ви створили ключ без пароля.

Морський коник не підкаже, якщо все піде нормально. Вам потрібно буде спробувати вторгнутися в цільову машину. Тоді морський коник запропонує вам розблокувати ключ із паролем графічно (ЦЕ БУДЕ ТОЛЬКО НАДЕЖДАЄТЬСЯ), але це має виглядати цього разу трохи інше; P (це також частина, де морський коник робить деякого морського коня, щоб сш-додати магію, я вважаю ) та запропонуйте ВАРІАНТ розблокувати ключ при вході в систему, ви повинні перевірити цю опцію для досягнення своєї мети.

Тільки тому, що я не прочитав усіх відповідей, рекомендую скасувати те, що всі сказали вам робити з 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.