Что происходит, когда я sudo 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.

Ответ 1

sudo переключает пользователей, а затем выполняет bash, передавая ему другие аргументы. bash выполняется, поскольку новый пользователь запускает команду в аргументе после -c.

Ответ 2

Рассмотрим этот фрагмент (обратите внимание на столбцы 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.