Come inserire una directory con il comando 'cd' se ha 700 permessi e non è di mia proprietà?


87

Ho provato a usare sudo cd name_of_dirma sto ricevendo il messaggio di errore:

sudo: cd: command not found

Esiste un altro modo per accedere a una directory di proprietà di un altro utente che dispone di 700 autorizzazioni?


2
si prega di aggiungere una ls -ldella directory stessa.
Rinzwind,

7
E per favore spiega perché continui a lasciare commenti negativi contro le risposte valide qui. Se pensi che ci sia (o dovrebbe esserci) un modo migliore, facci sapere quale potrebbe essere.
Oli

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirSembra essere l'unica risposta di cui sarai felice.
Marco Ceppi

3
Le risposte fornite qui sono corrette, ma le stai votando e dicendo che sono sbagliate. Non respingere semplicemente ciò che viene detto a causa di qualcos'altro che hai visto.
Richard Holloway,

3
È divertente ... vuole sudo cdlavorare, ma vota le soluzioni usando sudo o su. Dice che non vuole lavorare come root, ma vuole comunque accedere direttamente a quello che non possiede. Mi sembra un troll ...
MestreLion,

Risposte:


111

sudo cdnon funzionerà perché il cdcomando è integrato nella shell. Quindi stai dicendo diventa root e quindi esegui questo comando. Si diventa root e quindi si cerca il comando dopo che sudo è stato cercato, ma non c'è nessun cdcomando da trovare.

Il metodo da utilizzare è passare all'utente proprietario della directory. L'autorizzazione 700è intesa come "il proprietario può leggere, scrivere ed eseguire".

Quindi se root possiede la directory sudo -i, la password e quindi cd {dir}è l'unico metodo corretto. Se qualcun altro possiede la directory, puoi comunque utilizzare il 1o metodo ma puoi anche passare a quell'utente con su {username}e quindi utilizzare cdcome tale utente.


Domanda a margine: root sarà in grado di inserire una directory 700 anche se non è il proprietario?
MestreLion,

3
sì MestreLion, 700 non impedirà al root di entrare. Le autorizzazioni '000' impediranno all'utente di inserire se stesso (sì, un utente può creare una directory che lui stesso non può inserire ...) ma comunque root può inserire quella.
Rinzwind,

1
echo è un comando integrato della shell, perché posso eseguire "sudo echo" ma non "sudo cd"?
shoujs,

Siamo spiacenti, si applicano le stesse regole sudo echo: hai bisogno di qualcosa come echo 'deb {text}' | sudo tee --append {file}usare echo con sudo e cambiare un file.
Rinzwind,

1
Perché non è cdintegrato nei comandi disponibili sudo, però?
Aaron Franke il

44

sudo -i

per aprire "console di root" e quindi

cd /path/to/directory

( cdè un comando incorporato della shell, quindi non può essere il target sudo)


19

Per aprire una directory root possiamo eseguire una shell root, ad esempio:

sudo su
# cd /root

3
Non mi piacerebbe lavorare come root. MAI!!! E anche gli esperti raccomandano di non accedere mai come root. -1
Bakhtiyor

8
Bene, questo è esattamente il motivo per cui non si desidera disporre delle autorizzazioni per aprire le directory di root, non è vero?
Takkat,

10
Non c'è niente di sbagliato in modalità root. Gli esperti raccomanderanno sempre di andare alla radice quando è necessario.
Rinzwind,

2
Se lavori con cose di proprietà di root, a volte sudo suing (o un altro metodo) è l'unico metodo pratico o addirittura possibile. Gli "esperti" ti dicono solo di non usare il root come abitudine: va bene quando ne hai davvero bisogno. E @Vojtech, niente è impossibile ...
Oli

2
@Bakhtiyor: non è consigliabile lavorare sempre come root. Ma emetterlo per un singolo (o alcuni) comandi è accettabile. Soprattutto se stai provando a inserire una directory per la quale il tuo utente non ha il permesso . Quindi è necessario per essere il proprietario o la radice.
MestreLion,

10

Come altri hanno sottolineato - è la shell integrata:

~ % which cd
cd: shell built-in command

Quindi, perché non sudo la shell stessa?

~ % sudo $SHELL -c "cd name_of_dir"

