Jak uruchomić zadanie cron za pomocą polecenia sudo

118

Czy można uruchomić zadanie cron, które wymaga polecenia sudo ?

Lubić:

 sudo rm somefile
sayem siam
źródło
Witamy Sayem Siam, spójrz na odpowiedzi na to pytanie askubuntu.com/questions/2368/how-do-i-setup-cron-job . jak myślę, że twoje pytanie zostało już zadane tutaj w AU
stephenmyall,
1
Próbuję uruchomić sudo, które wymaga hasła, ale jak mogę podać hasło z pliku cron
sayem siam
3
@sayemsiam nie musisz umieszczać sudo, po prostu edytuj crontab root.
Braiam
Zobacz tę odpowiedź .
sampablokuper

Odpowiedzi:

239

Nie będę się zastanawiał, jak bardzo to zły pomysł; najprościej mówiąc, uruchamianie sudow crontab wymaga, aby twoje hasło było przechowywane gdzieś w postaci zwykłego tekstu.

To zły pomysł.


Poniżej przedstawiono preferowaną metodę uruchamiania zadań administracyjnych za pośrednictwem crona. Ponieważ tak naprawdę nie musisz pisać sudow pliku crontab, jeśli modyfikujesz plik crontab roota.

Użyj crontab roota

Uruchom następujące polecenie:

sudo crontab -e

To otwiera rootcrontab. sudonie jest konieczne uruchamianie polecenia w tym kontekście, ponieważ i tak zostanie ono wywołane root.

Dlatego po prostu dołączałbyś następujące do crontab roota.

@hourly rm somefile

Teraz, jeśli absolutnie chcesz być niebezpieczny i podejmować ryzyko związane z hasłem, następujące polecenie uruchomi polecenie z własnego pliku crontab i automatycznie wprowadzi hasło po wyświetleniu monitu sudo.

Ponownie nie jest to zalecane .


Napisz na swoim crontabie polecenie tak:

@hourly echo "password" | sudo -S rm somefile

Oczywistą wadą jest to, że jeśli ktokolwiek kiedykolwiek uzyska dostęp do twojego crontab, twoje hasło będzie czytelne w postaci zwykłego tekstu.

Nie powinieneś tego robić.

SirCharlo
źródło
1
Cieszę się, że to działa! Uważaj tylko na wszelkie dziury w zabezpieczeniach, które zostawiłeś za sobą. Mogą później wrócić i cię prześladować.
SirCharlo,
1
@ SirCharlo Dlaczego warto korzystać rootz crontab użytkownika zamiast crontab z całego systemu /etc/crontab?
Eliah Kagan,
1
@Elijah dlaczego nie?
SirCharlo,
2
Ta odpowiedź pomija znak, ponieważ przeskakuje subtelności dostępne w twoim sudoerspliku, takie jak grupy sudo bez hasła.
brent
bardzo, bardzo przydatny punkt, dziękuję za wspaniałą pomoc.
Nasser Mansouri,
33

Jeśli wstawiasz skrypt z jednego z katalogów cron ( /etc/cron.*), nie musisz używać sudo, ponieważ działa on jako root.

Jeśli używasz crontab, to będziesz chciał użyć crontab roota. Spowoduje to uruchomienie go jako root, a także nie będzie potrzebował sudo.

sudo crontab -e
tgm4883
źródło
1
Umieściłbym również polecenie w /etc/cron.hourly/something. Po to są te katalogi.
John S Gruber,
3
Nie. Możesz umieścić go w /etc/cron.SOMETHING/SCRIPT, ale nie zrobiłbym obu. Oba dałyby mniej więcej tę samą funkcję, chociaż używając crontab miałbyś nieco większą moc nad tym, jak często / kiedy rzeczy działają.
tgm4883,
1
Powinienem był wyjaśnić, że miałem na myśli to jako alternatywę. Dzięki.
John S Gruber,
3

Uruchom następujące polecenie w terminalu

sudo visudo

Dodano następujący wiersz na końcu pliku:

vidyadhar  ALL= NOPASSWD: /bin/rm

W powyższym przykładzie vidyadhar jest nazwą użytkownika i nie prosi o hasło, jeśli uruchamiasz komendę rm przez vidyadhar.

Vidyadhar
źródło
17
Hmm .. Więc każde złośliwe polecenie, takie jak sudo rm -rf 'slash'( nie uruchamiaj tego polecenia ), uruchamiane od tego użytkownika, nie wymagałoby hasła. Nie wiem, wydaje się niebezpieczne, nie?
SirCharlo,
Tak, wiem o tym. Twoje podejście jest dobre. Ale używam powyższego podejścia do nadawania uprawnień innemu użytkownikowi do zatrzymania / uruchomienia niektórych usług.
Vidyadhar,
24
To bardzo zły pomysł. Proszę nie rób tego.
bkanuka
2
Może vidyadhar ALL= NOPASSWD: /bin/rm somefilebyłoby bardziej bezpieczne.
Wernfried Domscheit
To okropny pomysł. Dałeś uprawnień koc sudo do RM. Zamiast tego, daj uprawnienia sudo do skryptu, w którym masz komendę, włączając w to rm lub inne w tym skrypcie, uczyń go wykonywalnym, a następnie daj uprawnienia sudo do tego skryptu. <username> ALL=(ALL) NOPASSWD: /home/<username>/bin/<script>, co byłoby znacznie bezpieczniejsze.
RJ