Как получить пользователя родительского процесса? - PullRequest
4 голосов
/ 26 мая 2020

Я пишу программу, которая использует свои собственные файлы конфигурации (в / etc / program / и ~ / .config / program /). Иногда проблема в том, что ее нужно запускать как root (поэтому большую часть времени с sudo), и в этом случае ~ / .config / program находится в каталоге root (в моем случае / root). Я хочу, чтобы моя программа использовала файл конфигурации пользователя, даже если он используется с sudo. Моя идея состоит в том, чтобы сначала получить PID родительской программы (в моем случае BASH), который обычно выполняется обычным пользователем, а затем получить имя пользователя, выполняющего родительскую программу. Я легко узнал, как получить PPID, но не нашел, как найти имя пользователя.

Я представляю сценарий вроде:

parents_name=$(echo $PPID | *command_which_gives_the_name_from_a_PID*)

. /home/$parents_name/.config/program # includes the user's config file

Надеюсь, у кого-то есть тент!

Ответы [ 3 ]

4 голосов
/ 26 мая 2020

sudo добавляет имя вызывающего пользователя в среду команды.

. /home/$SUDO_USER/.config/program

$HOME может уже быть таким же, как /home/$SUDO_USER, но там слишком много способов настроить sudo, чтобы сделать его домашним каталогом целевого пользователя.

Однако это делает ваш скрипт зависимым от того, что вызывается sudo. Лучше быть явным и передать скрипту путь желаемой конфигурации в качестве аргумента. Что-то вроде

sudo theScript "$HOME/.config/program"

и

. "$1"
1 голос
/ 26 мая 2020

Чтобы получить пользователя процесса

$ ps u -p 2813

Чтобы удалить его

$ ps u -p 2813 | awk '{print $1}'
USER
john

Или

$ ps -o user= -p 2813
john
0 голосов
/ 26 мая 2020

https://unix.stackexchange.com/questions/284934/return-owner-of-process-given-pid/284938 имеет аналогичный вопрос. Принятый ответ заключался в использовании ps -o user= -p PIDHERE. Итак, в вашем случае вы бы сделали что-то вроде:

parents_name=$(ps -o user= -p $PPID)

В этом случае нам не нужны заголовки столбцов, поэтому мы добавляем --no-headers.

...