Come hai notato, cd
è un comando integrato nella shell e c'è un motivo per questo:la "directory corrente" è un parametro per processo che può essere modificato solo dal processo stesso .
La directory di lavoro della tua shell non può essere modificata da alcun processo figlio, quindi anche se riesci a eseguire cd
in una subshell privilegiata, cambierà solo la directory di lavoro di quella subshell temporanea, e non importa quale metodo usi per aumentare i privilegi.
Quindi per sudo cd
per funzionare, sudo stesso dovrebbe essere una shell integrata e avrebbe bisogno di un modo per aumentare i privilegi di un processo già in esecuzione. Attualmente tale meccanismo non esiste su Linux (né sulla maggior parte degli altri sistemi operativi).
Un modo per ottenere ciò che desideri è eseguire un interattivo shell con privilegi di root (qualsiasi metodo funziona) e usa solo il normale cd
in esso:
[[email protected] /]$ sudo bash
[[email protected] /]# cd /root/secret
Se vuoi fare tutto in un unico comando, dovrebbe assomigliare a questo:prima cambia la directory di lavoro, quindi avvia una shell interattiva:
sudo bash -c "cd /root/secret && bash"
su -c "cd /root/secret && zsh"
Nota:il comando esterno non deve essere una shell, deve solo essere qualcosa che cambia la sua directory di lavoro ed esegue un nuovo comando. I sistemi Linux recenti hanno uno o due helper che potrebbero essere utilizzati:
sudo nsenter --wd="/root/secret" bash # util-linux v2.23 (debian jessie)
sudo env --chdir="/root/secret" bash # coreutils v8.28 (debian buster)
Il vantaggio di questo metodo è che non richiede virgolette nidificate; puoi eseguire un comando composto da più parole senza problemi con spazi bianchi o caratteri speciali.
Infine, alcuni programmi hanno un'opzione incorporata per cambiare la loro directory di lavoro:
sudo make -C /etc
sudo git -C /root/secret log
L'altra risposta non è sbagliata.
Forse una risposta migliore è:
Lo strumento sudo ha lo scopo di eseguire azioni come superutente e stai descrivendo qualcosa che è più un cambiamento di stato che precederebbe azioni come "ls" o "vi" o altre per renderle più semplici.
Suggerisco, ad es. se vuoi modificare un file in /root/private/:
sudo ls /root
sudo ls /root/private
sudoedit /root/private/<name from previous ls command>
Questo è decisamente più digitando e un po 'più difficile del semplice cambio di directory. Tuttavia, è lontano più controllabile e molto più in linea con i principi alla base di sudo rispetto all'esecuzione di qualche variante di "sudo bash".
Se lavori in un ambiente sicuro, il tuo team IA ti ringrazierà. Se ti ritrovi a chiederti:"Che cambiamento ho fatto l'altro giorno?", allora tu ti ringrazierò, perché non dovrai chiederti quale o quali file hai modificato.
Detto questo, abilitare ed eseguire una qualche forma di "sudo bash" è decisamente più semplice. Se stavi cercando qualcosa di più semplice, perché stai usando 'sudo' invece di accedere semplicemente come root?