
Gibt es eine Möglichkeit, den Befehl mit Superuser-Befugnissen auszuführen, cd
um Zugriff auf Verzeichnisse zu erhalten, die root gehören? Wenn ich ausführe sudo cd <path>
, erhalte ich sudo: cd: command not found
.
Antwort1
Die andere Antwort ist nicht falsch.
Möglicherweise ist eine bessere Antwort:
Das Tool „sudo“ ist dazu gedacht, Aktionen als Superuser auszuführen, und Sie beschreiben eher etwas, das einer Statusänderung gleichkommt, die Aktionen wie „ls“ oder „vi“ oder anderen vorausgehen würde, um sie einfacher zu machen.
Ich schlage beispielsweise vor, wenn Sie eine Datei in /root/private/ bearbeiten möchten:
sudo ls /root
sudo ls /root/private
sudoedit /root/private/<name from previous ls command>
Das ist definitiv mehr Tipparbeit und etwas schwieriger als nur das Ändern von Verzeichnissen. Es ist jedochweitbesser überprüfbar und viel mehr im Einklang mit den Prinzipien hinter sudo als die Ausführung einer Variante von „sudo bash“.
Wenn Sie in einer sicheren Umgebung arbeiten, wird Ihr IA-Team Ihnen dafür danken. Wenn Sie sich fragen: „Welche Änderung habe ich neulich vorgenommen?“, dannDuwird es Ihnen danken, weil Sie sich nicht fragen müssen, welche Datei oder Dateien Sie bearbeitet haben.
Abgesehen davon ist es definitiv einfacher, eine Art „sudo bash“ zu aktivieren und auszuführen. Wenn Sie nach einer einfacheren Lösung suchen, warum verwenden Sie dann überhaupt „sudo“, anstatt sich einfach als Root anzumelden?
Antwort2
Wie Sie bemerkt haben, cd
ist es ein in die Shell integrierter Befehl undes gibt einen Grunddafür: das "aktuelle Verzeichnis" ist ein prozessspezifischer Parameter, der nur vom Prozess geändert werden kannselbst.
Das Arbeitsverzeichnis Ihrer Shell kann von keinem untergeordneten Prozess geändert werden. Selbst wenn Sie es also schaffen, cd
eine Subshell mit Privilegien auszuführen, wird nur das Arbeitsverzeichnis dieser temporären Subshell geändert und es spielt keine Rolle, welche Methode Sie zum Erhöhen der Privilegien verwenden.
Damit sudo cd
sudo selbst funktioniert, müsste es eine integrierte Shell sein und es müsste eine Möglichkeit geben, die Berechtigungen eines bereits laufenden Prozesses zu erhöhen. Derzeit gibt es unter Linux (und den meisten anderen Betriebssystemen) keinen solchen Mechanismus.
Eine Möglichkeit, Ihr Ziel zu erreichen, besteht darin,interaktivShell mit Root-Rechten (jede Methode funktioniert) und verwenden Sie cd
darin einfach das Normale:
[user@host /]$ sudo bash
[root@host /]# cd /root/secret
Wenn Sie alles mit einem Befehl erledigen möchten, müsste es folgendermaßen aussehen: Ändern Sie zuerst das Arbeitsverzeichnis und starten Sie dann eine interaktive Shell:
sudo bash -c "cd /root/secret && bash"
su -c "cd /root/secret && zsh"
Hinweis: Der äußere Befehl muss keine Shell sein, es muss nuretwasdas sein Arbeitsverzeichnis wechselt und einen neuen Befehl ausführt. Neuere Linux-Systeme haben ein oder zwei Helfer, die verwendet werden könnten:
sudo nsenter --wd="/root/secret" bash # util-linux v2.23 (debian jessie)
sudo env --chdir="/root/secret" bash # coreutils v8.28 (debian buster)
Der Vorteil dieser Methode besteht darin, dass keine verschachtelten Anführungszeichen erforderlich sind. Sie können einen aus mehreren Wörtern bestehenden Befehl ausführen, ohne Probleme mit Leerzeichen oder Sonderzeichen zu bekommen.
Schließlich verfügen einige Programme über eine integrierte Option zum Ändern ihres Arbeitsverzeichnisses:
sudo make -C /etc
sudo git -C /root/secret log
Antwort3
Der schnellste Weg, das zu tun, was ich tun musste, war dieser:
sudo -s
Wie beschrieben indiese Antwort.