Почему не делает “sudo su” в выполненной остальной части сценария оболочки сценария как корень?

Я использую CrunchBang Linux на 2 компьютерах, и он использует только 63 МБ RAM при запуске. Большой дистрибутив и очень функциональный. Почтовый клиент ваше дело (ни один не установлен по умолчанию). Существует очень хорошо сделанный сценарий при установке, которая предлагает Вас, с вопросами, требующими ответа "да - нет", чтобы заставить Ваш новый дистрибутив установить больше (например, установкой Открывают Office или Java Development Kit).

Перед этим я попробовал Lubuntu, который очень хорош, но немного более чрезмерно увеличен в размере, чем CrunchBang.

37
21.06.2013, 16:22
5 ответов

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

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

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

#!/bin/sh
ls /root

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

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

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

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

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

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

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

Отметьте использование должностного лица. Это означает, "заменяют эту программу", который эффективно заканчивает ее выполнение и запускает новую программу, запущенную su, с корнем, для выполнения от вершины. Заменяющий экземпляр является "корнем", таким образом, он не выполняет правую сторону ||

50
27.01.2020, 19:36
  • 1
    fwiw, приложение к этой точке. Если бы я писал сценарий как он, то я просто сделал бы, если оператор вначале, который проверяет $EUID и если это не нуль sudo сам и выход, иначе продолжите выполнение сценария. –  Bratchley 02.04.2013, 18:49
  • 2
    Согласованный, и я обновлю ответ для объяснения этого. –  Johan 02.04.2013, 18:54
  • 3
    Возможно, это немного архаично, но я люблю полные пути к каждому executeable так кто-то изменение наклона ~/main.sh сценарий во что-то низкое. Нападение на Подсистему пользователей сценария –  artifex 02.04.2013, 19:16
  • 4
    , можно также хотеть поймать аргументы, которые были переданы ему включением ссылки на $* –  Bratchley 02.04.2013, 19:35
  • 5
    @JoelDavis я всегда сталкиваюсь со стеной "что, если существуют символы пробелов в аргументах". Я никогда не находил удовлетворительное решение. После того как я записал сценарий, которые производят его аргументы во временный файл, один аргумент на строку, и затем назвали то, в чем он нуждался и передал тому заключительному сценарию аргумент какой файл читать для нахождения исходных аргументов. –  Johan 03.04.2013, 12:20

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

sudo su <<HERE
ls /root
HERE

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

20
27.01.2020, 19:36
  • 1
    sudo su называет две программы. Использовать sudo -s <<HEREDOC или su user <<HEREDOC ... Глупый 5-минутный предел. –  Johan 02.04.2013, 19:13

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

6
27.01.2020, 19:36
  • 1
    Да, я знаю, что могу сделать это для ls, но это - просто образец. На самом деле я должен сделать намного больше вещей с корнем privilege:-), Таким образом, я предпочитаю ответ @Ankit. –  Hongxu Chen 02.04.2013, 16:27

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

Объяснение

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

1
27.01.2020, 19:36
  • 1
    Если использование su или sudo было "персистентным" в ударе (или где-либо еще) это создаст намного больше проблем, чем это решило. Необходимо сделать минимум, возможный, как поддерживают безопасность. Основной момент наличия su и sudo (кроме безопасности!) должен заставить Вас думать тщательно о том, чему нужны полномочия пользователя root. –  Joe 06.04.2013, 01:57

вот ваш типичный случай использования 1. в вашем bash есть строки, которые выполняются без sudo 2. также в вашем bash есть строки, для которых нужен суперпользователь 3. после выполнения строк, требующих сверхиспользованного превыбора, который вы хотите верните управление в свой сценарий, а затем продолжайте заниматься обычными делами

хорошо, если это то, что вам нужно, вот образец #!/бин/баш если [[ $ (cat /proc/net/dev |grep br0 )]]; тогда эхо "Создание моста" pwd компакт диск../../ компакт-диск /proc/sys/net pwd modprobe br _сетевой фильтр компакт-диск мост судо -с для f в мосте -nf -*; сделать эхо 0 > $f;готово brctl-шоу echo "введите exit, чтобы продолжить" компакт диск../../../../ cd /home/shino/Desktop/openwrt _вирт пвд

фи

просто проверьте строку sudo -s это все, что вам нужно сохранить это в bash и попробовать поблагодарить меня позже

-2
04.10.2020, 18:09

Теги

Похожие вопросы