Mam skrypt uruchamiany z crontab użytkownika nieuprzywilejowanego, który wywołuje niektóre polecenia za pomocą sudo
. Tyle że nie. Skrypt działa dobrze, ale polecenia sudo'ed po cichu zawodzą.
Skrypt działa idealnie z powłoki jako dany użytkownik.
Sudo nie wymaga hasła. Użytkownik, o którym mowa, ma
(root) NOPASSWD: ALL
dostęp przyznany w/etc/sudoers
.Cron jest uruchomiony i wykonuje skrypt. Dodanie prostego
date > /tmp/log
generuje dane wyjściowe we właściwym czasie.To nie jest problem z uprawnieniami. Ponownie skrypt jest wykonywany, tylko nie sudo'ed polecenia.
To nie jest problem ze ścieżką. Uruchomienie
env
z poziomu uruchamianego skryptu pokazuje poprawną$PATH
zmienną, która zawiera ścieżkę do sudo. Uruchamianie go przy użyciu pełnej ścieżki nie pomaga. Wykonywane polecenie otrzymuje pełną nazwę ścieżki.Próba przechwycenia danych wyjściowych polecenia sudo, w tym STDERR, nie pokazuje niczego przydatnego. Dodanie
sudo echo test 2>&1 > /tmp/log
do skryptu powoduje utworzenie pustego dziennika.Sam plik binarny sudo działa poprawnie i rozpoznaje, że ma uprawnienia, nawet gdy jest uruchamiany z crona wewnątrz skryptu. Dodanie
sudo -l > /tmp/log
do skryptu tworzy wynik:Użytkownik ec2-user może uruchomić następujące polecenia na tym hoście:
(root) NOPASSWD: ALL
Analiza kodu wyjścia polecenia za pomocą $?
pokazuje, że zwraca błąd (kod wyjścia:) 1
, ale wydaje się, że nie wystąpił żaden błąd. Polecenie tak proste, jak /usr/bin/sudo /bin/echo test
zwraca ten sam kod błędu.
Co jeszcze może się dziać?
Jest to niedawno utworzona maszyna wirtualna z najnowszą wersją AMI Amazon Linux. Plik crontab należy do użytkownika, ec2-user
a plik sudoers jest domyślną dystrybucją.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers
a mój mózg zaczął krzyczeć zbyt głośno, by móc dalej czytać.sudo
prawami / tylko / dla poleceń potrzebnych w skrypcie i całkowite wyłączenie jego możliwości logowania.Odpowiedzi:
Sudo ma kilka specjalnych opcji w swoim pliku uprawnień, z których jedna pozwala ograniczyć jego użycie do powłok działających w TTY, co nie jest cronem.
Niektóre dystrybucje, w tym Amazon Linux AMI, mają tę opcję domyślnie włączoną.
/etc/sudoers
Plik będzie wyglądać mniej więcej tak:Gdybyś przechwycił dane wyjściowe do STDERR na poziomie skryptu powłoki, a nie samej komendy sudo, wyglądałbyś na taki komunikat:
Rozwiązaniem jest umożliwienie działania sudo w środowiskach innych niż TTY poprzez usunięcie lub skomentowanie tych opcji:
źródło