sudo -u username -s "cmd arg" devuelve el comando no encontrado

10

Solía ​​ejecutar el comando:

sudo -u elasticsearch -s "ulimit -Hn"

y estaba devolviendo el valor de ulimit -Hn como lo vio el usuario elasticsearch hasta que lo probé en Ubuntu 11.10. Ahí vuelve:

/bin/bash: ulimit -Hn: command not found

Intenté algunos comandos diferentes, y cuando uso un argumento siempre obtengo "comando no encontrado":

$ sudo -u elasticsearch -s "ls all.sh"
/bin/bash: ls all.sh: command not found

¿Alguna idea sobre cómo puedo ejecutar un comando que requiere argumentos sudo?

Joaquin Cuenca Abela
fuente
por qué el -s? Simplemente mantenga el shell normal y úselo para ejecutar comandos. Tales como sudo -u elasticsearch ls all.sh. Si elasticsearchtiene un shell predeterminado inutilizable, úselo -s bash antes del comando real.
glglgl

Respuestas:

16

Necesita eliminar las comillas dobles. Está tratando de ejecutar un comando llamado "ulimit -Hn" como un solo comando, espacios y todo. -sdebe ser la última sudoopción en la sudolínea de comando, y todos los siguientes argumentos se pasan $SHELL -ca ejecutar.

sudo -u elasticsearch -s ulimit -Hn

Supongo que la forma en que -sse procesa ha cambiado, ya que la forma actual le permite pasar argumentos con espacios $SHELLescapándolos en la línea de comando:

$ touch '/tmp/foo bar'
$ sudo -s rm '/tmp/foo bar'

El antiguo método de manejo de argumentos dividiría ese '/tmp/foo bar'argumento en dos, rompiendo el comando.

camh
fuente
¿dónde se prueba que sería no dividir el comando?
Zarathustra
@Zarathustra Eso fue hace cinco años, no recuerdo tan lejos. Sugeriría buscar en el historial del código fuente de sudo: debería poder encontrar cuándo cambió el comportamiento.
camh