sudo -u nom d'utilisateur -s «cmd arg» renvoie la commande introuvable

10

J'ai utilisé pour exécuter la commande:

sudo -u elasticsearch -s "ulimit -Hn"

et il retournait la valeur de ulimit -Hn telle que vue par l'utilisateur elasticsearch jusqu'à ce que je l'essaie sur Ubuntu 11.10. Là, il revient:

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

J'ai essayé quelques commandes différentes, et quand j'utilise un argument, j'obtiens toujours "commande introuvable":

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

Toutes les idées sur comment puis-je exécuter une commande qui nécessite des arguments sudo?

Joaquin Cuenca Abela
la source
pourquoi le -s? Gardez simplement le shell normal et utilisez-le pour exécuter des commandes. Tels que sudo -u elasticsearch ls all.sh. Si elasticsearcha un shell par défaut inutilisable, utilisez -s bash avant la commande réelle.
glglgl

Réponses:

16

Vous devez supprimer les guillemets doubles. Il essaie d'exécuter une commande appelée "ulimit -Hn" en tant que commande unique, espaces et tout. -sdoit être la dernière sudooption de la sudoligne de commande et tous les arguments suivants sont passés à $SHELL -cpour s'exécuter.

sudo -u elasticsearch -s ulimit -Hn

Je suppose que la façon dont -sest traité a changé, car la façon actuelle vous permet de passer des arguments avec des espaces $SHELLen les échappant sur la ligne de commande:

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

L'ancienne méthode de gestion des arguments divisait cet '/tmp/foo bar'argument en deux, rompant la commande.

camh
la source
où avez-vous testé qu'il ne diviserait pas la commande?
Zarathustra
@Zarathustra C'était il y a cinq ans - je ne me souviens pas si loin. Je suggère de fouiller dans l'historique du code source sudo - vous devriez pouvoir trouver quand le comportement a changé.
camh