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

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

#!/bin/bash sudo su ls /root 

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

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

  • Можете ли вы указать несколько паролей учетной записи пользователя?
  • Как установить пароль, который нарушает ограничения пароля без изменения ограничений, используя sudo
  • Как долго пароль для выполнения команды с sudo-кешем?
  • Безопасное хранение необработанных изображений на USB-накопителях
  • Когда я запускаю «sudo su», я получаю команду --bash: команда не найдена для всего
  • Msgstr "sudo: извините, вы должны иметь tty для запуска sudo" при использовании sudo в удаленном скрипте
  • Отключить кеширование корневого пароля
  • Как перейти в другой домен при вызове sudo?
  • 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 перед выпуском приглашения.

    Linux и Unix - лучшая ОС в мире.