sudo -u nazwa użytkownika -s „cmd arg” zwraca polecenie nie znaleziono

10

Kiedyś wykonywałem polecenie:

sudo -u elasticsearch -s "ulimit -Hn"

i zwracał wartość ulimit -Hn widzianą przez użytkownika elasticsearch, dopóki nie wypróbowałem go na Ubuntu 11.10. Tam zwraca:

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

Próbowałem kilku różnych poleceń, a kiedy używam argumentu, zawsze pojawia się komunikat „polecenie nie znaleziono”:

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

Jakieś pomysły na to, jak wykonać polecenie wymagające argumentów sudo?

Joaquin Cuenca Abela
źródło
dlaczego -s? Po prostu zachowaj normalną powłokę i używaj jej do wykonywania poleceń. Takich jak sudo -u elasticsearch ls all.sh. Jeśli elasticsearchma domyślną powłokę, której nie można użyć, użyj jej -s bash przed właściwym poleceniem.
glglgl 12.11.11

Odpowiedzi:

16

Musisz usunąć podwójne cudzysłowy. Próbuje uruchomić polecenie o nazwie „ulimit -Hn” jako pojedyncze polecenie, spacje i wszystko. -smusi być ostatnią sudoopcją w sudowierszu poleceń, a wszystkie poniższe argumenty są przekazywane $SHELL -cdo wykonania.

sudo -u elasticsearch -s ulimit -Hn

Wydaje mi się, że sposób -sprzetwarzania został zmieniony, ponieważ obecny sposób pozwala przekazywać argumenty spacjami $SHELL, unikając ich w wierszu poleceń:

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

Stara metoda obsługi argumentów dzieliłaby ten '/tmp/foo bar'argument na dwie części, przerywając polecenie.

camh
źródło
gdzie przetestowałeś, że to nie podzieli polecenia?
Zarathustra,
@Zarathustra To było pięć lat temu - nie pamiętam tak daleko. Sugeruję przejrzenie historii kodu źródłowego sudo - powinieneś być w stanie dowiedzieć się, kiedy zachowanie się zmieniło.
camh