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

17

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

su - root

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

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

Redson
источник

Ответы:

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
ручей
источник
5

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

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...
Хауке Лагинг
источник
0

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

sudo su

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

user245333
источник