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: ALLdostęp przyznany w/etc/sudoers.Cron jest uruchomiony i wykonuje skrypt. Dodanie prostego
date > /tmp/loggeneruje 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
envz poziomu uruchamianego skryptu pokazuje poprawną$PATHzmienną, 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/logdo 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/logdo 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 testzwraca 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-usera plik sudoers jest domyślną dystrybucją.
sudoprawami / tylko / dla poleceń potrzebnych w skrypcie i całkowite wyłączenie jego możliwości logowania.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoersa mój mózg zaczął krzyczeć zbyt głośno, by móc dalej czytać.