Warum kannst du nicht Sudo-Geschichte?

1657
StackOverflowed

Wenn ich den bash-Verlauf von root anzeigen möchte, warum kann ich nicht einfach laufen sudo history? Wenn ich es tue, wird gesagt, dass der Befehlsprotokoll nicht gefunden wurde, aber wenn ich ihn ohne Sudo starte, läuft er einwandfrei.

Bearbeiten: Es ist eine doppelte Antwort, aber keine doppelte Frage an die verknüpfte. Die Person, die eine der Fragen stellt, wird nicht wissen, dass es sich hierbei um einen Shell-integrierten Befehl handelt, im Gegensatz zu einem Binärcode.

4
Mögliches Duplikat von [Warum funktioniert "Sudo-CD" nicht?] (Https://superuser.com/questions/241129/why-wont-sudo-cd-work) zondo vor 7 Jahren 3
Dieses mögliche doppelte Q ist im Wesentlichen die Antwort - `history` ist ein bash-Befehl. Möglicherweise gibt es andere Protokolle, die aufzeichnen, was sudo schon gemacht hat Xen2050 vor 7 Jahren 0
Das ist eine doppelte Antwort, aber keine doppelte Frage. Die Person, die eine der Fragen stellt, wird nicht wissen, dass es sich hierbei um einen Shell-integrierten Befehl handelt, im Gegensatz zu einem Binärcode. StackOverflowed vor 7 Jahren 1
Das ist wahr ... Ich lese meinen Kommentar, den sie dann kennen würden ;-) Vielleicht werde ich eine Antwort posten, wie ich ein binäres vs builtin geprüft habe Xen2050 vor 7 Jahren 0

2 Antworten auf die Frage

5
Xen2050

historyist ein bash Shell Builtin Befehl und sudofunktioniert nicht mit Shell Builtins.


Was ist ein eingebauter Befehl und was nicht?

Ich habe den Befehl verwendet which, "der die Pfadnamen der Dateien (oder Links) zurückgibt, die in der Umgebung ausgeführt werden", um zu bestätigen, dass historyes sich nicht um einen externen Befehl (für Bash) handelt.

Zum Beispiel laufen

$ which history $ 

gibt nichts zurück und der Exit-Code ist 1 (ein oder mehrere angegebene Befehle sind nicht vorhanden oder nicht ausführbar) [FYI siehe den Exit-Code mit echo $?] während der Ausführung

$ which ls /bin/ls $ 

und der Exit-Code 0 (alle angegebenen Befehle werden gefunden und ausführbar).

In bash können Sie auch Hilfe zu integrierten Befehlen mit help(oder zum Durchsuchen der man bashSeite) suchen . Zum Beispiel eingeben

$ help history history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...] Display or manipulate the history list. ... 

zeigt die Hilfeinformationen von bash. Beim Laufen wird help non-bash-commandetwas ähnliches angezeigt:

$ help ls bash: help: no help topics match `ls'. Try `help help' or `man -k ls' or `info ls'. 

und der Exit-Code 1


Also, was hat Sudo gemacht?

Sie können Ihren eigenen Verlauf nach sudoBefehlen durchsuchen, die Ihr Benutzer ausgeführt hat (und das Überspringen des Verlaufs im Verlauf nicht übersprungen hat), mit grep '^sudo' .bash_historyoder history|lessoder ähnlich.

Auf Ubuntu wird die Datei /var/log/auth.logaufgezeichnet, was sudofür alle Benutzer getan wurde. Suchen Sie dort nach "sudo" (andere Distributionen verwenden möglicherweise die Datei /var/log/secure) oder können sie verwenden

sudo grep sudo /var/log/auth.log 

oder laufen, sudo journalctl _COMM=sudowenn du systemd hast.

Weitere Informationen finden Sie in der Frage "Details zu Sudo-Befehlen, die von allen Benutzern ausgeführt werden" unter Unix und Linux

2
Gordon Davisson

historyist ein bash builtin, kein regulärer Befehl; sudoEs startet keine Shell, um den Befehl auszuführen, den Sie ihm geben, es versucht nur, es direkt auszuführen (als regulärer Befehl), daher ist es nicht verfügbar.

Sie können verwenden sudo bash, um einen Root-Shell-Befehl zu öffnen und dann auszuführen history, aber wenn Sie einen Einzeiler wünschen, ist es etwas kompliziert. bash aktiviert den Verlaufsmechanismus nur, wenn er im interaktiven Modus ausgeführt wird. Wenn Sie etwas tun sudo bash -c history(der -cBefehl bash "Hier ist der Befehl, den Sie ausführen möchten:"), wird er als nicht interaktiver Modus behandelt und nicht wirklich angezeigt irgendeine Geschichte. Selbst das Hinzufügen -i(für den interaktiven Modus) hat beim Testen nicht funktioniert. Aber das tat:

sudo bash -i <<<history 

Beachten Sie, dass dies <<<nur eine Bash-Funktion ist. In anderen Shells müssen Sie echo history | sudo bash -istattdessen verwenden.