5
+1 per l'idea sudo bash -c ... e un suggerimento: evitare di usare which. È solo uno script e non gestirà tutte le possibilità (binario, incorporato, alias, ecc.). Usa typeinvece. Molto più sicuro, potente e portatile. E type -pper il percorso di un eseguibile.
MestreLion,

1
Bene, dipende ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(man zshbuiltins)
Daniel Bauke,

1
Essa non dipende. whenceè zsh-solo ... non funziona in bash, non è nemmeno installato di default in Ubuntu. Mentre typeè POSIX , significa che funzionerà in qualsiasi shell moderna ... bash, csh, ksh .. e persino zsh.
MestreLion,

Certo che lo è ed è per questo che ho votato il tuo commento proprio quando è apparso, ma quello che ho detto è che in zsh in realtà non è uno script e dà risultati simili in typequanto entrambi sono alias dello stesso comando.
Daniel Bauke,

Oh, adesso capisco. Bene, ma questo è tutto zsh. In bash, che è la shell terminale predefinita (e di solito solo) in Ubuntu, whichnon è un builtin ... quindi type(o type -p) è preferito.
MestreLion,

4

Puoi anche elevarti all'utente root:

sudo -s

Quindi è possibile eseguire il cd in qualsiasi directory che non consente agli utenti normali di:

cd /root

O

cd /var/lib/

Quindi, dopo aver finito, digita:

exit

Per disconnettersi dai privilegi dell'utente root.

Per elevarti come root, puoi anche combinare i due comandi per &&operatore come di seguito, questo operatore mantiene anche la loro sequenza di esecuzione, se il comando corrente viene eseguito correttamente e solo allora il comando successivo può eseguire:

sudo -s && cd /var/lib

O

sudo -s && cd /root

2

Se vuoi davvero far funzionare, puoi definire una funzione di shell chiamata che esegue una nuova shell di root quando viene eseguita in quel modo, ed esegue semplicemente il comando normale altrimenti.sudo cd directorybashsudosudo

Come indicato in altre risposte, la maggior parte degli utenti non vorrà preoccuparsi di farlo, ma preferirà invece:

  1. Esegui sudo -so sudo -ise desideri una shell di accesso (ricorda che un effetto di sudo -iè quello di avviarti nella home directory di root), o sudo bashse vuoi forzare basho essere in grado di passare le opzioni alla shell.
  2. Esegui nella nuova shell.cd directory
  3. Esegui qualsiasi (altra) azione debba essere eseguita come root nella nuova shell.
  4. Una volta fatto, corri exitper lasciare la nuova shell. È importante non dimenticarlo, perché non si desidera eseguire più azioni come root di quanto si pensi!

Quindi, se vuoi, puoi scrivere una funzione di shell (o uno script) che esegue le prime due di quelle azioni quando sudoè seguita da cd, ed esegue sudonormalmente altrimenti. Per favore, non usarlo come alternativa all'apprendimento del perché sudo cd altrimenti non ci riesci , perché se non capisci cosa sta succedendo, probabilmente sarai molto confuso trovandoti in una nuova shell (e potresti non capire alcun messaggio di errore che si verificano).

Ecco un modo per scrivere una tale funzione di shell, che ti ricorda anche che sei in una nuova shell e che dovresti exituscirne al termine. (Questo richiamo è probabile che sia utile per gli utenti di qualsiasi livello di abilità, perché non si è generalmente abituati ad essere in una nuova shell quando si corre sudo, senza -s, -io il nome di un guscio reale come argomento.)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
    else
        command sudo "$@"
    fi
}

