4

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

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

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

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

1 ответ1

2

Если все используют 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/${id} определить, кому принадлежит 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 как дополнительная информация не нужна для работы базового скрипта.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .