sudo -u Benutzername -s "cmd arg" gibt den Befehl nicht gefunden zurück

10

Ich habe den Befehl ausgeführt:

sudo -u elasticsearch -s "ulimit -Hn"

und es gab den Wert von ulimit -Hn zurück, wie von Benutzer elasticsearch gesehen, bis ich es unter Ubuntu 11.10 versuchte. Dort kehrt es zurück:

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

Ich habe ein paar verschiedene Befehle ausprobiert und wenn ich ein Argument verwende, erhalte ich immer "Befehl nicht gefunden":

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

Irgendwelche Ideen, wie ich einen Befehl ausführen kann, für den Argumente erforderlich sind sudo?

Joaquin Cuenca Abela
quelle
warum die -s? Behalten Sie einfach die normale Shell und verwenden Sie sie, um Befehle auszuführen. Wie zum Beispiel sudo -u elasticsearch ls all.sh. Wenn elasticsearcheine unbrauchbare Standard-Shell vorhanden ist, verwenden Sie diese -s bash vor dem eigentlichen Befehl.
glglgl

Antworten:

16

Sie müssen die doppelten Anführungszeichen entfernen. Es wird versucht, einen Befehl namens "ulimit -Hn" als einen einzelnen Befehl, Leerzeichen und alles auszuführen. -smuss die letzte sudoOption in der sudoBefehlszeile sein, und alle folgenden Argumente werden $SHELL -czur Ausführung übergeben.

sudo -u elasticsearch -s ulimit -Hn

Ich denke, die Art und Weise, -swie verarbeitet wird, hat sich geändert, da Sie mit der aktuellen Methode Argumente mit Leerzeichen übergeben können, $SHELLindem Sie sie in der Befehlszeile maskieren:

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

Die alte Methode der Argumentbehandlung würde dieses '/tmp/foo bar'Argument in zwei Teile teilen und den Befehl unterbrechen.

camh
quelle
Wo haben Sie getestet, dass der Befehl nicht aufgeteilt wird?
Zarathustra
@ Zarathustra Das war vor fünf Jahren - ich kann mich nicht so weit zurück erinnern. Ich würde vorschlagen, den Sudo-Quellcode-Verlauf zu durchsuchen - Sie sollten feststellen können, wann sich das Verhalten geändert hat.
Camh