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

144

Ich möchte cd in /var/named eingeben, aber es gibt mir einen Fehler, der permission denied, und wenn ich sudo dafür verwenden möchte, bin ich nicht erlaubt. Was ist der technische Grund dafür, und ist es möglich, dies auf andere Weise zu tun?

    
Hojat Taheri 06.05.2013, 21:02
quelle

5 Antworten

203

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, dass das Programm foo als root ausgeführt wird

sudo cd /path gibt zurück

sudo: cd: command not found

weil cd kein Programm ist.

2

Wenn es möglich wäre, sudo für cd auf ein geschütztes Verzeichnis zu verwenden, dann wäre der Befehl sudo cd /var/named in diesem Verzeichnis als normaler Benutzer, aber normalen Benutzern nicht erlaubt in diesem Verzeichnis sein.

Dies ist nicht möglich.

Workaround:

Sie können sudo -i verwenden, um sich selbst zum Super-User zu machen. Zum Beispiel:

sudo -i
cd /var/named 

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

    
Warren Hill 06.05.2013, 21:30
quelle
25

Das liegt daran, dass cd keine ausführbare Datei ist, sondern eine Shell-Funktion, um das Verzeichnis zu ändern.

Wenn Sie Folgendes ausführen:

type cd

du wirst bekommen:

  

cd ist eine Shell-Funktion

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

sudo -s
cd /var/named

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

    
Basharat Sialvi 06.05.2013 21:29
quelle
16

Beachten Sie auch, dass sudo unabhängig davon, ob der Status von cd als Shell-Built-in oder externe Binärdatei gilt, 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 auf den Unterprozess, der in Schritt 3 hervorgebracht wurde, um
  5. zu beenden
  6. sudo beendet sich und kehrt zur Shell zurück
  7. Der in Schritt 1 erstellte Subprozess wird beendet, und der Benutzer wird an die Shell-Eingabeaufforderung zurückgegeben

(Dies kann technisch etwas falsch sein; es gibt einen Systemaufruf, der den laufenden Prozess durch einen neuen ersetzt (das ist der C-Bibliothek execve() ). Für die Zwecke dieser Erklärung sind die beiden jedoch gleichwertig.)

Dies wird wichtig, wenn Sie berücksichtigen, dass das aktuelle Arbeitsverzeichnis eine Eigenschaft jedes Prozesses ist und geerbt, aber nicht heraufgestuft wird . Wenn also Prozess A einen neuen Prozess B hervorbringt, dann beginnt Prozess B mit demselben Arbeitsverzeichnis, in dem sich Prozess A befand. (Dies ist der Grund, warum etwas so Banales wie ls ./ tut, was Sie erwarten würden.) Aber wenn sich Prozess B ändert es Arbeitsverzeichnis, dann, wenn Prozess A nicht aus dem Weg sucht, dass A ist sich dieser Änderung nicht bewusst. (Dies ist der Grund, warum wenn Sie etwas wie find / ausführen und es auf halbem Wege abbrechen, landen Sie nicht an einer scheinbar zufälligen Stelle im Dateisystem, nur weil find zufällig gerade dort hingeschaut hat es wurde abgebrochen.)

Also, auch wenn sudo cd /somewhere genau das getan hat, was auf dem Kasten steht, bis zu dem Zeitpunkt, an dem sudo beendet wird, werden Sie genau 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 der Ausführung die Systembibliotheksfunktion chdir() aufgerufen hat, um ein neues Arbeitsverzeichnis zu erstellen, hilft Ihnen als Benutzer nicht.

Warren Hill wies darauf hin, die richtige Lösung (ich würde eigentlich nicht anrufen.) Es ist eine Problemumgehung), sudo -i zu verwenden, was Sie in eine root-Shell versetzt, wo Sie frei im Dateisystem navigieren und beliebige Befehle ausführen können. Beachten Sie jedoch, dass Sie beim Verlassen dieser Shell immer noch genau dort, wo Sie in der Verzeichnishierarchie gestartet haben, genau aus dem gleichen Grund wie oben beschrieben zurückgebracht werden.

    
Michael Kjörling 07.05.2013 09:27
quelle
12

Alle obigen Antworten sind korrekt; Hier ist ein Workaround, obwohl

sudo sh -c "cd restricted-dir; some_command"
    
Tagar 07.11.2015 07:00
quelle
3

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

    
Andres Abello 07.11.2016 18:14
quelle

Tags und Links