comando no encontrado al usar sudo

53

Hay algunas preguntas en el sitio que parecen estar relacionadas con mi problema, pero no pude encontrar una solución en ninguna de ellas.

Mi sistema operativo es Ubuntu 12.04. He mvninstalado /tools/noarch/apache-maven-3.1.1y he agregado las siguientes líneas al final de mi /etc/profile:

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

Después de eso lo ejecuto source /etc/profile.

Ahora mi problema es: cuando ejecuto mvn --versionel comando tiene éxito y mvnejecutable se encuentra, mientras que si ejecuto: sudo mvn --versionMe da la salida: sudo: mvn: command not found. Sé que PATHpuede ser diferente cuando ejecuto un comando sudoy es por eso que probé esto:

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

Otra cosa que intenté es ejecutar sudo su -y luego escribir mvn --version. En este caso mvnse encuentra con éxito y el comando tiene éxito. ¿Que esta pasando aqui?

izomorphius Support Monica
fuente

Respuestas:

38

$PATH es evaluado por su shell, por lo que su cheque no funciona como espera.

/etc/sudoersestá configurado para reemplazar su PATHcon uno predeterminado.

sudono carga un entorno de shell de inicio de sesión antes de ejecutar el comando, por lo que se utiliza el valor predeterminado PATHde /etc/sudoers. su -abre un shell de inicio de sesión, que implica la carga /etc/profile. Ver man bashsección INVOCACIÓN .

Simplemente elimine el PATHreinicio /etc/sudoers. Es probable que se llame una regla secure_path.


CentOS

En CentOS puedes agregar PATHa la Defaults env_keepsección:

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"
Daniel Beck
fuente
Gracias por la respuesta. Sí resuelve el problema, pero prefiero la sugerencia de solución en las otras dos respuestas, ya que realiza un cambio solo para maven, no para todos los comandos en mi RUTA.
izomorphius Support Monica
FYI: Tenga en cuenta la actualización de mi respuesta.
kriegaex
cómo sudo ejecutar binarios en el directorio actual sudo: ./<some_binary>: command not found. Estoy usando Arch Linux.
Necktwi
47

Da sudotu corriente PATHcon:

sudo env "PATH=$PATH" your_command
opiato
fuente
Una gran respuesta, que no requiere modificar ninguna configuración, permitiendo que la persona que llama haga todo lo necesario. Usaría la -Eopción además, para preservar el resto del medio ambiente. De hecho, esto es tan útil que se puede poner en un script / alias / función para facilitar su uso. Agregaré esto como una respuesta por separado, ¡pero felicitaciones a @opyate!
Tom
Cuando trato de ejecutar este comando me sale env: cmd: No such file or directory- ¿Alguna idea de por qué sería?
Andy
2
@Andy reemplaza cmd con tu comando real.
opiato
cómo sudo ejecutar binarios en el directorio actual sudo: ./<some_binary>: command not found. Estoy usando Arch Linux.
Necktwi
12

Desarrollando la respuesta de @ opyate, estoy usando el siguiente script de shell (que puede llamarse mysudo, por ejemplo):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Ele dice sudoa preservar el medio ambiente.
  • env "PATH=$PATH"se expande fuera de la sudollamada, haciendo que lo externo PATHesté disponible también dentro de la llamada sudo(esto se requiere además de -Eque PATHgeneralmente recibe un tratamiento especial además del tratamiento que recibe todo el entorno).
  • "$@"pasa los argumentos que recibe nuestro script a la sudolínea.

Guarde el script en un archivo en un directorio en el PATH, dele +xpermisos, y listo.

Tom
fuente
Esta es una solución mucho mejor para aquellos que no desean editar ningún archivo existente.
qaisjp
4

Dado que las respuestas actuales son un poco vagas, la configuración específica para /etc/sudoerscambiar su camino es secure_path:

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

Puede modificarlo con sudo visudo, o mejor aún, agregar los directorios que necesita:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
mikemaccana
fuente
2

Tuve el mismo problema cuando instalé Maven por primera vez . El problema se resolvió después de agregar las dos líneas,

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

a cuatro archivos:

/root/.bashrc
/root/.profile

y para el usuario actual ( mehranes mi nombre de usuario de Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile
Mehran Hatami
fuente
1

Debe modificar la variable PATH de la raíz exactamente como lo hizo usted mismo, es decir , agregando esas dos líneas en el perfil de sudo, que se encuentra en /root/.bashrc, luego lo obtiene.

MariusMatutiae
fuente
1
He editado /root/.bashrc pero no puedo encontrarlo: sudo source /root/.bashrcgets: sudo: source: command not foundy sin el sudopermiso denegado (como se esperaba). Creo que comenzar un nuevo terminal debería, en teoría, hacer lo mismo que la fuente, pero después de comenzar un nuevo terminal, sudo mvn --versiontodavía no encuentra nada.
izomorphius Support Monica
@izomorphius No puedes sudo fuente. Primero debe cambiar a sudo con el comando sudo su , luego puede obtener el archivo en cuestión. No hay otra forma de hacerlo.
MariusMatutiae