Frage Warum funktioniert `sudo cd / var / named` nicht? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Ich möchte cd in /var/named aber es gibt mir eine Erlaubnis verweigert Fehler, und wann ich verwenden möchte sudo Um dies zu tun, bin ich nicht erlaubt. Was ist der technische Grund dafür, und ist es möglich, dies anders zu machen?


148
2018-05-06 19:02


Ursprung




Antworten:


Der Grund, warum Sie dies nicht tun können, ist einfach und zweifach

1

cd ist kein Programm, sondern ein eingebauter Befehl und sudo gilt nur für Programme.

sudo foo bedeutet, führe das Programm foo als root aus

sudo cd /path kehrt zurück

sudo: cd: command not found

weil cd ist kein Programm.

2

Wenn es möglich wäre zu verwenden Sudo zu cd in ein geschütztes Verzeichnis, nachdem Sie den Befehl ausgeführt haben sudo cd /var/named Sie würden sich als normaler Benutzer in diesem Verzeichnis befinden, aber normale Benutzer dürfen sich nicht in diesem Verzeichnis befinden.

Das ist nicht möglich.

Problemumgehung:

Sie können verwenden sudo -i sich zum Super User zu erheben. Beispielsweise:

sudo -i
cd /var/named 

Sie sind jetzt als root angemeldet und können die von Ihnen gewünschten Befehle verwenden. Wenn fertig, tippen Sie ein exit und Sie sind wieder als normaler Benutzer angemeldet.


206
2018-05-06 19:30



Technisch cd ist sowohl ein eingebauter als auch ein externer Befehl. unix.stackexchange.com/questions/50058/... - kojiro
@kojiro Ubuntu nicht; zumindest in einer sauberen Installation; haben /usr/bin/cd nur das eingebaute - Warren Hill
Zu Punkt 2: Wenn Sie sudo -i (oder sudo su) dann cd /var/named und dann su normaluser... können Sie das tun? - Alvin Wong
@AlvinWong Warum nicht versuchen und herausfinden? Gerade getestet, wenn Sie sudo -i dann cd zu einem Verzeichnis, in dem du nicht sein solltest su normal_user dann pwd zeigt an, dass Sie sich im geschützten Verzeichnis befinden ls funktioniert nicht ls: cannot open directory.: permission denied - Warren Hill
Workaround funktionierte. - Nino Škopac


Das ist, weil cd ist keine ausführbare Datei, es ist eine Shell-Funktion, um das Verzeichnis zu ändern.

Wenn du läufst:

type cd

du wirst bekommen:

CD ist eine Shell-Funktion

Sie können verwenden sudo -s um eine interaktive Shell zu öffnen und dann cd zu Ihrem gewünschten Verzeichnis:

sudo -s
cd /var/named

Um zu Ihrer normalen Shell zurückzukehren, drücken Sie einfach Strg+D.


25
2018-05-06 19:29





Es ist auch daran zu erinnern, cdder Status als Shell-Built-in oder externe Binärdatei ungeachtet, sudo arbeitet, indem es einen neuen Prozess erzeugt, um den angegebenen Befehl auszuführen.

Warum ist das wichtig? Weil der grundlegende Ausführungsablauf von sudo etwas sehr ähnliches ist:

  1. Die Shell erzeugt einen Subprozess zum Ausführen von sudo mit den angegebenen Parametern
  2. Sudo authentifiziert den Benutzer und bestätigt sein Recht, den angegebenen Befehl auszuführen
  3. sudo erzeugt einen Unterprozess, um den angegebenen Befehl auszuführen
  4. sudo wartet darauf, dass der in Schritt 3 erzeugte Subprozess beendet wird
  5. Sudo beendet sich und kehrt zur Shell zurück
  6. Der in Schritt 1 erstellte Subprozess wird beendet, und der Benutzer kehrt zur Shell-Eingabeaufforderung zurück

(Dies kann Sein technisch etwas falsch; es gibt tatsächlich einen Systemaufruf ersetzt der laufende Prozess mit einem neuen (das ist die C-Bibliothek execve()). Für die Zwecke dieser Erklärung sind die beiden gleichwertig.)

Dies wird wichtig, wenn Sie berücksichtigen, dass das aktuelle Arbeitsverzeichnis eine Eigenschaft jedes Prozesses ist und ist geerbt, aber nicht gefördert. Wenn also Prozess A einen neuen Prozess B hervorbringt, dann beginnt Prozess B mit demselben Arbeitsverzeichnis, in dem sich Prozess A befand. (Deshalb etwas so Alltägliches wie ls ./tut, was Sie erwarten würden.) Aber wenn sich Prozess B ändert es ist Arbeitsverzeichnis, dann, wenn Prozess A nicht aus dem Weg sucht, ist A sich dieser Änderung nicht bewusst. (Dies ist wiederum der Grund, wenn Sie etwas wie find / und brich sie auf halbem Wege ab, du landest nicht an einer scheinbar zufälligen Stelle im Dateisystem, nur weil Find zufällig dort war, als es abgebrochen wurde.)

Also auch wenn sudo cd /somewhere tat genau, was es auf der Dose zu der Zeit sagt sudo Ausgänge, Sie werden direkt dorthin zurückgebracht, wo Sie angefangen haben. Daher wird es effektiv aus der Sicht des Benutzers zu einem No-Op. Die Tatsache, dass cd, während es ausgeführt wurde, nannte das chdir() System Library-Funktion, um ein neues Arbeitsverzeichnis zu setzen, hilft Ihnen, dem Benutzer nicht.

Wie Warren Hill wies darauf hin, die richtige Lösung (Ich würde es eigentlich nicht als Workaround bezeichnen) ist zu verwenden sudo -i Das bringt Sie zu einer Root-Shell, wo Sie frei im Dateisystem navigieren und beliebige Befehle ausführen können. Beachten Sie jedoch, dass Sie, wenn Sie diese Shell verlassen immer noch aus genau dem selben Grund, den ich oben beschrieben habe, genau dorthin zurückgebracht, wo Sie in der Verzeichnishierarchie angefangen haben.


16
2018-05-07 07:27



Diese Erklärung war nett und dein Stück über "So auch wenn sudo cd /somewhere tat genau, was es auf der Dose zu der Zeit sagt sudo geht, du wirst zurückgebracht, wo du angefangen hast. "war hilfreich. +1 - harperville


Alle obigen Antworten sind korrekt; Hier ist ein Workaround

sudo sh -c "cd restricted-dir; some_command"

12
2017-11-07 06:00



Ich mag diese Lösung am besten, weil du dein Root-Zeug machst und dann sofort in den Nicht-Root-Modus zurückkehrst, damit du nicht vergessen und große Fehler machen kannst. - GlenPeterson


Sie können die Berechtigung auch vorübergehend ändern. chmod 0775 Pfad. Stellen Sie sicher, dass Sie es bei Bedarf zurückstellen.


3
2017-11-07 17:14



Willkommen bei Ask Ubuntu! ich empfehle bearbeitenDiese Antwort wird um spezifische Details erweitert. (Siehe auch Wie schreibe ich eine gute Antwort? für allgemeine Ratschläge, welche Art von Antworten auf AskUbuntu als besonders wertvoll angesehen werden.) - David Foerster
Ich habe nicht das Recht, eine interaktive Shell mit Sudo zu betreiben, also ist das der richtige Weg. - Guillaume