Попытка создать ссылки на веб-страницы, которые будут запускать Perl-скрипт

Я использую сервер Ubuntu с Apache2 и Zoneminder (программа камеры безопасности). У меня есть одна камера (но в конечном итоге будет три), которая имеет наклон и масштабирование (PTZ). В программе Zoneminder (веб-интерфейс PHP) с помощью навигации по страницам вы можете получить окно, в котором есть элемент управления PTZ. Для создания этой страницы он использует несколько вызовов на разные PHP-страницы, и вы можете нажать кнопку предварительной установки, и камера перейдет к месту, указанному для предварительной настройки.

У камер, которые я настрою, будет два местоположения, которые я буду называть "Безопасность" и "Открыть". Я хочу создать ссылки, по которым я могу щелкнуть, и он отправит команду без необходимости переходить к окну управления.

Я обнаружил, что, когда вы добираетесь до нужной области в zoneminder для PTZ камеры и нажимаете кнопку "1", веб-сайт отправляет команду

/usr/bin/zmcontrol.pl --preset=1 --command=presetGoto --id=3

который может быть запущен из терминала на сервере Ubuntu и действительно устанавливает камеру в нужное место.

ОБНОВЛЕНИЕ РЕДАКТИРОВАНИЕ 3: (Это то, что я собираюсь сейчас, поэтому я удалил все данные из других попыток очистить этот пост)

Попытка чего-то совершенно другого, и я почти заставил это работать так, как я хочу. Я создал два новых файла под названием security.pl а также open.pl.. теперь в /usr/lib/zoneminder/cgi-bin.. это то, что я пока имею в отношении security.pl (open.pl идентичен, но с другой предустановкой, конечно):

#!/usr/bin/perl

my @command1 = ("/usr/bin/zmcontrol.pl", "--preset=1", "--command=presetGoto", "--id=3");
print "Content-type: text/html\n\n";
print "<br><br><center><a href=javascript:history.back()>BACK</a></center>";
system(@command1);

и в montage.php and console.php ссылки, которые я добавляю, чтобы сделать эту функцию:

<a href="cgi-bin/security.pl">Security</a>

Этот подход работает и меняет местоположение камеры одним щелчком мыши. Единственная проблема, с которой я столкнулся сейчас, это то, что при этом остается пустая страница с обратной ссылкой, показывающей прямую ссылку на скрипт perl в адресной строке.

Это будет работать для меня, но в конечном итоге я бы хотел, чтобы скрипт security / open.pl автоматически запускал ссылку "назад", чтобы он выполнял команду и возвращался на страницу, на которую нажали.

я пытался print redirect(-url => 'javascript:history.back()'); вместо <a href=javascript:history.back()> линия, но это просто оставляет меня с пустой страницей, и камера не двигается

Извините за все это безумие... но я близок... Способ его настройки теперь работает и должен быть легко расширен, если я добавлю дополнительные камеры, он был бы просто улучшен, если бы у меня не было пустой страницы с обратная ссылка, и она просто автоматически вернется на страницу (без необходимости жестко кодировать адрес, потому что он будет связан на разных страницах и иногда доступен с локального адреса, а иногда и с интернет-адреса).

Я также замечаю одну проблему "безопасности" с этим подходом... если вы знаете имя и местоположение скрипта... он обходит регистрацию в zoneminder, так что любой может изменить местоположение камеры (смеюсь, я не буду использовать имена, которые я использовал в этом посте так, на всякий случай)

Для моей ситуации... риск низок, и мне было достаточно сложно придумать это много. Я уверен, что выясню, как сделать так, чтобы проверить, авторизован ли пользователь, щелкающий по этой ссылке, сделать это в Zoneminder... так что любой, кто введет ссылку в браузере без входа в Zoneminder, не сможет функционировать... это будет еще сложнее.

Я предполагаю, что мне нужно будет покопаться в PHP и выяснить, что есть у php "controls", который проверяет это, прежде чем это разрешит, а затем найти способ правильно добавить его в скрипт perl, чтобы он загружал страницу, которая выполняет Правильная проверка, если она проходит, запускает команду. Но это в другой раз.

2 ответа

Решение

ОК... Я наконец смог получить то, что хотел, поэтому я решил потратить столько времени на передачу информации

Я получил его на работу с помощью следующего сценария Perl для security.pl а также open.pl помещен в /usr/lib/zoneminder/cgi-bin..as, как для моего поста, я помещу здесь только security.pl, потому что open.pl - это то же самое, что и предустановленные настройки.

security.pl:

 #!/usr/bin/perl
 my @command1 = ("/usr/bin/zmcontrol.pl", "--preset=1", "--command=presetGoto", "--id=3");
 print "Content-type: text/html\n\n";
 system(@command1);
 print qq!<script>
 window.close()
 </script>!;

и ссылки, которые я добавил в montage.php и console.php:

 <a href="cgi-bin/open.pl" target="popup">open</a>
 <a href="cgi-bin/security.pl" target="popup">Security</a>

это откроет всплывающее окно и запустит нужную команду, затем закроет окно, оставив экран монтажа / консоли нетронутым, поэтому нет необходимости "назад"

Это был долгий путь... есть еще проблема безопасности, с которой мне придется столкнуться в будущем, но на данный момент она работает так, как я хотел... в конце концов я смогу выяснить все остальное:D спасибо @Ricardo за ваша попытка

Чтобы сделать эту работу, я сделаю что-то вроде этого:

<?php
    $command = '--command=presetGoto';
    $cam1 = '--id=3';

    function setOpen() {
        $preset = '--preset=1';
        exec("/usr/bin/perl -w /usr/bin/zmcontrol.pl $preset $command $cam1");
    } 

    function setSecurity() {
        $preset = '--preset=2';
        exec("/usr/bin/perl -w /usr/bin/zmcontrol.pl $preset $command $cam1");
    } 

    if (isset($_GET['setSecurity'])) {
        setSecurity();
    }
    if (isset($_GET['setOpen'])) {
        setOpen();
    }
?>

и измените эти две строки следующим образом:

<a href="" onclick="custom.php?setOpen=true">Open</a>
<a href="" onclick="custom.php?setSecurity=true">Security</a>
Другие вопросы по тегам