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?
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.
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.
Het is ook de moeite waard om te onthouden dat, cd
de 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:
- De shell spawnt een subproces af om sudo met de opgegeven parameters uit te voeren
- sudo verifieert de gebruiker en bevestigt zijn recht om de opgegeven opdracht uit te voeren
- sudo spawnt een subproces af om de opgegeven opdracht uit te voeren
- sudo wacht op het subproces dat in stap 3 is afgesplitst om af te sluiten
- sudo gaat naar buiten en keert terug naar de schaal
- 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.
Alle bovenstaande antwoorden zijn correct; hier is echter een oplossing
sudo sh -c "cd restricted-dir; some_command"
U kunt de toestemming ook tijdelijk wijzigen.
chmod 0775 pad.
Zorg ervoor dat je het zo nodig terugplaatst.