Предложить пользователю войти в систему как root при запуске сценария оболочки


17

Проблема, которую я получаю, когда я ввожу команду,

su - root

в начале моего файла сценария оболочки он предлагает пользователю ввести пароль, а затем НЕ переходит к остальной части сценария оболочки. Затем я должен вручную найти и запустить скрипт оболочки через терминал. Я хочу, чтобы скрипт проверял, чтобы пользователь вошел в систему как root, а затем продолжил работу с остальным сценарием оболочки.

Другими словами, я хочу запускать сценарий от имени любого пользователя, но как только сценарий начинает выполняться, пользователь должен перейти в режим root и затем продолжить работу с оставшейся частью сценария в качестве пользователя root, пока это не будет сделано. Можно ли это сделать?

Ответы:


34

Это очень легко сделать:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Если текущий пользователь не является пользователем root, повторно выполните сценарий через sudo.

Обратите внимание, что я использую sudoздесь вместо su. Это потому, что это позволяет вам сохранить аргументы. Если вы используете su, ваша команда должна быть такой, su -c "$0 $@"которая будет искажать ваши аргументы, если они имеют пробелы или специальные символы оболочки.

Если ваша оболочка bash, вы можете избежать внешнего вызова whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"

Извините, я допустил ошибку в объяснении, поэтому оно могло быть неправильно истолковано. Вот более четкое объяснение. Спасибо за помощь!
Редсон

@ user68857 Ваш вопрос был ясен. Этот ответ делает именно то, что вы хотите.
Патрик

я продолжаю получать эту ошибку: sudo: должен быть setuid root
Redson

я хочу запустить скрипт как обычный пользователь через терминал, но скрипт должен затем переключить пользователя на root до конца скрипта
Redson

@Nosscire, если вы получаете sudo: must be setuid root, то что-то случилось с вашим sudo. Чтобы исправить это: chmod u+s $(which sudo). И да, я хорошо знаю, что вы пытаетесь сделать, я все время делаю одно и то же в своих сценариях.
Патрик

7

Вы также можете проверить UID:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi


0

В точке, где вы хотите войти, просто добавьте следующую команду

sudo su

Это отлично работает с моим кодом

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.