Пример сценария может быть следующим:
#!/bin/bash
sudo su
ls /root
При использовании ./test.sh
в качестве обычного пользователя вместо запуска ls
от имени суперпользователя и выхода, он переключается в режим root; и когда я выхожу, он выполняется ls /root
как обычный пользователь.
Кто-нибудь может рассказать мне о механизме об этом?
sudo su
заставляет мои глаза болеть.sudo -s
, хотя?sudo su
потому что я более привык к опциям,su
чем к тем, которые у меня естьsudo
. Я знаю параметры sudo достаточно хорошо, но могу набрать su быстрее. Но да, я думаю, это значит, что я недостаточно хорошо знаю sudo.sudo -i
что вsu -
то время какsudo -s
работает какsu
(без черты)Ответы:
Команды в скрипте выполняются одна за другой, независимо. Сам скрипт, как родитель всех команд в скрипте, является другим независимым процессом, а команда su не изменяет и не может изменить его на root: команда su создает новый процесс с привилегиями root.
После завершения этой команды su родительский процесс, все еще работающий от имени того же пользователя, выполнит оставшуюся часть сценария.
Что вы хотите сделать, это написать скрипт-обертку. Привилегированные команды входят в основной скрипт, например
~/main.sh
Скрипт-обертка вызывает основной скрипт с правами root, как это
Для запуска этого процесса вы запускаете оболочку, которая, в свою очередь, запускает основной скрипт после переключения пользователя на пользователя root.
Эту технику обертки можно использовать, чтобы превратить скрипт в обертку вокруг себя. В основном проверьте, работает ли он как root, если нет, используйте su для повторного запуска.
$ 0 - это удобный способ заставить скрипт ссылаться на себя, а команда whoami может сказать нам, кто мы (мы root)?
Таким образом, основной скрипт со встроенной оберткой становится
Обратите внимание на использование exec. Это означает «заменить эту программу на», что фактически завершает ее выполнение и запускает новую программу, запускаемую su с root, для запуска сверху. Экземпляр замены - «root», поэтому он не выполняет правую часть ||
источник
Используйте следующее в сценарии.
Код между блоком HERE будет запущен от имени пользователя root.
источник
sudo su
вызывает две программы. Используйтеsudo -s <<HEREDOC
илиsu user <<HEREDOC
... Глупый 5-минутный лимит.Без дальнейших аргументов
su
запустим оболочку входа в систему для root. Вот что на самом деле делает первая строка вашего скрипта. При выходе, Замкнутая оболочки входа в систему , возвращается су и ваш скрипт продолжает выполнение, то есть во второй строке:ls /root
. Я думаю, что вы можете простоsudo ls /root
делать то, что вы хотите.источник
ls
, но это всего лишь пример. На самом деле мне нужно сделать намного больше вещей с привилегиями root :-) Поэтому я предпочитаю ответ @ Ankit.Как только вы запускаете
sudo su
новый процесс сuserid (euid=EUID)
использованием разветвленного суперпользователя, мы получаем новый bash с другим идентификатором процесса,(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
, вы увидите, что запущен новый bashPID say, 21570
. Выход изroot bash
приведет к уничтожению вновь разветвленного bash, возвращающегося к нему,user's bash
и, следовательно, к выполнению буферизованной командыls /root
перед освобождением приглашения.источник