Vraag Waarom werkt `sudo cd / var / named` niet? [duplicaat]


Deze vraag heeft hier al een antwoord:

ik wil cd in /var/named maar het geeft me een toestemming geweigerde fout, en wanneer ik wil gebruiken sudo om dit te doen, ben ik niet toegestaan. Wat is de technische reden hiervoor en is het mogelijk om dit op een andere manier te doen?


148
2018-05-06 19:02


oorsprong




antwoorden:


De reden dat je dit niet kunt doen, is eenvoudig en tweevoudig

1

cd is geen programma maar een ingebouwd commando en sudo is alleen van toepassing op programma's.

sudo foo betekent voer het programma foo uit als root

sudo cd /path komt terug

sudo: cd: command not found

omdat cd is geen programma.

2

Als het mogelijk was om te gebruiken sudo naar cd naar een beveiligde map en vervolgens de opdracht uitvoeren sudo cd /var/named je zou in die map staan ​​als een normale gebruiker, maar normale gebruikers mogen niet in die map staan.

Dit is niet mogelijk.

Tijdelijke oplossing:

Je kunt gebruiken sudo -i om jezelf te verheffen tot supergebruiker. Bijvoorbeeld:

sudo -i
cd /var/named 

U bent nu aangemeld als root en kunt de gewenste opdrachten gebruiken. Als je klaar bent, typ je exit en je bent weer terug bij het aanmelden als een normale gebruiker.


206
2018-05-06 19:30



Technisch gezien cd is zowel een ingebouwd als een extern commando. unix.stackexchange.com/questions/50058/... - kojiro
@kojiro Ubuntu niet; tenminste in een schone installatie; hebben /usr/bin/cd alleen de ingebouwde - Warren Hill
Met betrekking tot punt 2: als u sudo -i (of sudo su) dan cd /var/named en dan su normaluser... kan je dat doen? - Alvin Wong
@AlvinWong Waarom probeert u het niet en ontdekt u het? Alleen getest als jij sudo -i dan cd naar een map waar je niet in zou moeten staan su normal_user dan pwd laat zien dat je in de beschermde map bent maar ls werkt niet ls: cannot open directory.: permission denied - Warren Hill
Tijdelijke oplossing werkte. - Nino Škopac


Dat is omdat cd is geen uitvoerbaar bestand, het is een shellfunctie om van directory te veranderen.

Als je loopt:

type cd

je krijgt:

cd is een shell-functie

Je kunt gebruiken sudo -s om een ​​interactieve shell te openen en vervolgens cd naar de gewenste map:

sudo -s
cd /var/named

Om terug te keren naar je normale shell, druk je gewoon op Ctrl+D.


25
2018-05-06 19:29





Het is ook de moeite waard om te onthouden dat, cdde status als een shell-builtin of externe binary niettegenstaande, sudo werkt door een nieuw proces uit te zetten om de opgegeven opdracht uit te voeren.

Waarom is dit belangrijk? Omdat de basisuitvoerstroom van sudo iets is dat erg op dit lijkt:

  1. De shell spawnt een subproces af om sudo met de opgegeven parameters uit te voeren
  2. sudo verifieert de gebruiker en bevestigt zijn recht om de opgegeven opdracht uit te voeren
  3. sudo spawnt een subproces af om de opgegeven opdracht uit te voeren
  4. sudo wacht op het subproces dat in stap 3 is afgesplitst om af te sluiten
  5. sudo gaat naar buiten en keert terug naar de schaal
  6. Het subproces dat in stap 1 is gestraft, wordt afgesloten en de gebruiker wordt teruggestuurd naar de shell-prompt

(Deze mei worden technisch gezien enigszins onjuist; er is een systeem aanroep die eigenlijk vervangt het lopende proces met een nieuwe (dat zijn de C-bibliotheken execve()). In de zin van deze uitleg zijn de twee echter equivalent.)

Dit wordt belangrijk als u bedenkt dat de huidige werkmap een eigenschap is van elk proces en dat ook is geërfd maar niet gepromoot. Dus als proces A een nieuw proces B uitwijdt, begint proces B met dezelfde werkmap waarin proces A zich bevond. (Dit is waarom iets zo alledaags als ls ./doet wat je zou verwachten.) Maar als proces B verandert haar werkmap, tenzij proces A zijn best doet om daar naar op zoek te zijn, A is zich volledig niet bewust van die verandering. (Dit is op zijn beurt de reden waarom als je zoiets zou doen find / en stop het halverwege, je komt niet op een ogenschijnlijk willekeurige locatie in het bestandssysteem terecht, alleen omdat het er op het moment dat het werd afgebroken er toevallig uitzag.)

Dus zelfs als sudo cd /somewhere deed precies wat het zegt op het blik, tegen de tijd sudo uitgangen, u wordt teruggebracht naar waar u bent begonnen. Vandaar dat het effectief vanuit het oogpunt van de gebruiker een no-op wordt. Het feit dat cd, terwijl het werd uitgevoerd, de chdir() systeembibliotheekfunctie om een ​​nieuwe werkdirectory in te stellen, helpt u niet, de gebruiker.

Als Warren Hill wees erop, de juiste oplossing (Ik zou het eigenlijk geen workaround noemen) is om te gebruiken sudo -i die je naar een rootshell brengt waar je vrij door het bestandssysteem kunt navigeren en opdrachten kunt uitvoeren waar je zin in hebt. Merk echter op dat wanneer u deze shell afsluit, u dat bent nog steeds teruggebracht naar waar je begon in de directoryhiërarchie om precies dezelfde reden als ik hierboven heb beschreven.


16
2018-05-07 07:27



Deze uitleg was leuk en jouw stukje over "Dus zelfs als sudo cd /somewhere deed precies wat het zegt op het blik, tegen de tijd sudo uitgangen, wordt u teruggebracht naar waar u bent begonnen. "was nuttig. +1 - harperville


Alle bovenstaande antwoorden zijn correct; hier is echter een oplossing

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

12
2017-11-07 06:00



Ik vind deze oplossing het beste omdat je je root-dingen doet en dan meteen terugkeert naar de niet-root-modus, zodat je niet vergeet en grote fouten maakt. - GlenPeterson


U kunt de toestemming ook tijdelijk wijzigen. chmod 0775 pad. Zorg ervoor dat je het zo nodig terugplaatst.


3
2017-11-07 17:14



Welkom bij Ask Ubuntu! ik raad aan Bewerkdit antwoord om het uit te breiden met specifieke details over hoe dit te doen. (Zie ook Hoe schrijf ik een goed antwoord? voor algemeen advies over welke soorten antwoorden het meest waardevol worden geacht op AskUbuntu.) - David Foerster
Ik heb niet het recht om een ​​interactieve shell met sudo te draaien, dus dit is helemaal de manier om te gaan .. - Guillaume