Я пытаюсь выполнить скрипт на 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
когда вы это сделаете, ваш скрипт не остановится на ошибках. Обычно используйте #!/bin/bash -e
, чтобы ваш скрипт выдавал ошибку, а не продолжал выполнять дальнейшие команды, которые, вероятно, также завершатся с ошибкой.
Пожалуйста, взгляните на Как создать минимальный, полный и проверяемый пример.
Пожалуйста, взгляните на Как форматировать сообщения с помощью Markdown или HTML?.
Первый скрипт #!/bin/bash echo ./i.sh 2 состоит из трех отдельных строк. Я предполагаю, что сообщение отформатировало это таким образом, и я не уловил его. Я не знаю, как это исправить, потому что он выглядит правильно, когда я иду его редактировать.
@BradPitt: исправил вашу проблему ./i.sh 2
, но вывод example5.sh
- нечитаемый кошмар. Удалите любое текущее форматирование (или удалите и повторно вставьте из исходного источника), затем выберите этот текст мышью и щелкните инструмент {}
в меню «Правка» в верхней части окна редактирования. Это должно отформатировать его как code/data/output/errMsgs
. Удачи.
Кроме того, я вижу простую ошибку. 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
, чтобы уменьшить размер вашего кода. Удачи.\
Всем извините за плохое форматирование, но я стараюсь, спасибо за терпение. erik258 - спасибо, я добавил -e Cyrus/Shelter - я попробовал ваши предложения, но все равно выдает ошибку о форматировании в виде кода... Я удалил большую часть веб-вывода, потому что он неактуален после Ошибка «Нет доступного контроллера по умолчанию». Это лучше?
Хорошая работа по улучшению «внешнего вида» вашего вопроса. Намного легче читать. Я думаю, что это действительно expect
проблема. Добавление тега, чтобы нужные люди получили ваш вопрос в своей «ленте». Но вам будет полезно прочитать, просмотреть и принять близко к сердцу элементы на этой странице: stackoverflow.com/tags/bash/info. Пропустите информацию о версии вверху и найдите темы с пометками «Прежде чем спрашивать о проблемном коде» и «Как превратить плохой сценарий в хороший вопрос». Вы можете обнаружить, что 2-3 строки кода демонстрируют эту проблему. .Удачи.
Итак, я свел сценарии к минимуму, который, по моему мнению, все еще работает. Я не эксперт по сценариям, и я использовал некоторый существующий код для сценария example5.sh, поэтому изначально я был многословен. По сути, скрипт работает при запуске из командной строки, но не работает при запуске с веб-страницы. Каковы могут быть причины? Приют, я прочитал предложенную вами ссылку, но ничего не появляется как виновник. Я провел много часов в поисках чего-то в Интернете, но безрезультатно, поэтому я обращаюсь к экспертам. Я ценю помощь.
приют, основываясь на вашем комментарии к ожидаемому, я сделал очень простой скрипт без него и вызвал его напрямую, не используя два скрипта, но он дает тот же результат. Обновил тело со скриптами и результатами.
РЕШЕНО! Оказывается, у пользователя 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 " выключи».).
#!/bin/bash echo ./i.sh 2
это то, что у вас есть в файле /. это недопустимый вызов bash