Ich möchte einem Benutzer erlauben, grep (über sudo) auszuführen und nach einer bestimmten Zeichenfolge in einer bestimmten Datei zu suchen. Ich möchte nicht zulassen, dass dieser Benutzer grep für alle Dateien ausführen kann. Der Benutzer hat keinen Lesezugriff auf die Datei, daher muss sudo verwendet werden. Ich versuche, eine Nagios-Überprüfung zu schreiben, die die Protokolldatei eines anderen Dienstes auf dem Computer abruft.
Es funktioniert jedoch nicht, sudo fragt nach einem Passwort.
Mein Befehl lautet: sudo grep "string I want (" /var/log/thefilename.log
(Ja, es gibt ein RAW (
und einige Leerzeichen in der Zeichenfolge, die ich abfragen möchte.)
/etc/sudoers.d/user-can-grep
hat diesen Inhalt:
user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log
Diese sudoers-Datei gehört root:root
und hat Berechtigungen-r--r-----
Der Server ist Ubuntu Trusty 14.04.3 LTS.
Wie kann ich das schaffen?
sudo
.grep
, undwhich grep
sagt mir, dass es verwendet/bin/grep
. AFAIK in sudo-Datei müssen Sie den vollständigen Pfad der Binärdatei angeben, auch wenn Sie es ohne den vollständigen Pfad aufrufen.Antworten:
Anscheinend reduziert sudo den Befehl in einen String, bevor er mit einer Spezifikation in der sudoers-Datei verglichen wird. In Ihrem Fall müssen Sie also keine Anführungszeichen oder andere Formen der Flucht verwenden:
Edit : Wie @ user23013 in den Kommentaren vermerkt, kann dies ausgenutzt werden, um in jeder Datei nach "string I want" zu suchen (und in der Erweiterung auch nach "string I" und "string".) mit sudos argument überprüfung!
Beachten Sie auch, dass die folgenden Aufrufe gleichwertig sind, dh Sie können Benutzer nicht auf eine bestimmte Darstellung beschränken:
Dies liegt an der Tatsache, dass Anführungszeichen und Escapezeichen von der Shell gehandhabt werden und niemals erreicht werden
sudo
.quelle
sudo
Sie eine Sache eingegeben haben (die der Spezifikation entspricht), aber wenn es darum geht, sie auszuführen, ist es etwas ganz anderes.sudoers
:user host = NOPASSWD: /usr/bin/vim Editing sudoers file
(mit Absicht, damit Benutzer bearbeiten „Bearbeiten sudoers - Datei“) durch ausgenutzt werdencd
‚ing in/etc/
Laufensudo vim Editing sudoers file
. Ich würde sagen, dass für jeden Befehl von angemessener Komplexität der in Ihrem Kommentar vorgeschlagene Ansatz verwendet werden sollte. Die Shell bietet eine$@
Variable, mit der Sie überprüfen können, ob die Argumente so gruppiert sind, wie Sie es erwarten.( /var/log
beliebigen Stelle und verknüpfen Sie ihnthefilename.log
mit einer beliebigen Datei. Der Benutzer kann dannstring I want
von jeder beliebigen Datei aus zugreifen .grep
Sie in diesem Skript das benötigte ausEs ist viel einfacher zu debuggen, es ist einfacher, den Zugriff auf eine bestimmte Datei zu sperren und es ist viel schwieriger, sie auszunutzen.
quelle
Da Sie nur root für den Dateizugriff benötigen, sollten Sie erwägen
cat
, diesestee
oder ein ähnlichesgrep
Programm zu verwenden und es an das Programm weiterzuleiten, das Sie ausführen müssen. Aufsudo cat /file/path | grep …
diese Weise beschränken Sie root darauf, wo Sie es unbedingt brauchen.quelle
sudo
ist toll, aber manchmal ist es nicht die beste Passform. Dafür nutze ich gernesuper
.super
Erlaubt auch erhöhte Berechtigungen, setzt jedoch Befehls-Aliase voraus, was praktisch ist, wenn komplizierte Befehlszeilen zugelassen werden, da sie als einfache Befehlszeilen verwendet werden.Ihre super.tab würde so aussehen:
und würde aufgerufen werden als
super grepcmd
.quelle
sudo
hasCmnd_Alias
(der einen oder mehrere Befehle mit oder ohne Argumentbeschränkungen enthalten kann).