bash найти пользователя, который первоначально запустил скрипт до su sudo

У меня есть сценарий оболочки bash, который необходимо запускать от имени пользователя root. Если пользователь запускает его, у него запрашивается пароль root, и сценарий повторно запускается в подоболочке. ./$0 &

Допустим, пользователь по имени «Джон» запускает скрипт. После того, как он введет пароль root, сценарий перезапустится как root, но как я могу узнать, кто первоначально запустил сценарий (Джон) из самого сценария? На данный момент я выкладываю файл с оригинальным лаунчером, на который я могу сослаться позже, но это уродливо.

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

GNU bash, версия 4.2.45(2)-выпуск (x86_64-slackware-linux-gnu)


person user316100    schedule 02.03.2014    source источник


Ответы (3)


Вы можете использовать переменную $SUDO_USER.

#!/bin/bash

echo $SUDO_USER

выход

[use1r@host]$ ./sudo-print.sh

[user1@host]$ sudo ./sudo-print.sh
user1
person arco444    schedule 02.03.2014

Попробуйте использовать SUID, чтобы установить разрешения, которые файл использует для выполнения. Это может сохранить ваш UID во время выполнения, если вам повезет, тогда вы сможете намного проще очистить свой UID.

person user2691041    schedule 02.03.2014

Проверьте идентификатор родительского процесса сценария... владельцем родительского процесса должен быть пользователь, выполнивший файл.

Чтобы получить ppid, вероятно, вы можете использовать

echo $$

Или вы можете попробовать включить приведенный ниже код в скрипт yoru bash, чтобы вернуть исходного пользователя.

who am i
person Nishant Shrivastava    schedule 02.03.2014
comment
$$ — это идентификатор процесса текущей оболочки, которая не является владельцем сценария. Вам понадобится идентификатор процесса команды sudo, которая запускает сценарий. - person chepner; 02.03.2014
comment
Насколько я помню, для подоболочки эхо $$ вернет идентификатор процесса родительской оболочки... .. у меня нет доступа к терминалу Linux, чтобы проверить это в данный момент.. ИЛИ вы можете сделать эхо $PPID чтобы получить идентификатор родительского процесса - person Nishant Shrivastava; 02.03.2014
comment
Я только что попробовал на онлайн-терминале #!/bin/bash ; эхо $$; ( echo $$) .. оба вернули одно и то же значение - person Nishant Shrivastava; 02.03.2014
comment
$$ всегда имеет значение родительской оболочки в подоболочке. Однако sudo не является подоболочкой; это совершенно отдельный процесс, который запускает запрошенную команду в еще одном процессе. - person chepner; 02.03.2014
comment
В вопросе говорится: у меня есть сценарий оболочки bash, который необходимо запускать от имени пользователя root. Если пользователь запускает его, у него запрашивается пароль root, и сценарий повторно запускается в подоболочке. ./$0 & -- Итак, если скрипт имеет echo $$, не будет ли он возвращать идентификатор процесса оболочки, в которой была введена команда? Я получаю оболочку, когда я вхожу в систему ... и владельцем этого процесса оболочки буду я ... в случае этого вопроса ... этим пользователем является «Джон». - person Nishant Shrivastava; 02.03.2014
comment
Все 3 дали одинаковый вывод #!/bin/bash echo $$ ( echo $$) echo $$PPID - person Nishant Shrivastava; 02.03.2014