sudo -u username -s «cmd arg» возвращает команду не найдена

10

Я использовал для выполнения команды:

sudo -u elasticsearch -s "ulimit -Hn"

и он возвращал значение ulimit -Hn, как его видел пользовательasticsearch, пока я не попробовал его в Ubuntu 11.10. Там это возвращается:

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

Я пробовал несколько разных команд, и когда я использую аргумент, я всегда получаю «команда не найдена»:

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

Любые идеи о том, как я могу выполнить команду, которая требует аргументов до конца sudo?

Хоакин Куэнка Абела
источник
почему то -s? Просто держите обычную оболочку и используйте ее для выполнения команд. Такие как sudo -u elasticsearch ls all.sh. Если elasticsearchимеет непригодную оболочку по умолчанию, используйте -s bash перед фактической командой.
glglgl

Ответы:

16

Вам необходимо удалить двойные кавычки. Он пытается запустить команду с именем "ulimit -Hn" как одну команду, пробелы и все. -sдолжен быть последним sudoпараметром в sudoкомандной строке, и все последующие аргументы передаются $SHELL -cдля выполнения.

sudo -u elasticsearch -s ulimit -Hn

Я предполагаю, что способ -sобработки изменился, поскольку текущий способ позволяет передавать аргументы с пробелами $SHELL, экранируя их в командной строке:

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

Старый метод обработки аргументов разделял этот '/tmp/foo bar'аргумент на две части, разбивая команду.

CAMH
источник
где вы проверить , что было бы не расколоть команду?
Заратустра
@Zarathustra Это было пять лет назад - я не могу вспомнить назад так далеко. Я бы посоветовал покопаться в истории исходного кода sudo - вы сможете найти, когда изменилось поведение.
Camh