Ответ 1
sudo
переключает пользователей, а затем выполняет bash
, передавая ему другие аргументы. bash
выполняется, поскольку новый пользователь запускает команду в аргументе после -c
.
Я знаю, что sudo bash -c 'some_command'
будет запускать some_command
с теми же привилегиями, что и sudo.
Я смущен, что происходит? Выполняет ли он some_command
в bash как sudo (то же самое, что и sudo bash
), а затем переключается обратно на моего текущего пользователя? Почему я не остался в экземпляре bash с привилегиями sudo, как если бы я запускал sudo bash
?
Я попробовал запустить man bash
и описывает параметр -c
(приведенный ниже).
Тем не менее, я изо всех сил пытаюсь объяснить, как это описание относится к поведению, которое я наблюдал при работе sudo bash -c 'some_command'
Если присутствует опция -c, команды считываются из первого аргумента без аргумента command_string. Если есть аргументы после command_string, они назначаются позиционным параметрам, начиная с $0.
sudo
переключает пользователей, а затем выполняет bash
, передавая ему другие аргументы. bash
выполняется, поскольку новый пользователь запускает команду в аргументе после -c
.
Рассмотрим этот фрагмент (обратите внимание на столбцы UID и PID/PPID.):
$ sudo ps -f
UID PID PPID C STIME TTY TIME CMD
root 8997 8715 0 11:57 pts/17 00:00:00 sudo ps -f
root 8998 8997 0 11:57 pts/17 00:00:00 ps -f
$ sudo bash -c 'ps -f'
UID PID PPID C STIME TTY TIME CMD
root 8909 8715 3 11:55 pts/17 00:00:00 sudo bash -c ps -f
root 8910 8909 0 11:55 pts/17 00:00:00 ps -f
$ sudo bash -c 'echo hi; ps -f'
hi
UID PID PPID C STIME TTY TIME CMD
root 8957 8715 0 11:56 pts/17 00:00:00 sudo bash -c echo hi; ps -f
root 8958 8957 0 11:56 pts/17 00:00:00 bash -c echo hi; ps -f
root 8959 8958 0 11:56 pts/17 00:00:00 ps -f
sudo
запускает ps -f
как пользователь root
.sudo
запускает bash
в качестве root
пользователя с аргументами -c 'ps -f'
. Похоже, что в качестве оптимизации bash
использует exec
для запуска ps -f
. Следовательно, видны только 2 процесса.sudo
запускает bash
в качестве root
пользователя с аргументами -c 'echo hi; ps -f'
. Команда (аргумент -c
) не является простым исполняемым + args. Это две команды, разделенные символом ;
. Таким образом, bash
не может напрямую вызвать exec
. Он использует стандартный механизм fork+exec
. Итак, bash
является родителем процесса ps
.