sudo: source: comando non trovato


54

Ho aggiornato alcuni dei profili predefiniti per bash e ho visto dai tutorial che seguivo che avrei potuto ricaricare il nuovo profilo con le nuove impostazioni dell'ambiente usando:

source /etc/bash.bashrc

L'unica cosa è - le nuove variabili d'ambiente erano disponibili solo per il mio attuale utente - e sono state ignorate quando ho usato sudo. Sono diventati disponibili per sudo solo quando ho chiuso la sessione del terminale e mi sono unito di nuovo.

Quando provo ad usare:

sudo source /etc/bash.bashrc

Ottengo l'errore:

sudo: source: command not found

Esiste un modo semplice per caricare le nuove impostazioni del profilo bash per sudo senza dover chiudere il terminale e riavviare?

- Inizialmente, stavo usando alcuni script di installazione che facevano riferimento alle variabili. Ho scoperto che mentre potevano accedere alle variabili quando ho chiamato direttamente gli script (anche se, ciò causerebbe un problema successivo con la creazione di directory in quanto avevo bisogno di essere root), chiamare gli script di installazione usando sudo non lo farebbe.

Ho dimostrato questo testando con questi semplici comandi:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

Il primo avrebbe generato il valore della variabile, ma il secondo non avrebbe prodotto nulla.


Come hai provato ad usare le variabili da sudo? Nota che se usi "comando sudo $ variabile" sostituirà la variabile dalla tua shell, non dall'ambiente di sudo.
João Pinto,

Risposte:


72

Il problema è che sourceè un comando incorporato bash (non un programma simile lso grep). Penso che un approccio sia quello di accedere come root e quindi eseguire il comando source.

sudo -s
source /etc/bash.bashrc

3
Hai ragione sul fatto che il problema è che sourceè incorporato una shell. sudo suè una specie di modo strano di dirlo, meglio dire sudo -squale è il modo di dire di sudo "avvia una shell come questo utente". La versione di una riga non funzionerà perché ciascuno dei comandi in essa contenuti viene eseguito dalla shell dell'utente principale in un sottoprocesso separato.
poolie,

1
Giusto. Inoltre BASH legge / etc / bashrc al momento del login. Quindi puoi anche usare 'su' con l'opzione -, -l o --login per ottenere l'ambiente di quell'utente: 'sudo su -' per diventare root o 'su - $ username' per diventare un altro utente.

L'esempio "una riga" non funzionerà perché suavvia una nuova shell e "source" viene eseguito solo al termine. Il primo esempio funziona solo se la seconda riga è utilizzata all'interno della shell di root.
Loevborg,

sudo -snon è meglio di sudo su. Non avrà alcun effetto in entrambi i modi.
loevborg,

1
sudo -sha un effetto simile all'avvio di una shell, ma a me sembra inelegante impilare due comandi "diventa un altro utente" quando uno lo farebbe.
Poolie,

14

Il problema non è che sourceè un comando incorporato della shell. Il fatto è che ciò che effettivamente ti sta gettando l' command not founderrore, ma non significa che funzionerebbe se fosse.

Il vero problema è come funzionano le variabili d'ambiente. E funzionano così: ogni volta che viene avviato un nuovo processo, se non accade nulla, eredita l'ambiente del suo genitore. Per questo motivo, l'uso di una subshell (ad esempio digitando bashall'interno di un'istanza bash) e guardando l'output di envdovrebbe dare risultati simili a quelli del suo genitore.

Tuttavia, a causa del modo in cui sudofunziona (come indicato nella sua manpage), sudo tenta di eliminare l'ambiente dell'utente e creare un ambiente "predefinito" per l'utente supplente, in modo che l'esecuzione del comando venga eseguita come se l'utente che lo ha invocato avesse stato l'utente chiamante (che è il comportamento previsto) e quindi eseguendo nautilus come sudo nautilusdovrebbe aprire una cartella nella /rootcartella, e non /home/yourusername.

Così:

Fare qualcosa del genere sudo source script.she poi sudo command, anche se ha funzionato, non avrebbe avuto successo nell'impostare alcuna variabile su quella successiva sudo command.

Per passare variabili d'ambiente, puoi dire a sudo di preservare l'ambiente (tramite lo -Eswitch; e avere le autorizzazioni appropriate nel tuo file sudoers) e / o impostarlo come comando sudo VAR1=VALUE1 VAR2=VALUE2 command.


4

Usando la sostituzione del processo bash puoi fare:

source <(sudo cat /etc/bash.bashrc)

1
In che modo ciò contribuirebbe all'avvio di una shell di root con le nuove impostazioni, che è ciò che OP sta cercando di fare?
muru,

1
L'OP stava effettivamente chiedendo come "... ricaricare il nuovo profilo ..." da una shell che deve usare sudoper accedere al profilo. Quanto sopra fornisce un mezzo per importare il profilo evitando il sudo: source: command not foundproblema menzionato.
TomDotTom

"L'unica cosa è - le nuove variabili d'ambiente erano disponibili solo per il mio attuale utente - e sono state ignorate quando ho usato sudo."
muru,

3

Come dice Marcos , il tuo problema principale qui è che sourceè un comando incorporato della shell che influenza solo il processo della shell in cui viene eseguito.

La soluzione semplice è avviare una nuova shell come root e bash leggerà automaticamente /etc/bash.bashrcall'avvio. È semplice come dire

sudo bash

2

Chiudere e riaprire il terminale non dovrebbe cambiare le cose. Per impostazione predefinita, sudo elimina l'ambiente. Per disabilitarlo, aggiungi -E a sudo.


2

L'errore si verifica perché il file binario che si sta tentando di chiamare dalla riga di comando fa parte solo della variabile PATH dell'utente corrente, ma non fa parte del PATH dell'utente root.

Puoi verificarlo individuando il percorso del binario a cui stai tentando di accedere. Nel mio caso stavo cercando di chiamare "bettercap-ng". Quindi ho corso

$ which bettercap-ng
/home/user/work/bin/bettercap`

Ho verificato se questa posizione fa parte del PERCORSO del mio utente root.

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

Quindi sudo non riesce a trovare il binario che sto cercando di chiamare dalla riga di comando. Quindi restituisce il comando di errore non trovato.

Puoi dire a sudo di usare il PERCORSO dell'utente corrente quando chiami un binario come sotto.

sudo -E env "PATH=$PATH" [command] [arguments]

In effetti, si può ricavarne un alias:

alias mysudo='sudo -E env "PATH=$PATH"'

È anche possibile nominare lo stesso sudo sudo, sostituendo il sudo originale.

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.