Это проблема, с которой я сталкиваюсь долгое время, но каждый раз, когда я пытаюсь что-то выяснить, я теряюсь, поэтому я решил, что лучше спросить здесь, где, возможно, кто-то более опытный мог бы помочь мне.
Фон
Мой Raspberry Pi работает под управлением Raspbian Jessie, и я часто использую SSH для входа в него и удаленного выполнения команд. Во время моих первых сессий SSH я заметил, что ssh-agent
процесс вызывался на RPi каждый раз, когда я входил в систему, но никогда не убивал при exit
входе в систему: вход и выход из системы несколько раз приводил к тому, что группа ssh-agent
процессов порождалась, просто оставаясь там, ничего не делая. Повозившись и читая страницы руководства и ответы здесь и там, я недавно понял цель ssh-agent
, и я также узнал, что это обычно должно быть убито при выходе из системы, поэтому я начал спрашивать себя, почему это не так. Кроме того, я заметил, что выдача source ~/.bashrc
приводит к появлению другого экземпляра ssh-agent
. Я прочитал на соответствующей странице руководствачто переменная окружения SSH_AGENT_PID
должна быть определена, потому что ssh-agent
программа должна быть запущена внутри, eval
чтобы выполнить свой вывод и определить такие переменные, которые затем используются другими командами, связанными с SSH, в том числе ssh-agent -k
(для уничтожения агента относительно текущего сеанса), поэтому я побежал echo $SSH_AGENT_PID
и echo $SSH_AUTH_SOCK
, но они оба были пусты. Я внезапно понял: вероятно, процесс не убивается при выходе из системы, потому что ssh-agent -k
пытается прочитать его PID из переменной окружения, которая не установлена.
Проблема
Поскольку ssh-agent
при выходе из системы его не убивают, и это наверняка происходит из-за того, что необходимые переменные среды не установлены, это может означать только одно: тот, кто вызывает ssh-agent
вход в систему, вероятно, не сделает этого должным образом (что будет eval "$(ssh-agent -s)"
) . Вот я и подумал: ну в чем проблема? Я просто найду, какой файл конфигурации, службы или сценарий входа будет запущен, чтобы запустить агент и исправить его вручную! Где это может быть?
Что я пробовал
Так как я заметил, что при ssh-agent
каждом вызове вызывается an source ~/.bashrc
, это был первый файл, который я проверял, но ничего там даже отдаленно не ссылалось ни на что, связанное с SSH. Я продолжал искать, используя vi
строку во ssh
всех следующих файлах, но ничего не нашел :
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
Есть ли еще файл, в котором можно участвовать source ~/.bashrc
? Я действительно не знаю.
Затем я искал соответствующие systemd
сервисы , но нашел только то ssh.service
, что есть WantedBy=multi-user.target
, и поэтому не запускается при входе в систему (и это очевидно, поскольку это демон SSH-сервера).
Я также попытался переместить каждый отдельный файл в моей /home/pi
папке во временную папку и выйти из системы и снова войти в нее, но ssh-agent
все равно появился.
В конце концов, я также произвел последний выстрел, который у меня был в камере: я запустил find / -name 'ssh-agent'
от имени пользователя root, который только печатал /usr/bin/ssh-agent
исполняемый файл, поэтому я создал поддельный исполняемый файл, который в основном регистрировал только родительскую команду :
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Я переименовал реальный /usr/bin/ssh-agent
и заменил его на фальшивый, устанавливающий правильные права / пользователя / группу, source ~/.bashrc
снова запустил и распечатал LOG
файл:
-bash
-bash
Ни единой подсказки о том, что происходит.
Еще немного деталей
Я добавляю еще некоторые детали, я не знаю, могут ли они быть полезными или нет, но вы знаете ... лучше, чем потом сожалеть.
Вот мой
.bashrc
.Я создал нового пользователя с именем
dummy
usinguseradd -m dummy
, и вход в него не запускаетсяssh-agent
(я чувствую, что это может что-то значить). Наdiff /home/pi/.bashrc /home/dummy/.bashrc
шоу в основном ничего (просто комментарий , который я сделал), то же самое дляdiff /home/pi/.profile /home/dummy/.profile
.Сокет агента создается без проблем, даже если
SSH_AUTH_SOCK
он не установлен:pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/ total 0 srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
Не знаю почему, но номер в имени файла сокета всегда тот, который находится непосредственно перед PID
ssh-agent
процесса.Фрагмент из
htop
:PID USER PRI NI VIRT RES SHR S Command 1 root 20 0 5472 3900 2728 S /sbin/init 1329 pi 20 0 3696 224 16 S └─ ssh-agent -s
Соответствие установленных пакетов
ssh
:pi:~$ apt list --installed | grep ssh libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed] libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic] libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic] openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed] sshpass/oldstable,now 1.05-1 armhf [installed]
Поиск
ssh-agent -s
рекурсивно используяgrep
in/etc
и не/lib
дает результатов.У меня не установлена среда рабочего стола, но у меня есть
/etc/X11
папка с некоторыми файлами конфигурации. Я попытался переименовать папку во что-то еще и перезагрузить на всякий случай, но процесс все еще запускается, так что, очевидно , это не имеет к этому никакого отношения.
Вывод
Теперь, чтобы сделать его максимально простым, у меня есть только два вопроса:
- Где и как это
ssh-agent
порождается, кто выдает команду? - Почему он не вызывается должным образом, не устанавливая необходимые переменные окружения и, следовательно, оставляя процесс зависать там бесконечно?
~/.bashrc
тогда.Ответы:
Я знаю пару возможных причин:
если вы используете
libpam-ssh
его, он может автоматически запускать для вас SSH-агент как часть запуска сеанса и даже автоматически загружать ваши ключи, если они либо не имеют парольной фразы, либо их парольная фраза совпадает с вашим паролем для входа.если вы используете
gpg-agent
, он может также выполнить задачуssh-agent
. Его выключение обрабатывается по-другому, поэтому будет толькоSSH_AUTH_SOCK
переменная окружения, а неSSH_AGENT_PID
если на вашей рабочей станции работает SSH-агент (например, PageT PuTTY) и вы устанавливаете SSH-соединение с включенной переадресацией агента (а удаленный
sshd
разрешает это), то на удаленном хосте вы снова увидите толькоSSH_AUTH_SOCK
безSSH_AGENT_PID
... потому что сокет агента идет вsshd
какие туннели обратно к агенту SSH вашей локальной рабочей станции.источник
libpam-ssh
; и тоSSH_AGENT_PID
и другоеSSH_AUTH_SOCK
не установлено (сокет, конечно, присутствует в любом случае); Я не используюgpg-agent
и не включаю переадресацию агентов на PuTTY. Я действительно потерян: \