2012-07-24 14 views
12

Mam skrypt powłoki, który potrzebuje konta użytkownika innego niż root, aby uruchomić określone polecenia, a następnie zmienić użytkownika na root, aby uruchomić resztę skryptu. Używam SUSE11. Użyłem oczekiwać, aby zautomatyzować monit o hasło. Ale kiedy użyję spawn su - , a polecenie zostanie wykonane, monit powróci z rootem, a reszta skryptu nie zostanie wykonana.Zmiana na użytkownika root wewnątrz skryptu powłoki

Np.

< non-root commands> 
spawn su - 
<root commands> 

Ale po su - monit zwraca z powrotem z użytkownikiem jako root. Jak wykonać pozostałe skrypty.

Opcja sudo-S nie pomaga, ponieważ nie uruchamia polecenia sudo -S ifconfig, które jest potrzebne do znalezienia adresu IP urządzenia.

już przeszły te linki, ale nie mógł znaleźć rozwiązanie: Change script directory to user's homedir in a shell script

Changing unix user in a shell script

z góry dzięki

Odpowiedz

15

sudo będą tu pracować, ale trzeba zmienić ci skrypt trochę :

$ cat 1.sh 
id 
sudo -s <<EOF 
echo Now i am root 
id 
echo "yes!" 
EOF 

$ bash 1.sh 
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse) 
Now i am root 
uid=0(root) gid=0(root) groups=0(root) 
yes! 

Musisz uruchomić swój c ommand w <<EOF zablokuj i daj blok do sudo.

Jeśli chcesz, możesz oczywiście użyć su. Ale musisz uruchomić go, używając expect/pexpect, który wprowadzi hasło.

Ale nawet sprawa może uda Ci się wprowadzić hasło automatycznie (lub wyłączyć) konstrukcja ta nie będzie działać:

user-command 
su 
root-command 

W tym przypadku root-command zostanie wykonany z użytkownikiem, a nie z uprawnieniami roota, ponieważ zostanie wykonany po zakończeniu su (su otwiera nową powłokę, nie zmienia uid bieżącej powłoki). Można użyć tego samego triku tutaj oczywiście:

su -c 'sh -s' <<EOF 
# list of root commands 
EOF 

Ale teraz masz takie same jak sudo.

1

Najprostszym sposobem na zrobienie tego jest utworzenie co najmniej dwóch skryptów.

Pierwszy powinien wywołać drugi z uprawnieniami roota. Każde polecenie wykonane w drugim skrypcie zostanie wykonane jako root.

Na przykład

runasroot.sh

sudo su-c'./scriptname.sh' 

scriptname.sh

apt-get install mysql-server-5.5 

lub cokolwiek potrzebujesz.

+0

Co jeśli zamiast rootu możemy nazwać to $ USERNAME2? Z góry dzięki. – raja777m

8

Jest prosty sposób na zrobienie tego bez drugiego skryptu. Po prostu umieść to na początku pliku:

if [ "$(whoami)" != "root" ] 
then 
    sudo su -s "$0" 
    exit 
fi 

Następnie automatycznie uruchomi się jako root. Oczywiście zakłada to, że możesz sudo su bez konieczności podawania hasła - ale to wykracza poza zakres tej odpowiedzi; zobacz jedno z innych pytań dotyczących używania sudo w skryptach powłoki, aby dowiedzieć się, jak to zrobić.

+0

Bądź ostrożny; '" 0 $ "' [może nie być tym, o czym myślisz, że jest] (http://mywiki.wooledge.org/BashFAQ/028). – ELLIOTTCABLE

+1

@ELLIOTTCABLE To interesujące, ale zakładam, że $ 0 to polecenie uruchomienia bieżącego procesu, a nie ścieżka do bieżącego pliku, więc jest trochę mniej delikatna. Mimo to, dobry punkt i bardzo pomocny link. – Benubird

+0

w przypadku monitu o hasło, użyj 'echo $ PASSWORD | sudo -S su -c "0 $" ' – Leathan

Powiązane problemy