sudo -u ім'я користувача -s „cmd arg“ повертає команду не знайдено


10

Я використовував для виконання команди:

sudo -u elasticsearch -s "ulimit -Hn"

і вона повертала значення ulimit -Hn, як це бачило користувач elasesearch, поки я не спробував це на 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'аргумент на два, розбивши команду.


де ви перевірили, що вона не розділить команду?
Заратустра

@Zarathustra Це було п'ять років тому - я не можу так далеко згадати. Я б пропонував перекопати історію вихідного коду sudo - ви повинні мати можливість знайти, коли поведінка змінилася.
camh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.