Monituj użytkownika o zalogowanie się jako root podczas uruchamiania skryptu powłoki

17

Problem, który otrzymuję, kiedy wpisuję polecenie,

su - root

na początku mojego pliku skryptu powłoki monituje użytkownika o podanie hasła, a następnie NIE kontynuuje reszty skryptu powłoki. Następnie muszę ręcznie zlokalizować i uruchomić skrypt powłoki za pomocą terminala. Chcę, aby skrypt upewnił się, że użytkownik zaloguje się jako root, a następnie kontynuuje resztę skryptu powłoki.

Innymi słowy, chcę uruchomić skrypt jak każdy użytkownik, ale jak tylko skrypt zacznie się uruchamiać, użytkownik musi przejść do rootowania, a następnie kontynuować pracę z resztą skryptu jako root, dopóki nie zostanie wykonane. Czy można to zrobić?

Redson
źródło

Odpowiedzi:

34

Jest to bardzo łatwe do osiągnięcia:

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

Gdy bieżący użytkownik nie jest rootem, uruchom skrypt ponownie sudo.

Zauważ, że używam sudotutaj zamiast su. Jest tak, ponieważ pozwala zachować argumenty. Jeśli użyjesz su, twoje polecenie musiałoby być takie, su -c "$0 $@"które zmieszałoby twoje argumenty, jeśli mają spacje lub specjalne znaki powłoki.

Jeśli twoja powłoka jest bash, możesz uniknąć zewnętrznego połączenia z whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"
Patrick
źródło
Przepraszam, popełniłem błąd w wyjaśnieniu, więc mógł zostać źle zinterpretowany. Oto jaśniejsze wyjaśnienie. Dzięki za pomoc!
Redson
@ user68857 Twoje pytanie było jasne. Ta odpowiedź robi dokładnie to, co chcesz.
Patrick
ciągle
pojawia
chcę uruchomić skrypt jako zwykły użytkownik za pośrednictwem terminala, ale skrypt powinien następnie przełączyć użytkownika na root do końca skryptu
Redson
@Nosscire, jeśli dostajesz sudo: must be setuid root, wtedy coś się stało z twoim sudo. Aby to naprawić: chmod u+s $(which sudo). I tak, jestem w pełni świadomy tego, co próbujesz zrobić, robię to samo przez cały czas w moich skryptach.
Patrick
7

Możesz również sprawdzić identyfikator UID:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi
zatoczka
źródło
5

Możesz wywołać sam skrypt i sprawdzić:

#! /bin/bash

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

...
Hauke ​​Laging
źródło
0

W miejscu, w którym chcesz się zalogować, po prostu dodaj następujące polecenie

sudo su

Działa to doskonale z moim kodem

użytkownik245333
źródło