Избегайте отдельного добавления ключей ssh ​​(с паролем) в сеансы оболочки

Вы можете использовать echo , подключенный к sudo tee , чтобы предоставить надлежащие разрешения, необходимые, когда вам нужно выполнить эхо как root.

echo 3 | sudo tee /proc/sys/vm/drop_caches

Используйте tee --help , чтобы вывести дополнительные параметры.

7
30.07.2016, 01:57
5 ответов

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

Сеанс начинается при входе в систему, а не при открытии терминала или запуске оболочки. Систематически запускать ssh-agent как часть сценария запуска оболочки определенно неправильно.

Я не являюсь пользователем OSX, поэтому я могу что-то упустить, но, насколько я понимаю, в не-древних версиях OSX (начиная с 10.5) SSH интегрирован с цепочкой ключей OSX. Поэтому вам вообще не следует запускать ssh-agent .Переменная SSH_AUTH_SOCK должна указывать на сокет launchd (launchd предоставляет службу ssh-agent). См. Как использовать Связку ключей Mac OS X с ключами SSH? и Как запретить ssh добавлять мой ключ в ssh-agent на Snow Leopard?

Если вы хотите использовать ssh-agent по какой-то причине, и вы хотите иметь одного агента для всех сеансов (что тоже имеет смысл), вы можете использовать фиксированный путь для сокета SSH. (Я делал это в Windows.) В вашем .profile установите SSH_AUTH_SOCK на фиксированный путь и запустите ssh-agent , если это не так. уже работает.

export SSH_AUTH_SOCK=~/.ssh/auth_sock
if ! fuser "$SSH_AUTH_SOCK" >/dev/null 2>/dev/null; then
  # Nothing has the socket open, it means the agent isn't running
  ssh-agent -a "$SSH_AUTH_SOCK" -s >~/.ssh/agent-info
fi

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

9
27.01.2020, 20:16

В основном, что делает ssh-agent , так это то, что он запускается в фоновом режиме и выводит набор переменных среды, которые клиентская утилита ssh использует, чтобы узнать, как связаться с агент (в основном путь к сокету в SSH_AUTH_SOCK ). Если вы снова запустите агент, у вас будет запущено несколько копий, но обычно вы можете получить доступ только к одной из одной оболочки ... (проверьте что-то вроде ps uax | grep agent , чтобы узнать, сколько у вас запущено .) Когда ssh-add запускается, он связывается с агентом и просит его прочитать ключ в память. После этого любые ssh клиенты, которые подключаются к одному и тому же экземпляру ssh-agent , могут воспользоваться сохраненным ключом.


Пара вариантов запуска только одного ssh-agent :

1) Запустите ssh-agent перед тем, как начать сеанс tmux (или экран в этом отношении). Установленные в этот момент переменные среды должны быть унаследованы всеми оболочками, которые вы запускаете под экраном tmux или . (Я не знаю, нужна ли tmux особая конфигурация, чтобы не очищать переменные среды.)

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

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

2) Ваша система может уже запускать ssh-agent , когда вы входите в систему. В этом случае вы сможете просто ssh-add ключи к нему без запуска нового копия агента. В частности, OS X запускает агент при входе в систему и имеет модифицированные инструменты SSH, которые запрашивают ключевую парольную фразу через графический интерфейс и автоматически сохраняют ключи, используемые в команде ssh , для агента. Вы также можете использовать ssh-add как обычно.

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


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

Кроме того, ssh-add может принимать аргумент, чтобы определить, как долго ключи должны храниться: запуск ssh-add -t 3600 my-key-file сообщит агент забыл про ключ через час. Это может быть полезно для сокращения времени, в течение которого ключи не зашифровываются в памяти.

2
27.01.2020, 20:16

Первичной переменной является переменная SSH_AUTH_SOCK ; SSH_AGENT_PID используется только с ssh-agent -k , чтобы убить работающий агент.

Стандартный подход - запустить ssh-agent , затем ssh-add ваши ключи, затем запустить tmux .

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

(Это хорошо на однопользовательской машине; не так хорошо на общей машине, потому что пользователь root может злоупотреблять вашими ключами!)

1
27.01.2020, 20:16

Вот небольшой фрагмент из моего сценарии входа в систему для обработки того, что вы хотите:

SSHAF=$HOME/.ssh_agent_env
[ -f $SSHAF ] && . $SSHAF

# if ssh-agent not really running?
if [ -n "$SSH_AGENT_PID" ] && ! kill -0 $SSH_AGENT_PID >/dev/null
then ssh-agent >$SSHAF 
     . $SSHAF
     ssh-add # add list of more keys here if needed
fi

Объяснение: Я сохраняю переменные настройки среды из ssh-agent в файле точек в $ HOME (.ssh_agent_env) Я отправляю этот файл, если он существует (строка 2), чтобы получить идентификатор процесса (возможно) запущенного ssh-агента. (Переменная SSH_AGENT_PID) Если эта переменная SSH_AGENT_PID установлена, я проверяю, работает ли агент с kill -0 на его PID (kill -0 устанавливает код возврата на 0 (истина), если процесс запущен , 1 (false) в противном случае. Если агент не запущен, я запускаю его и сохраняю вывод в файле .ssh_agent_env, отправляю этот файл, чтобы добавить значения в сеанс оболочки, и запускаю ssh-add для кэшировать мои ключи.

В первый раз в системе файл не существует, поэтому агент запускается. В любое время после этого файл существует, мы проверяем, запущен ли агент. Если нет, мы выполняем запуск .

Примечание: это моя текущая реализация решения 2 из первого ответа выше.

4
27.01.2020, 20:16

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

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

if [ -z "$SSH_AUTH_SOCK" ]; then
  eval $(ssh-agent)
  ssh-add
fi

Это означает, что агент будет унаследован для любого процесса (xterm или другого эмулятора терминала), порожденного оконным менеджером.

Если вы работаете без X11, то порадуйтесь немного, потому что вы классный, а затем добавьте эти строки в свой .bash_profile или .profile сценарий инициализации оболочки.

Команда eval возьмет вывод от ssh-agent и оценит его в текущей оболочке, установив SSH_AUTH_SOCK и SSH_AGENT_PID в любые значения. Затем будет запущен ssh-add, практически так же, как вы делаете это вручную. Затем агент будет унаследован сеансом tmux, который вы, скорее всего, запустите вскоре после входа в систему (если вы не установили tmux в качестве оболочки для входа в систему, что вполне возможно).

В идеальном мире у вас будет только один запущенный SSH-агент, и вам больше не придется вводить пароли... пока вы не выйдете и не войдете снова, или не войдете на другой консоли.

1
27.01.2020, 20:16

Теги

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