Кто запускает мой ssh-агент и почему он не прекратит работу?

9

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

Фон

Мой 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.

  • Я создал нового пользователя с именем dummyusing useradd -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рекурсивно используя grepin /etcи не /libдает результатов.

  • У меня не установлена ​​среда рабочего стола, но у меня есть /etc/X11папка с некоторыми файлами конфигурации. Я попытался переименовать папку во что-то еще и перезагрузить на всякий случай, но процесс все еще запускается, так что, очевидно , это не имеет к этому никакого отношения.


Вывод

Теперь, чтобы сделать его максимально простым, у меня есть только два вопроса:

  1. Где и как это ssh-agentпорождается, кто выдает команду?
  2. Почему он не вызывается должным образом, не устанавливая необходимые переменные окружения и, следовательно, оставляя процесс зависать там бесконечно?
Марко Бонелли
источник
Мне интересно, что у вас есть ~/.bashrcтогда.
ilkkachu
@ilkkachu хорошо, вот, пожалуйста ...
Марко Бонелли

Ответы:

1

Я знаю пару возможных причин:

  • если вы используете 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 вашей локальной рабочей станции.

Телком
источник
1
Спасибо за предложения, но, к сожалению, ни один из этих вариантов не подходит для меня. У меня нет libpam-ssh; и то SSH_AGENT_PIDи другое SSH_AUTH_SOCKне установлено (сокет, конечно, присутствует в любом случае); Я не использую gpg-agentи не включаю переадресацию агентов на PuTTY. Я действительно потерян: \
Марко Бонелли