Как запустить команду от имени другого пользователя - PullRequest
0 голосов
/ 27 июня 2019

У меня есть сценарий оболочки, который делает несколько вызовов Asterisk в какой-то момент и показывает некоторые результаты. Вызов Asterisk - первое, что я попробовал, и кажется, что не работает. Я определил, что у пользователя, которого я настроил для запуска сценария, не было разрешений на запуск Asterisk, поэтому я искал способы запустить его от имени root, чтобы обойти это (единственный другой пользователь в системе).

Я пытался использовать su без удачи. Последние два часа я возился с sudo и sudoers и не смог заставить его работать.

Например, в моем скрипте есть код, который запускается пользователем com:

printf "\n"
calls=`sudo "asterisk -rx 'core show channels'" | grep "active call"`
lastinboundcaller=`cat /var/log/asterisk/lastcaller.txt`
printf '%s\n' "Current Call Count: $calls"
printf '%s\n' "Last Inbound Caller: $lastinboundcaller"

Выход:

[sudo] password for com:
sudo: asterisk -rx 'core show channels': command not found
Current Call Count:
Last Inbound Caller: Unknown

Здесь есть две проблемы,

  1. Он запрашивает пароль. Почему он запрашивает текущий пароль пользователя, а не пароль root, я понятия не имею, но он вообще не должен запрашивать пароль.
  2. Команда Asterisk asterisk -rx "command" все еще не работает & mdash; Другими словами, по-прежнему не удается запустить оболочку Asterisk, хотя она должна иметь разрешение.

Я попытался обновить свой sudoers файл и создать новый файл в /etc/sudoers.d под названием asterisk, а также ввести туда свою команду.

Моя последняя модификация этого файла:

com ALL = (ALL:ALL) NOPASSWD: /usr/sbin/asterisk

До этого я пробовал:

com ALL = (root) NOPASSWD: /usr/sbin/asterisk

Насколько я понимаю, должно позволять пользователю com выполнять звездочку как sudo без пароля. Понятно, что что-то не работает.

Я следил за ответами на многочисленные похожие сообщения SO, например:

К сожалению, несмотря на то, что я следовал всем ответам на этот вопрос, ни один из них не помог мне.

Кто-нибудь может указать мне правильное направление здесь или предложить альтернативу? Я уже консультировался с экспертом по Linux, и это, кажется, правильный подход. Это все очень легко сделать в Windows, и я удивлен, что все это запутанно в Linux.

1 Ответ

1 голос
/ 27 июня 2019

Не указывайте аргумент sudo. Он ожидает, что первым аргументом будет имя команды, поэтому он думает, что вся командная строка - это имя программы.

должно быть

calls=`sudo asterisk -rx 'core show channels' | grep "active call"`

Почему он запрашивает пароль текущего пользователя, а не пароль root, я понятия не имею, но он вообще не должен запрашивать пароль.

Вот так sudo работает. Он запрашивает пароль текущего пользователя и проверяет /etc/sudoers, чтобы узнать, разрешено ли ему запускать команду. Вы думаете о su, который запрашивает пароль root.

...