comando non trovato quando si utilizza sudo


51

Ci sono alcune domande sul sito che sembrano legate al mio problema ma non sono riuscito a trovare una soluzione in nessuno di essi.

Il mio sistema operativo è Ubuntu 12.04. Ho mvninstallato /tools/noarch/apache-maven-3.1.1e ho aggiunto le seguenti righe alla fine del mio /etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

Successivamente eseguo source /etc/profile.

Ora il mio problema è: quando si esegue mvn --versionil comando ha esito positivo e mvneseguibile viene trovato, mentre se eseguo: sudo mvn --versionho l'uscita: sudo: mvn: command not found. So che PATHpotrebbe essere diverso quando eseguo un comando con sudoed è per questo che ho provato questo:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

Un'altra cosa che ho provato è eseguire sudo su -e quindi digitare mvn --version. In questo caso mvnviene trovato correttamente e il comando ha esito positivo. Cosa sta succedendo qui?


Risposte:


37

$PATH viene valutato dalla shell, quindi il controllo non funziona come previsto.

/etc/sudoersè configurato per sostituire il tuo PATHcon uno predefinito.

sudonon carica un ambiente shell di login prima di eseguire il comando, quindi viene utilizzato il valore predefinito PATHda /etc/sudoers. su -apre una shell di login, che comporta il caricamento /etc/profile. Vedi man bash, sezione INVOCAZIONE .

Rimuovi il PATHreset in /etc/sudoers. È probabile che venga chiamata una regola secure_path.


CentOS

In CentOS è possibile aggiungere PATHalla Defaults env_keepsezione:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"

Grazie per la risposta. Risolve il problema, ma preferisco il suggerimento di soluzione nelle altre due risposte in quanto esegue una modifica solo per Maven, non per tutti i comandi nel mio PERCORSO.
izomorphius,

Cordiali saluti: Si prega di notare l'aggiornamento della mia risposta.
Kriegaex,

come eseguire i binari sudo nella directory corrente sudo: ./<some_binary>: command not found. Sto usando Arch Linux.
Necktwi,

46

Dai la sudotua corrente PATHcon:

sudo env "PATH=$PATH" your_command

Un'ottima risposta, che non richiede la modifica di alcuna impostazione, consentendo al chiamante di fare tutto il necessario. Vorrei usare l' -Eopzione in aggiunta, per preservare il resto dell'ambiente. In effetti, questo è così utile che può essere inserito in una funzione script / alias / per un facile utilizzo. Aggiungerò questo come una risposta separata - ma complimenti a @opyate!
Tom

Quando provo ad eseguire questo comando ottengo env: cmd: No such file or directory: Qualche idea sul perché sarebbe?
Andy,

2
@Andy sostituisce cmd con il tuo vero comando.
opyate

come eseguire i binari sudo nella directory corrente sudo: ./<some_binary>: command not found. Sto usando Arch Linux.
Necktwi,

12

Elaborando la risposta di @ opyate, sto usando il seguente script di shell (che può essere chiamato mysudo, ad esempio):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Edice sudodi preservare l'ambiente.
  • env "PATH=$PATH"si espande all'esterno della sudochiamata, rendendo PATHdisponibile anche l'esterno all'interno sudo(ciò è necessario in aggiunta al fatto -Eche di PATHsolito riceve un trattamento speciale in aggiunta al trattamento che l'intero ambiente riceve).
  • "$@"passa gli argomenti che il nostro script riceve alla sudoriga.

Salvare lo script in un file in una directory in PATH, dare le +xautorizzazioni, e voilà.


Questa è una soluzione molto migliore per coloro che non vogliono modificare alcun file esistente.
qaisjp,

4

Poiché le risposte correnti sono un po 'vaghe, l'impostazione specifica nel /etc/sudoerscambiare il tuo percorso è secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Puoi modificarlo con sudo visudo, o meglio ancora, aggiungere le directory di cui hai bisogno:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

2

Ho avuto lo stesso problema quando ho installato Maven per la prima volta . Il problema è stato risolto dopo aver aggiunto le due righe,

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

a quattro file:

/root/.bashrc
/root/.profile

e per l'utente corrente ( mehranè il mio nome utente Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile

1

Devi modificare la variabile PATH di root esattamente come hai fatto tu stesso, cioè aggiungendo quelle due righe nel profilo di sudo, che si trova in /root/.bashrc, quindi procuralo.


1
Ho modificato /root/.bashrc ma non riesco a procurartelo : sudo source /root/.bashrcottiene: sudo: source: command not founde senza il sudopermesso ottengo il permesso negato (come previsto). credo che l'avvio di un nuovo terminale dovrebbe in teoria fare lo stesso della fonte, ma dopo aver avviato un nuovo terminale, sudo mvn --versionnon trova ancora nulla.
izomorphius,

@izomorphius Non è possibile sudo source. Devi prima passare a sudo con il comando sudo su , quindi puoi procurarti il ​​file in questione. Non c'è altro modo per farlo.
MariusMatutiae,
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.