Есть ли способ узнать, какие другие пользователи перешли на этого пользователя?

192
Robin Winslow

У нас есть система, в которой мы используем разные системные учетные записи для управления различными средами. Мой стандартный поток выглядит так:

$ ssh server.example.com robin@server$ sudo su - env1-controller env1-controller@server$ deploy 

Однако, может быть, несколько человек делают то же самое, переключаясь на env1-controllerпользователя. И у нас есть возможность наступить друг на друга, пытаясь одновременно изменить среду.

Есть ли способ проверить, использует ли кто-либо еще env1-controllerпользователя?

4
Если все используют `sudo`, вы можете использовать что-то вроде` ps -ax | grep sudo`, чтобы увидеть, кто в данный момент использует `sudo` или` env1-controller` и, запустив `who`, вы можете получить представление о том, кто на самом деле его запускает. Seth 7 лет назад 2
спасибо @Seth, `PS -AX | grep "sudo su - env1-controller" работает отлично, чтобы получить PID. Не могли бы вы описать, как я мог бы использовать `кто`, чтобы затем проверить пользователя, который его запускает? Robin Winslow 7 лет назад 0

1 ответ на вопрос

2
Seth

Если все используют sudo, вы можете рассмотреть возможность использования чего-то в этом направлении, ps -ax | grep sudoчтобы увидеть, кто в данный момент использует sudoили, env1-controllerи, запустив, whoвы можете получить представление о том, кто на самом деле его запускает.

В качестве примера на моей машине с моей машины вывод ps -ax | grep sudoбудет выглядеть так:

24324 pts/0 S 0:00 sudo su <user> 

Первая запись - это PID, вторая - TTY, третий раз и последняя команда. Если вы используете, whoвы получите список вошедших в систему пользователей, и какой TTY они используют. Это может выглядеть так:

<user> pts/0 Nov 23 10:24 (<IP>) <user> pts/2 Nov 23 10:25 (<IP>) 

Таким образом, благодаря этой комбинации вы знаете, что sudoэто соединение с тем, что использует пользователь pts/0. Это будет ручной способ проверки.

Я предполагаю, что можно объединить эту информацию, но мои навыки bash не достаточно хороши, чтобы просто опубликовать ответ о том, как это сделать.

Окончательное решение, использованное первоначальным автором вопроса, было:

Я фактически использовал grep для извлечения точных чисел TTY ps -aux | grep -v grep | grep "sudo su - whoami" | grep -E -o 'pts/[0-9]+' | grep -E -o '[0-9]+', а затем использовал, ls -l /dev/pts/$чтобы определить, кому принадлежал TTY.

Что это делает:

  • Используйте ps -auxдля получения списка всех запущенных процессов, включая некоторую дополнительную информацию.
  • grepвсе строки, которые не содержат grep, чтобы исключить grep из вывода.
  • grepстрока для всех процессов, которые содержат sudo.
  • grepтекст pts/<number>из этих строк.
  • grep просто номер.
  • Используйте, lsчтобы проверить, кто является владельцем этого TTY.

Используя эту информацию, вы можете попытаться сделать это (если хотите использовать who):

who | grep $(ps -ax | grep -v grep | grep "sudo su - whoami" | grep -E -o 'pts/[0-9]+') 

Но это будет работать только до тех пор, пока есть один результат, потому что выходные данные $()будут иметь несколько строк. Как вы можете видеть, я пропускаю uиз, psпоскольку добавленная информация не нужна для работы основного скрипта.

Я фактически использовал grep для извлечения точных чисел TTY, `ps -aux | grep -v grep | grep "sudo su -` whoami` "| grep -E -o 'pts / [0-9] +' | grep -E -o '[0-9] +' `, а затем с помощью` ls -l / dev / pts / $ `определить, кому принадлежит TTY. Robin Winslow 7 лет назад 1
Спасибо за добавление. Я включил объяснение вашего решения в ответ, если вы не возражаете. Seth 7 лет назад 0
Ах да, хорошие вещи. Причина, по которой я проверяю содержимое `/ dev / pts /`, а не смотрю выходные данные `who`, заключается в том, что иногда подключенный TTY на самом деле не является сеансом прямого входа в систему - иногда это` tmux` или `screen` сессия. В этом случае вы не найдете TTY в выходных данных `who`, но в` / dev / pts` будет файл, принадлежащий пользователю, которому принадлежит сеанс. Robin Winslow 7 лет назад 1

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