Скрипт bash работает из командной строки, но возвращает «Нет доступного контроллера по умолчанию» при запуске как скрипт cgi через сервер apache

Я пытаюсь выполнить скрипт на raspberry pi для управления устройством Bluetooth через скрипт url cgi (apache2). Могут быть и другие способы сделать это, но я изо всех сил пытался установить php без блокировки ОС (несколько часов потрачено впустую), и меня не интересует ничего сложного.

У меня есть рабочий bash-скрипт, который управляет Bluetooth-устройством с Raspberry Pi. Однако, когда этот же скрипт вызывается через URL-адрес (например, /cgi-bin/example5.sh), bluetoothctl вместо этого возвращает «Нет доступного контроллера по умолчанию». Я могу без проблем запускать простые сценарии, но почему-то bluetoothctl не выполняется таким же образом через URL-адрес. Возможно, проблема связана с владением или переменной среды? Сценарий имеет права доступа 755 и принадлежит пользователю root. Будем признательны за любую помощь в отладке.

Мой сценарий /usr/lib/cgi-bin/example5.sh и просто вызывает попытки подключиться к устройству Bluetooth через bluetoothctl (мак-адрес настоящего устройства Bluetooth удален, потому что, вы знаете, люди).

#!/bin/bash -e
echo Content-type: text/plain
echo
bluetoothctl -- connect "XX:XX:XX:XX:XX:XX"

Из командной строки это работает правильно:

pi@raspberrypi:/usr/lib/cgi-bin $ ./example5.sh
Content-type: text/plain

Attempting to connect to XX:XX:XX:XX:XX:XX
Connection successful

Когда я вхожу http://<my local IP address>/cgi-bin/example5.sh, я получаю следующее на веб-странице.

No default controller available
#!/bin/bash echo ./i.sh 2 это то, что у вас есть в файле /. это недопустимый вызов bash
erik258 04.02.2023 18:29
#!/bin/bash когда вы это сделаете, ваш скрипт не остановится на ошибках. Обычно используйте #!/bin/bash -e, чтобы ваш скрипт выдавал ошибку, а не продолжал выполнять дальнейшие команды, которые, вероятно, также завершатся с ошибкой.
erik258 04.02.2023 18:31

Пожалуйста, взгляните на Как создать минимальный, полный и проверяемый пример.

Cyrus 04.02.2023 18:36

Пожалуйста, взгляните на Как форматировать сообщения с помощью Markdown или HTML?.

Cyrus 04.02.2023 18:37

Первый скрипт #!/bin/bash echo ./i.sh 2 состоит из трех отдельных строк. Я предполагаю, что сообщение отформатировало это таким образом, и я не уловил его. Я не знаю, как это исправить, потому что он выглядит правильно, когда я иду его редактировать.

Brad Pitt 04.02.2023 20:36

@BradPitt: исправил вашу проблему ./i.sh 2, но вывод example5.sh - нечитаемый кошмар. Удалите любое текущее форматирование (или удалите и повторно вставьте из исходного источника), затем выберите этот текст мышью и щелкните инструмент {} в меню «Правка» в верхней части окна редактирования. Это должно отформатировать его как code/data/output/errMsgs. Удачи.

shellter 04.02.2023 20:52

Кроме того, я вижу простую ошибку. set -- 10; echo "\$1=$1"; if [[ $1 == 1* ]]; then echo bad match ; fi. Посмотрите на case "$1" in 10* ) speed = "0x0a 0x0b 0x79;; 0 *... ;; 1* ) .... ;; 2* ) .... ;; esac, чтобы уменьшить размер вашего кода. Удачи.\

shellter 04.02.2023 23:33

Всем извините за плохое форматирование, но я стараюсь, спасибо за терпение. erik258 - спасибо, я добавил -e Cyrus/Shelter - я попробовал ваши предложения, но все равно выдает ошибку о форматировании в виде кода... Я удалил большую часть веб-вывода, потому что он неактуален после Ошибка «Нет доступного контроллера по умолчанию». Это лучше?

Brad Pitt 05.02.2023 00:20

Хорошая работа по улучшению «внешнего вида» вашего вопроса. Намного легче читать. Я думаю, что это действительно expect проблема. Добавление тега, чтобы нужные люди получили ваш вопрос в своей «ленте». Но вам будет полезно прочитать, просмотреть и принять близко к сердцу элементы на этой странице: stackoverflow.com/tags/bash/info. Пропустите информацию о версии вверху и найдите темы с пометками «Прежде чем спрашивать о проблемном коде» и «Как превратить плохой сценарий в хороший вопрос». Вы можете обнаружить, что 2-3 строки кода демонстрируют эту проблему. .Удачи.

shellter 05.02.2023 02:23

Итак, я свел сценарии к минимуму, который, по моему мнению, все еще работает. Я не эксперт по сценариям, и я использовал некоторый существующий код для сценария example5.sh, поэтому изначально я был многословен. По сути, скрипт работает при запуске из командной строки, но не работает при запуске с веб-страницы. Каковы могут быть причины? Приют, я прочитал предложенную вами ссылку, но ничего не появляется как виновник. Я провел много часов в поисках чего-то в Интернете, но безрезультатно, поэтому я обращаюсь к экспертам. Я ценю помощь.

Brad Pitt 05.02.2023 05:21

приют, основываясь на вашем комментарии к ожидаемому, я сделал очень простой скрипт без него и вызвал его напрямую, не используя два скрипта, но он дает тот же результат. Обновил тело со скриптами и результатами.

Brad Pitt 05.02.2023 16:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

РЕШЕНО! Оказывается, у пользователя Apache2 по умолчанию www-data не было разрешения на запуск bluetoothctl. Я добавил следующее в /etc/dbus-1/system.d/bluetooth.conf

  <policy user = "www-data">
    <allow send_destination = "org.bluez"/>
    <allow send_interface = "org.bluez.Agent1"/>
    <allow send_interface = "org.bluez.GattCharacteristic1"/>
    <allow send_interface = "org.bluez.GattDescriptor1"/>
    <allow send_interface = "org.freedesktop.DBus.ObjectManager"/>
    <allow send_interface = "org.freedesktop.DBus.Properties"/>
  </policy>

Спасибо всем за помощь.

Отличная работа! Вы можете принять свой собственный ответ через 48 часов и получить ценные очки репутации! Продолжайте публиковать и делайте это как можно проще, но не меньше! (-;! (Возможно, вы захотите понять это ограничение и почему оно существует. Если это только ваш домашний сервер, риск небольшой, но если на вашей работе и в производственной системе, вероятно, существует угроза безопасности, из-за которой Apache " выключи».).

shellter 05.02.2023 19:29

Другие вопросы по теме