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

144

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

    
posta Hojat Taheri 06.05.2013 - 21:02

5 risposte

203

Il motivo per cui non puoi farlo è semplice e due volte

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 restituisce

sudo: cd: command not found

perché cd non è un programma.

2

Se fosse possibile utilizzare sudo in cd in una directory protetta, eseguendo il comando sudo cd /var/named verrai in quella directory come utente normale ma i normali utenti non sono autorizzati a essere in quella directory.

Questo non è possibile.

Soluzione:

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

sudo -i
cd /var/named 

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

    
risposta data Warren Hill 06.05.2013 - 21:30
25

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

Se corri:

type cd

otterrai:

  

cd è una funzione di shell

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

sudo -s
cd /var/named

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

    
risposta data Basharat Sialvi 06.05.2013 - 21:29
16

Vale anche la pena di ricordare che, nonostante lo stato di cd come built-in di shell o binario esterno, sudo funziona creando un nuovo processo per eseguire il comando specificato .

Perché è così 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 si chiude, 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 (quello è il Libreria di 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 ed è ereditata ma non promossa . 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 banale come ls ./ fa quello che ci si aspetterebbe.) Ma se il processo B cambia la sua 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 si esegue qualcosa come find / e lo si interrompe a metà, non si finisce in una posizione apparentemente casuale nel file system solo perché al momento è stato trovato è stato interrotto.)

Quindi anche se sudo cd /somewhere ha fatto esattamente quello che dice sul barattolo, al momento in cui sudo termina, verrai portato 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 la funzione di libreria di sistema chdir() per impostare una nuova directory di lavoro, non aiuta l'utente.

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

    
risposta data Michael Kjörling 07.05.2013 - 09:27
12

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

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

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

    
risposta data Andres Abello 07.11.2016 - 18:14

Leggi altre domande sui tag