Potresti metterlo nel tuo ~/.bashrc, anche se questo è un modo abbastanza strano da usare sudoche potresti voler abilitare solo occasionalmente. In tal caso, è meglio inserirlo nel proprio file. Se si crea un file chiamato sudo.bashnella directory home con tali contenuti, è possibile rendere sudodisponibile la funzione, in modo che venga eseguita invece del normale sudocomando, eseguendo . ~/sudo.bash. Questo ha effetto nella shell corrente e nelle sue shell secondarie, ma non in altre. Per lo stesso motivo per cui file come .bashrcnon sono eseguibili, non contrassegnare sudo.basheseguibile con chmod. Questa è davvero una libreria, piuttosto che uno script shell autonomo. Se lo hai fattoeseguirlo come uno script di shell, definirebbe la funzione ... ma solo nella shell che ha eseguito lo script, non per te come chiamante. (Certo, puoi scrivere una sceneggiatura per questo, che non è l'approccio che ho adottato qui.)

Per verificare e vedere se sudoattualmente è definita come una funzione shell e per vedere la sua definizione corrente se è una, eseguire type sudo. Per disabilitare (cioè annullare la definizione) la funzione una volta definita, esegui unset -f sudo. Per eseguire manualmente il sudocomando regolare direttamente anche se è stata definita la funzione shell, eseguire command sudo. Si noti, tuttavia, che non è necessario farlo, poiché questa sudofunzione lo fa effettivamente ogni volta che ci sono più o meno di due argomenti passati o il primo argomento passato ad esso è tutt'altro cd. Ecco perché puoi ancora usarlo nei normali modi in cui le persone usano sudo.

Nota anche che la funzione di shell mostrata sopra ti consente ancora di passare altri argomenti sudo, ma questo gli impedirà di trattare in modo cdspeciale . L'esecuzione in particolare non è supportata, sebbene sia possibile estendere la funzione shell per supportare quel caso. Né lo è . La shell che crea è simile a quella che ottieni . Il codice non viene effettivamente eseguito , ma utilizza , quindi l' opzione funziona correttamente. In realtà viene eseguito due volte quando si passa e un argomento di directory ad esso (e zero volte altrimenti). Quando esegui , per prima cosa crea una shell bash separata da quella in cui stai eseguendo la funzione e cambia directory. Se ciò ha esito positivo, sostituiscesudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo quella bash shell con una nuova, interattiva che puoi usare.

Ecco un esempio di come quella funzione di shell automaticamente "fa la cosa giusta". Si noti che sudo ls -A /rootsi comporta normalmente. Solo quando tento di accedere a cduna directory con sudoviene creata una nuova shell e mi viene ricordato esplicitamente cosa sta succedendo.

ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
ek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$

Se si tenta di sudo cdaccedere a una directory che non è possibile modificare nemmeno come root, verrà visualizzato un messaggio di errore:

ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$

Ho usato sudo -ktra invocazioni negli esempi sopra per mostrare che ti autentica come root prima di provare a cambiare directory. Ma in realtà non devi correre sudo -kda solo. Poiché la funzione shell è solo un sottile wrapper per il sudocomando reale , la memorizzazione nella cache delle credenziali e di altri sudocomportamenti comuni funziona ancora normalmente.

Anche se funziona bene ed è un po 'pulito, ammetto che oscurare il vero sudocomando con una funzione con lo stesso nome è super strano. Probabilmente la maggior parte degli utenti vorranno solo per eseguire la procedura sudo -s, se stessi. Ma nel caso qualcuno lo voglia - e anche per dimostrare che è possibile - eccolo.cd directory


0

Per quanto riguarda il discutere suo meno su, penso che sia sciocco. suè contro la religione di Ubuntu e non è qualcosa da fare con noncuranza. È incredibile cosa si rm -rf *possa fare se si è root. Ma, se hai dimestichezza con l'interfaccia a riga di comando (CLI) e hai attività a livello di sistema da svolgere, non c'è motivo di non usarle su. Ho usato diverse distro in cui nessuno ha nemmeno menzionato l'uso sudo. È solo una questione di che tipo di lavoro stai facendo e con quale metodo ti senti più a tuo agio. Uso entrambi.


1
"Nelle versioni di bash e sudoho con kubuntu lucid, sudo cdora funziona - senza soluzioni alternative." A corto di qualcosa del genere , che sono abbastanza sicuro che non sia mai stato su Ubuntu per impostazione predefinita, non vedo come. (Inoltre, ho usato 10.04; non è stato così.) Sono passati anni da quando l'hai pubblicato, ma ricordi i dettagli? Funziona sudo cdancora per te? Qual è l'output di type -a sudoin una shell in cui funziona? Capisco che potresti non saperlo - e la seconda parte della tua risposta rimane rilevante - ma se lo fai, puoi modificarlo .
Eliah Kagan,

@EliahKagan Sicuramente non funziona per me ora nel 16.10 e non ricordo cosa ho fatto allora. È contro la mia religione modificare i comandi di base esistenti, quindi è improbabile che l'abbia fatto. In ogni caso, anche se funzionasse, tutti lo definirebbero una cattiva abitudine perché non funzionerebbe in generale.
Joe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.