BASH Scripting, su do www-data dla pojedynczego polecenia

26

Pracuję nad automatyzacją tworzenia repozytoriów subversion i powiązanych stron internetowych, jak opisano w tym poście na blogu, który napisałem . Mam problem z częścią, w której zwracam się do użytkownika danych www, aby uruchomić następującą komendę:

svnadmin create /svn/repository

Na początku skryptu znajduje się kontrola, która zapewnia, że ​​działa on jako root lub sudo, a wszystko po tym jednym poleceniu musi być uruchomione jako root. Czy istnieje dobry sposób, aby uruchomić to polecenie jako dane www, a następnie przełączyć się z powrotem na root, aby zakończyć?

Brendon Dugan
źródło

Odpowiedzi:

24

Wystarczy użyć su - www-data -c 'svnadmin create /svn/repository'w skrypcie uruchamianym przez root. Tak więc użytkownik www-data uruchamia tylko to polecenie.


Aktualizacja dla przyszłych przeglądających :

W przypadku wystąpienia "This account is currently not available"błędu rozważ użycie:

su - www-data -s /bin/bash -c 'svnadmin create /svn/repository'

(Cenna wzmianka @Petr na temat -sflagi w celu dostosowania się www-datado polityki braku logowania użytkownika)

johnshen64
źródło
1
Tak, wygląda na to, że zapomniałem podstawowej zasady skryptowania ... RTFM. Dzięki!
Brendon Dugan
15
Próbując tego, otrzymuję błądThis account is currently not available.
rubo77
Dostaję również ten błąd, ale poniższa odpowiedź futbolsalas15 działa dobrze.
Andrew
18
Użyj, su - www-data -s /bin/bash -c 'your_command'aby to zadziałało. Użytkownik www-data ma powłokę, /usr/sbin/nologinwięc bez -sparametru prowadzi do komunikatu o błędzie.
Petr
63

Słowo „su” prawdopodobnie oznacza żądanie hasła, a dane www nie mają hasła. Polecam polecenie sudo:

 sudo -u www-data command

Warunkiem jest, aby użytkownik był rootem lub był skonfigurowany w pliku sudoers

futbolsalas15
źródło
4
Wow, dlaczego nie jest to wybrana odpowiedź? Zbyt długo zajęło mi to znalezienie.
Kapitan Hypertext
3

Użyj su:

   su [options] [username]

   The options which apply to the su command are:

   -c, --command COMMAND
       Specify a command that will be invoked by the shell using its -c.
MikeyB
źródło
2
Należy zauważyć, że polecenia su nie działają z kontami, które mają wyłączone logowanie (np. Www-data). Musisz użyć sudo.
Frantumn
2

2 Możliwe podejścia :


1) sudopolecenie:

W większości przypadków będziesz miał dostęp do sudopolecenia, więc rozwiązaniem jest po prostu:

sudo -u target_user target_command


2) supolecenie (jeśli sudo nie jest zainstalowane. Ex. alpine-linux images):

su - target_user -c 'target_command'

W przypadku pojawienia się błędu „To konto jest obecnie niedostępne” , użytkownik stosuje zasady braku logowania (dostępu do powłoki). Jeśli tak, rozważ użycie:

su - target_user -s /bin/bash -c 'target_command'

(Na podstawie cennego komentarza @Petr na temat -sflagi, aby uwzględnić www-datazasady braku logowania użytkownika)

Lodziarz
źródło