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

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

#!/bin/bash sudo su ls /root 

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

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

  • Что такое эквивалент sudo для FreeBSD?
  • Обновление кучи компьютеров Mac через SSH. Может помочь
  • Можно ли динамически устанавливать пользователей .gitconfig (для git config -global)?
  • Использование sudo для доступа к другой учетной записи на одной машине
  • ssh с -Y приводит к «shell-init: ошибка получения текущего каталога: getcwd: невозможно получить доступ к родительским каталогам ...»
  • Не удалось получить файл выпуска при запуске debootstrap с sudo
  • почему Permission denied, когда что-то записывать в файл журнала?
  • Ошибка аутентификации su, ошибка 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 перед выпуском приглашения.

    Interesting Posts

    Административно распространять несколько правил для каждого получателя Thunderbird для некоторых пользователей?

    Поиск пользователей почты и настройка для RT

    Как вы предотвращаете зависание системы при израсходовании памяти?

    Почему openssl печатает на stderr для успешной команды?

    Как удалить каталог ': q!'?

    где LD_LIBRARY_PATH? как установить переменную env LD_LIBRARY_PATH?

    Выключить версию Maven после установки из jpackage?

    Как отключить диалог «не могу установить атрибут» в Double Commander 0.7.4?

    Telnetting Локальный порт не работает, но пытается работать ip

    Прокладывайте все через VPN, за исключением SSH на порте 22

    Изменение размера окна из командной строки

    Что означает синтаксис bash? ETL_PORT = "$ {ETL_PORT: -6090}"

    Есть ли редактор XML-файлов для Linux с поддержкой grid view?

    Ошибка разрешений index.lock – .git принадлежит root, рабочее дерево, принадлежащее другому пользователю

    Как пакеты проходят через физические, VLAN и мостовые интерфейсы tc / netfilter?

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