Доступ до коду виходу за межами su -m $ USER -c “<cmd>”


8

Наведена нижче команда друкує "0" або "1" правильно залежно від відмови чи ні, тому що я поставив $? всередині команди "su".

sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"

Однак якщо я це зробити:

sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?

він завжди буде надрукувати "0", оскільки власне "su" завжди буде успішним, навіть якщо командна частина виходить з ладу.

Будь-яка ідея, як я можу отримати код виходу з нижньої частини?

Відповіді:


7

Я просто виправив майже таку саму ситуацію. Сподіваюся, це все-таки допоможе вам, якщо не, можливо, іншим. Я почав з su, а не з sudo, але оскільки судо призначений для завершення однієї іншої команди, йому дійсно слід передати код виходу su. Якщо ні, ви також можете застосувати виправлення нижче на рівні судо.

Як ви зазначили, головна проблема полягає в тому, що Su успішно виконує свою команду. Дія за замовчуванням полягає в тому, щоб повідомити про те, що він виконаний без проблем, і тому він повертає код виходу 0. Він не "знає", що код виходу не 0 з команди був несподіваним, або що він повинен щось робити з нею. Таким чином, рішення досить просто змусити повернути вихідний код останньої команди. Це зробило це для мене

su <user_x> -c '<bunch_of_commands>; exit $?'

У випадку, якщо sudo не грає добре, вся команда повинна бути приблизно такою (я би перевірив це для вас, але у мене не встановлено sudo)

sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'

Слідкуйте за вкладенням котирувань і переконайтеся, що $? не розширюється, тому немає подвійних лапок.


2

Відлучіть повернене значення всередині команди та отримайте доступ до неї назовні, призначивши всю команду змінній (використовуючи нижню оболонку.)

RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL

0

Ви завжди можете використовувати tmp-файл:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code

Так, це я зараз роблю, але я сподівався не покладатися на tmp-файл.
Нік

0

Це працює в оболонках Zsh / Bash / Bourne:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"
$ echo $?

Я не впевнений, чому код повернення недоступний, коли ви запитуєте його в одноланковому вкладиші, але він доступний, коли ви використовуєте більше, ніж один рядок, щоб зробити те саме.


Це насправді не правильно. Це завжди поверне нуль, тому що "su -m $ USER -c <cmd>" завжди буде успішним, навіть якщо фактична команда всередині нього не відповідає.
Нік

1
@Nick - Тут працює. Який результат? Спробуйте, sudo su -m zero2cx -c "/bin/false &> /dev/null"але зі своїм системним ім’ям користувача. $?має бути "1".
zero2cx

Так, із власним іменем користувача він повертає "1", як очікувалося. Але я намагаюся використовувати це для запуску програми через власного користувача, а не root або будь-якого іншого користувача.
Нік

@ Nick - Це повинно працювати з $ USER=appusernameнабором за вашим бажанням. Не користуйтеся справжнім іменем користувача, непрочитайте його за призначенням appusername. Це має працювати, це робить для мене.
zero2cx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.