2012-04-19 11 views
52

Chcę napisać skrypt powłoki, aby zautomatyzować serię poleceń. Problem polega na tym, że niektóre polecenia MUSZĄ być uruchamiane jako superużytkownik, a niektóre polecenia NIE MOGĄ być uruchamiane jako superuser. Co mam zrobić tak daleko jest coś takiego:Jak napisać skrypt powłoki, który uruchamia niektóre polecenia jako superuser i niektóre polecenia nie jako superuser, bez konieczności opiekowania się nim?

#!/bin/bash 

command1 
sudo command2 
command3 
sudo command4 

Problemem jest, oznacza to, że ktoś musi czekać aż polecenie1 kończy zanim się monit o hasło, a następnie, jeśli command3 trwa wystarczająco długo, będą następnie muszą czekać na zakończenie komendy3. Byłoby miło, gdyby osoba mogła wstać i odejść, a potem wrócić godzinę później i być skończona. Na przykład, poniższy skrypt ma ten problem:

#!/bin/bash 

sleep 310 
sudo echo "Hi, I'm root" 
sleep 310 
sudo echo "I'm still root?" 

Jak mogę to zrobić tak, że użytkownik może wprowadzić swoje hasło tylko raz, na samym początku, a następnie odejść?

Aktualizacja:

Dzięki za odpowiedzi. Biegnę na Mac OS X Lion i pobiegł scenariusz Stephen P i mam różne wyniki: (ja również dodaje $ HOME)

[email protected] scratch$ ./test2.sh 
uid is 501 
user is pair 
username is 
home directory is /Users/pair 
[email protected] scratch$ sudo ./test2.sh 
Password: 
uid is 0 
user is root 
username is root 
home directory is /Users/pair 

Odpowiedz

42

pliku sutest

#!/bin/bash 
echo "uid is ${UID}" 
echo "user is ${USER}" 
echo "username is ${USERNAME}" 

run to: `./sutest” daje mi

uid is 500 
user is stephenp 
username is stephenp 

ale używając sudo: sudo ./sutest daje

uid is 0 
user is root 
username is stephenp 

Zachowuje więc oryginalną nazwę użytkownika w $ USERNAME podczas uruchamiania jako sudo.Prowadzi to do rozwiązania podobnego do tego, co napisali inni:

#!/bin/bash 
sudo -u ${USERNAME} normal_command_1 
root_command_1 
root_command_2 
sudo -u ${USERNAME} normal_command_2 
# etc. 

Po prostu sudo, aby wywołać skrypt, w pierwszej kolejności poprosi o hasło.


I pierwotnie napisał tę odpowiedź na Linuksie, który ma pewne różnice z OS X

OS X (I 'm testowania to na Mountain Lion 10.8.3) ma zmienną środowiskową SUDO_USERkiedy Uruchomiono sudo, które może być użyte w miejsce powyższego USERNAME lub może być bardziej wieloplatformowe, skrypt może sprawdzić, czy SUDO_USER jest ustawiony i użyć go, jeśli tak, lub użyć USERNAME, jeśli jest to ustawione.

Zmiana oryginalnego skryptu dla OS X, staje ...

#!/bin/bash 
sudo -u ${SUDO_USER} normal_command_1 
root_command_1 
root_command_2 
sudo -u ${SUDO_USER} normal_command_2 
# etc. 

Pierwsze ukłucie w podejmowaniu to wieloplatformowy mógłby być ...

#!/bin/bash 
# 
# set "THE_USER" to SUDO_USER if that's set, 
# else set it to USERNAME if THAT is set, 
# else set it to the string "unknown" 
# should probably then test to see if it's "unknown" 
# 
THE_USER=${SUDO_USER:-${USERNAME:-unknown}} 

sudo -u ${THE_USER} normal_command_1 
root_command_1 
root_command_2 
sudo -u ${THE_USER} normal_command_2 
# etc. 
+0

Można także powłokę skrypt, którego właścicielem jest root i ma ustawiony bit 'suid', ale może to być niebezpieczne, jeśli nie zrobisz tego poprawnie. Za każdym razem, gdy uruchamiasz skrypty powłoki jako root, możesz rozważyć użycie 'pułapki' do obsługi sygnałów. http://www.shelldorado.com/goodcoding/tempfiles.html ma kilka przykładów. –

+0

Dziwne, ja naprawdę dostaję różne wyniki. Jest to na Mac OS X Lion: '@ opactwo parę zadrapanie $/test2.sh'
' uid jest 501'
'użytkownik pair'
' nazwa to ''
katalog domowy to/Users/para. ''
para @ opactwo zarysowania $ sudo ./test2.sh ''
Hasło: ''
uid jest 0'
'użytkownik root'
' nazwa_użytkownika jest root'
'katalogiem domowym jest/Users/pair'
'pair @ abbey scratch $ sudo -u pair ./test2.sh'
'uid is 501'
'użytkownik pair'
' nazwa_użytkownika jest pair'
'katalog domowy to/Users/pair'
speedarius

+0

Przepraszamy za formatowania powyższego komentarza; Aktualizuję oryginalny wpis teraz .. – speedarius

9

należy uruchomić cały skrypt jako administrator. Jeśli chcesz wykonać jakieś polecenie jako nie-administratora, użyj „-u” opcja sudo:

#!/bin/bash 

sudo -u username command1 
command2 
sudo -u username command3 
command4 

Kiedy uruchomiony jako root, sudo nie prosi o podanie hasła.

3

Jeśli używasz tego sprawdzić man sudo też:

#!/bin/bash 

sudo echo "Hi, I'm root" 

sudo -u nobody echo "I'm nobody" 

sudo -u 1000 touch /test_user 
3

Cóż, masz kilka opcji.

Można skonfigurować sudo, aby nie pytać o hasło. Nie jest to zalecane ze względu na zagrożenia bezpieczeństwa.

Można napisać skrypt oczekiwany, aby odczytać hasło i dostarczyć go do sudo, gdy jest to wymagane, ale jest to przylegające i delikatne.

Polecam zaprojektowanie skryptu do uruchomienia jako root i porzucenie jego uprawnień, gdy nie są potrzebne. Po prostu niech to będzie sudo -u someotheruser command dla poleceń, które nie wymagają uprawnień roota.

(Jeśli muszą działać konkretnie jako użytkownik wywołujący skrypt, to możesz mieć skrypt zapisać identyfikator uid i wywołać drugi skrypt za pomocą sudo z id jako argumentem, więc wie kto ma su, aby ...)

Powiązane problemy