2016-06-16 2 views
-2

Я знаю, что sudo bash -c 'some_command' будет работать some_command с теми же привилегиями, что и sudo.Что происходит, когда я sudo bash -c?

Я смущен, что происходит? Выполняется ли она some_command в bash as sudo (то же, что и sudo bash), а затем переключается обратно на моего текущего пользователя? Почему я не остался в экземпляре bash с привилегиями sudo, как если бы я запускал sudo bash?

Я попробовал запустить man bash и описывает вариант -c (приведенный ниже). Однако, я изо всех сил, чтобы собрать как описание относится к поведению я наблюдал при работе sudo bash -c 'some_command'

Если опция -c присутствует, то команды считываются из первого, не являющегося параметром аргумента command_string. Если есть аргументы после command_string, они назначаются позиционным параметрам, начиная с $ 0.

ответ

2

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

+0

Выполняется ли после этого выход из bash после команды после выполнения '-c'? Почему поведение отличается от того, как работает 'sudo bash', а затем указывая команду после' bash' –

+1

Так как это работает bash. Если вы не укажете команду, тогда откроется REPL. –

+2

Помните, если я изменю ваш ответ, чтобы добавить это к нему? Эта последняя часть в значительной степени отвечает на мой вопрос –

4

Рассмотрим этот фрагмент (обратите внимание на 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 
  1. В 1-ом случае, sudo начинается ps -f, как root пользователь.
  2. Во втором случае sudo начинается bash как root пользователь с аргументами -c 'ps -f'. Похоже, что в качестве оптимизации bash использует exec для запуска ps -f. Следовательно, наблюдаются только 2 процесса.
  3. В третьем случае sudo начинается bash как root пользователь с аргументами -c 'echo hi; ps -f'. Команда (аргумент -c) не является простым исполняемым + args. Это две команды, разделенные ;. Таким образом, bash не может позвонить по номеру exec. Он использует стандартный механизм fork+exec. Таким образом, bash является родителем процесса ps.
+0

Хороший. Связано здесь: http://stackoverflow.com/questions/18351198/what-are-the-uses-of-the-exec-command-in-shell-scripts/38581329#comment64551906_38581329 – tripleee

Смежные вопросы