Chcę zezwolić jednemu użytkownikowi na uruchomienie grep (poprzez sudo) i grep dla jednego określonego ciągu w jednym określonym pliku. Nie chcę zezwalać temu użytkownikowi na uruchomienie grep na wszystkich plikach. Użytkownik nie ma dostępu do odczytu pliku, stąd wymóg korzystania z sudo. Próbuję napisać sprawdzenie nagios, które greps plik dziennika innej usługi na komputerze.
Jednak to nie działa, sudo wciąż pyta o hasło.
Moje polecenie brzmi: sudo grep "string I want (" /var/log/thefilename.log
(tak, (
w łańcuchu jest surowe i niektóre spacje, które chcę grepować)
/etc/sudoers.d/user-can-grep
ma tę treść:
user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log
Ten plik sudoers jest własnością root:root
i ma uprawnienia-r--r-----
Serwer to zaufany Ubuntu 14.04.3 LTS.
Jak mogę to zrobić?
sudo
.grep
iwhich grep
mówi mi, że używa/bin/grep
. AFAIK w pliku sudo musisz podać pełną ścieżkę pliku binarnego, nawet jeśli wywołujesz go bez pełnej ścieżki.Odpowiedzi:
Najwyraźniej sudo spłaszcza polecenie do łańcucha przed porównaniem go ze specyfikacją w pliku sudoers. Tak więc w twoim przypadku nie musisz używać cudzysłowów ani żadnej innej formy ucieczki:
Edycja : Jak wskazuje @ user23013 w komentarzach, można to wykorzystać do grep dla „string I Want” w dowolnym pliku (a przez rozszerzenie również dla „string I” i „string”.) Proszę dokładnie rozważyć to wcześniej używając sprawdzania argumentów sudo!
Należy również pamiętać, że następujące wywołania są równoważne, tzn. Nie będzie można ograniczyć użytkowników do jednej konkretnej reprezentacji:
Wynika to z faktu, że cytaty i znaki ucieczki są obsługiwane przez powłokę i nigdy nie docierają
sudo
.źródło
sudo
że wpisałeś jedną rzecz (która pasuje do specyfikacji), ale jeśli chodzi o wykonanie, jest to coś zupełnie innego.sudoers
:user host = NOPASSWD: /usr/bin/vim Editing sudoers file
(z zamiarem umożliwienia użytkownikom edycji „Edycji pliku sudoers”) można wykorzystaćcd
, wchodząc/etc/
i uruchamiającsudo vim Editing sudoers file
. Powiedziałbym, że dla każdego polecenia o rozsądnej złożoności należy stosować podejście sugerowane w twoim komentarzu - shell zapewnia$@
zmienną, w której możesz sprawdzić, czy argumenty są pogrupowane w sposób, w jaki oczekujesz, że zostaną zgrupowane.( /var/log
dowolnym miejscu i dowiązanie symbolicznethefilename.log
do dowolnego pliku, użytkownik może wtedy grepowaćstring I want
z dowolnego pliku.grep
potrzebne narzędzieO wiele łatwiejsze do debugowania, łatwiejsze do zablokowania określonego dostępu do określonego pliku i znacznie trudniejsze do wykorzystania.
źródło
Ponieważ trzeba tylko root za dostęp do plików, należy rozważyć użycie
cat
,tee
lub coś podobnego i rurociągi, które dogrep
lub cokolwiek programu trzeba uruchomić. Np. Wsudo cat /file/path | grep …
ten sposób ograniczasz rootowanie do tego, gdzie jest to absolutnie potrzebne.źródło
sudo
jest świetne, ale czasami nie jest to najlepsze dopasowanie. Do tego lubię używaćsuper
.super
umożliwia także podwyższone uprawnienia, ale zakłada aliasy poleceń, co jest wygodne, gdy pozwala się na skomplikowane wiersze poleceń, ponieważ są one używane jako proste wiersze poleceń.twoja super.tab wyglądałaby następująco:
i będzie wywoływany jako
super grepcmd
.źródło
sudo
hasCmnd_Alias
(który może zawierać jedno lub więcej poleceń, z ograniczeniami arg lub bez nich).