Почему «sudo su» в сценарии оболочки не запускает остальную часть скрипта как root?

Пример сценария может быть следующим:

#!/bin/bash sudo su ls /root 

При использовании ./test.sh в качестве обычного пользователя вместо этого запускайте ls как суперпользователя и выходите, он переключается на root; и когда я выхожу из системы, он запускает ls /root как обычный пользователь.

Может ли кто-нибудь рассказать мне об этом механизме?

4 Solutions collect form web for “Почему «sudo su» в сценарии оболочки не запускает остальную часть скрипта как root?”

Команды в скрипте выполняются один за другим независимо. Сам скрипт как родитель всех команд в скрипте является другим независимым процессом, и команда su не может и не может изменить его на root: команда su создает новый процесс с привилегиями root.

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

То, что вы хотите сделать, это написать сценарий оболочки. Привилегированные команды ~/main.sh в основной скрипт, например ~/main.sh

 #!/bin/sh ls /root 

Сценарий оболочки вызывает основной скрипт с правами root, например

 #!/bin/sh su -c ~/main.sh root 

Чтобы запустить этот процесс, вы запускаете оболочку, которая, в свою очередь, запускает основной скрипт после переключения пользователя на пользователя root.

Этот метод обертки можно использовать, чтобы превратить скрипт в оболочку вокруг себя. В основном проверьте, работает ли он как root, если нет, используйте «su» для повторного запуска.

$ 0 – это удобный способ сделать сценарий ссылкой на себя, и команда whoami может рассказать нам, кто мы (мы корень?)

Таким образом, основной скрипт со встроенной оболочкой становится

 #!/bin/sh [ `whoami` = root ] || exec su -c $0 root ls /root 

Обратите внимание на использование exec. Это означает «заменить эту программу на», что эффективно завершает ее выполнение и запускает новую программу, запущенную su с помощью root, для запуска сверху. Экземпляр замены – «root», поэтому он не выполняет правую часть ||

В сценарии используйте следующее.

 sudo su <<HERE ls /root HERE 

Код между блоком ЗДЕСЬ будет выполняться как root.

Без дополнительных аргументов su запустит оболочку входа для root. Это то, что на самом деле делает первая строка вашего скрипта. Когда вы выходите, оболочка входа закрывается, su возвращается и ваш скрипт продолжает выполнение, то есть со второй строкой: ls /root . Я думаю, вы можете просто sudo ls /root делать то, что хотите.

После того, как вы userid (euid=EUID) sudo su новый процесс с эффективным userid (euid=EUID) супер-пользователя, который userid (euid=EUID) , следовательно, у нас есть новый bash, работающий на разных идентификаторах процесса (pid=PID) связанных с одним и тем же терминалом (tname=TTY) .

объяснение

Предположим, что после стрельбы ps -A | grep bash ps -A | grep bash вас есть 21460 pts/2 00:00:00 bash как выход. Теперь, когда вы выполняете ./test.sh обе команды sudo su и ls /root будут наматываться на PID 21460 . После выполнения, когда у вас есть root как активный пользователь, нажмите ps -A | grep bash ps -A | grep bash снова, вы заметите, что новый баш работает на PID say, 21570 . Выход из root bash убьет вновь разветвленную bash, возвращаясь к bash user's bash и, следовательно, выполнит команду буферизации ls /root перед выпуском приглашения.

  • sudo: невозможно инициализировать PAM: нет такого файла или каталога
  • Отключить запрос на аутентификацию при автозаполнении команды, которая требует привилегий root
  • Есть ли простой способ создать оболочку sudo?
  • Что делать, если владелец / usr / bin / * изменяется на non-root?
  • sudo и sssd не работают с группами пользователей
  • Коллекции программного обеспечения RH позволяют запускать команды с помощью sudo
  • debian не принимает административный пароль
  • Насколько универсальным является sudo?
  • HGRCPATH хранится в / etc / sudoers, но игнорируется hg?
  • Измените право собственности на файл у пользователя на другого пользователя, который первый пользовательский контроль
  • ubuntu + добавить root для новой учетной записи пользователя
  • notify-send from root cron
  • Linux и Unix - лучшая ОС в мире.