2009-10-29 26 views
11

Mam skrypt bash, który instaluje niektóre oprogramowanie. Chcę jak najszybciej zawieść, jeśli nie jest uruchamiany przez root. Jak mogę to zrobić?bash: niepowodzenie, jeśli skrypt nie jest uruchamiany przez root

+1

Chociaż generalnie bym * * uznają to głupie zachowanie: * Niech go uruchomić dopóki uprawnienia nie *; system może być skonfigurowany w taki sposób, aby operacja mogła zostać wykonana pomyślnie jako bieżący użytkownik i przez wymuszenie rootowania ta opcja została usunięta [Musiałem naprawić skrypty, które wcześniej przyjęły podobne założenia]. Z drugiej strony, mam o wiele więcej sprawy, aby * zapobiec * dostępowi lub wyświetlać duże, grube ostrzeżenie, jeśli uruchomione jako root. –

+0

Powinieneś spróbować użyć sudo. Pod Linuksem, kiedy instalujesz cokolwiek, musisz być rootem, aby uniemożliwić zwykłym użytkownikom instalowanie wszystkiego, co może uszkodzić system. – masterLoki

+1

Chce, aby jego skrypt uwzględniał fakt, że niektórzy mogą zapomnieć, lub nie są świadomi sudo (lub innych sposobów eskalacji przywilejów). Jego dobrą praktyką jest sprawdzenie poczytalności w czasie pracy przed próbą zrobienia czegokolwiek innego. –

Odpowiedz

27
#!/bin/bash 
if [ "$(id -u)" != "0" ]; then 
    echo "This script must be run as root" 1>&2 
    exit 1 
fi 

Źródło: http://www.cyberciti.biz/tips/shell-root-user-check-script.html

+0

lub, aby go skrócić, sprawdź UID env: , jeśli [[$ UID -ne 0]]; następnie – zlack

+1

@ Ulack $ UID poda identyfikator UID oryginalnego użytkownika, jeśli skrypt jest uruchamiany przez 'sudo', podczas gdy David będzie traktował skrypt jako uruchamiany jako root. W zależności od tego, co robisz, David jest prawdopodobnie lepszy. – pr1001

+0

Jak mówi pr1001, UID nie działa, jeśli użytkownik uruchamia skrypt za pomocą sudo, ale EUID będzie działał dobrze. – Tom

5

Po kopania wokół na to, konsensus wydaje się, że nie ma potrzeby korzystania id -u w bash, jako zmienna EUID (efektywny identyfikator użytkownika) zostaną ustawione. W przeciwieństwie do UID, EUID będzie 0, gdy użytkownik jest root lub przy użyciu sudo. Najwyraźniej jest to około 100 razy szybciej niż bieganie id -u:

#!/bin/bash 
if ((EUID != 0)); then 
    echo "You must be root to do this." 1>&2 
    exit 1 
fi 

Źródło: https://askubuntu.com/questions/30148/how-can-i-determine-whether-a-shellscript-runs-as-root-or-not

+2

to jednak nie działa w powłoce Bourne'a. Czy masz jakieś ściśle zgodne z POSIX rozwiązania? –

Powiązane problemy