Domanda Perché `sudo cd / var / named` non funziona? [duplicare]


Questa domanda ha già una risposta qui:

voglio cd in /var/named ma mi dà un permesso negato errore, e quando voglio usare sudo per fare questo non sono permesso. Qual è la ragione tecnica per questo, ed è possibile farlo in un altro modo?


148
2018-05-06 19:02


origine




risposte:


Il motivo per cui non puoi farlo è semplice e duplice

1

cd non è un programma ma un comando incorporato e sudo si applica solo ai programmi.

sudo foo significa eseguire il programma pippo come root

sudo cd /path ritorna

sudo: cd: command not found

perché cd non è un programma.

2

Se fosse possibile usarlo sudo a cd in una directory protetta, quindi eseguire il comando sudo cd /var/named ci si troverà in quella directory come utente normale, ma gli utenti normali non possono entrare in quella directory.

Non è possibile.

Soluzione:

Puoi usare sudo -i per elevarti al super utente. Per esempio:

sudo -i
cd /var/named 

Ora sei connesso come root e puoi usare qualsiasi comando tu desideri. Al termine, digita exit e si ritorna al login come utente normale.


206
2018-05-06 19:30



tecnicamente cd è sia un comando incorporato che un comando esterno. unix.stackexchange.com/questions/50058/... - kojiro
@kojiro Ubuntu no; almeno in un'installazione pulita; avere /usr/bin/cd solo l'integrato - Warren Hill
Per quanto riguarda il punto 2: se tu sudo -i (o sudo su) poi cd /var/named e poi su normaluser... puoi farlo? - Alvin Wong
@AlvinWong Perché non provarlo e scoprirlo? Appena testato se tu sudo -i poi cd in una directory che non dovresti essere nel su normal_user poi pwd mostra che sei nella directory protetta ma ls non funziona ls: cannot open directory.: permission denied - Warren Hill
La soluzione ha funzionato. - Nino Škopac


È perché cd non è un eseguibile, è una funzione di shell per cambiare directory.

Se corri:

type cd

il tuo otterrà:

cd è una funzione di shell

Puoi usare sudo -s per aprire una shell interattiva e poi cd alla tua directory desiderata:

sudo -s
cd /var/named

Per tornare alla tua shell normale semplicemente colpisci Ctrl+D.


25
2018-05-06 19:29





Vale anche la pena ricordare che, cdnonostante lo stato di una shell incorporata o di un binario esterno, sudo funziona creando un nuovo processo per eseguire il comando specificato.

Perché questo è importante? Perché il flusso di esecuzione di base di sudo diventa qualcosa di molto simile a questo:

  1. La shell genera un sottoprocesso per eseguire sudo con i parametri specificati
  2. sudo autentica l'utente e conferma il loro diritto di eseguire il comando specificato
  3. sudo genera un sottoprocesso per eseguire il comando specificato
  4. sudo attende il sottoprocesso generato nel passaggio 3 per uscire
  5. sudo esce, tornando alla shell
  6. Il sottoprocesso estratto nel passaggio 1 viene chiuso, restituendo l'utente al prompt della shell

(Questo potrebbe essere tecnicamente leggermente errato; c'è una chiamata di sistema che in realtà sostituisce il processo in esecuzione con uno nuovo (è la libreria C) execve()). Tuttavia, ai fini di questa spiegazione, i due sono equivalenti.)

Questo diventa importante se si considera che la directory di lavoro corrente è una proprietà di ogni processo e lo è ereditato ma non promosso. Quindi se il processo A genera un nuovo processo B, allora il processo B inizia con la stessa directory di lavoro in cui è stato elaborato A. (Ecco perché qualcosa di così banale come ls ./fa quello che ti aspetteresti.) Ma se il processo B cambia suo directory di lavoro, quindi a meno che il processo A non torni a cercarlo, A è completamente inconsapevole di tale cambiamento. (Questo, a sua volta, è il motivo per cui se gestisci qualcosa del genere find / e lo interrompono a metà, non si finisce in una posizione apparentemente casuale nel file system solo perché si è verificato che i risultati si trovassero lì nel momento in cui è stato interrotto.)

Quindi anche se sudo cd /somewhere ha fatto esattamente quello che dice sulla latta, per il momento sudo esce, vieni riportato indietro dove hai iniziato. Da qui in modo efficace dal punto di vista dell'utente, diventa un no-op. Il fatto che cd, mentre era in esecuzione, ha chiamato il chdir() la funzione della libreria di sistema per impostare una nuova directory di lavoro, non aiuta l'utente.

Come Warren Hill sottolineato, la soluzione adeguata (Io in realtà non lo chiamerei una soluzione alternativa) è da usare sudo -i che ti porta a una shell di root dove puoi navigare liberamente nel filesystem ed eseguire qualsiasi comando tu voglia. Prendi nota tuttavia che quando esci da questa shell, lo sei ancora riportato indietro dove hai iniziato nella gerarchia della directory esattamente per la stessa ragione che ho descritto sopra.


16
2018-05-07 07:27



Questa spiegazione è stata bella e il tuo commento su "Così anche se sudo cd /somewhere ha fatto esattamente quello che dice sulla latta, per il momento sudo esce, sei riportato dove hai iniziato. "è stato utile. +1 - harperville


Tutte le risposte sopra sono corrette; ecco però una soluzione

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

12
2017-11-07 06:00



Questa soluzione mi piace di più perché fai le tue cose di root, quindi ritorni immediatamente alla modalità non-root in modo da non dimenticare e fare grandi errori. - GlenPeterson


È inoltre possibile modificare temporaneamente l'autorizzazione. chmod 0775 percorso. Assicurati di rimetterlo, se necessario.


3
2017-11-07 17:14



Benvenuto su Ask Ubuntu! io raccomando modificarequesta risposta per espanderla con dettagli specifici su come farlo. (Guarda anche Come scrivo una buona risposta? per un consiglio generale su quale tipo di risposte sono considerate più preziose su AskUbuntu.) - David Foerster
Non ho il diritto di eseguire una shell interattiva con sudo, quindi questo è piuttosto il modo di andare .. - Guillaume