Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Perl в CGI выполнения команд linux


Автор: axeopa 14.9.2013, 17:43
Всем привет! начал учить perl. Есть задача сразу по делу. Надо сделать CGI страницу, на которой будет 2 формы, в одной вписывается номер, в другой текст сообщения, и кнопка "отправить". Когда жмешь ту кнопку, на той машине должна исполниться такая системная команда:

sendsms "+380636548100" "dsadasda"

конечно что номер и сообщение должно быть с той формы. У кого какие идеи? буду благодарен за любые советы.

Автор: Jimy 14.9.2013, 19:46
С чем конкретно затруднение?

Автор: axeopa 14.9.2013, 20:03
было бы хорошо, если бы Вы рассказали как бы Вы это делали, я незнаю с какой стороны приступить, пока набросал такое

#!/usr/bin/perl
use Time::Local;

use CGI qw (:standard);
print "Content-type: text/html\n\n";

print <<EOM;

<html>
<head>
<title>Відправка повідомлення</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<body background="3.jpg">
<style type="text/css">
.style2 {color:#DD00FB}
.style3 {color:#00CCFB}
<!--
body {
    background-color: #9B06F9;
}
-->


</style></head>


<body>

EOM

if(param("No") || !param){
mainform();
}
elsif(!param("Yes")){

$mesg = param("fielmesg");
$phone = param("fieldphone");

$err_input=0;
#check entered data
if($mesg !~ /\D/){$err_input=1; $err="Некоректно введено повідомлення";}
if($phone =~ /['"~!^&}+|<>%{}|?;:#=\$'a-zA-Z0]/){$err_input=1; $err="Некоректно введений номер телефону";}


if($err_input==0){adduser();}
else{errdata();}
}


sub errdata{
print <<EOM;
<div align="center">
<h3 class="style2">Помилка при введенні даних! $err</h3>
</div>
EOM

}

sub mainform{
print <<EOM;
<form name="form1" method="post" action="">
  <table width="600" height="250" border="10" align="center" cellpadding="10" cellspacing="20" bgcolor="#CECEBE">
    <tr>
      <td width="200"><div align="center">
        Номер телефону:<br>
        У форматі +3(8-XXX)XXX-XX-XX:<br>
      <input type="text" MAXLENGTH="10" name="fielphone">

        </div></td>
    <tr>
      <td width="200"><div align="center">
        Повідомлення ( латиницею ):<br>
        
        
        <textarea type="text" cols="40" rows="4" wrap="virtual" MAXLENGTH="160"  name="fieldmesq"s  ></textarea><br>
        
        

        </div></td>
     
    </tr>
  
  <td colspan="1"><div align="center">
        
        <input type="reset" name="reset" value="       Очистити       ">
        <input type="submit" name="Submit" value="       Надіслати       ">    
        
        <button type="button" onclick="service httpd stop">вирубати апач</button>
        <button type="button" onclick="./home/tst1.sh">вирубати апач</button>
  
  </table>
</form>
EOM
}

Автор: Jimy 15.9.2013, 12:59
В целом ход мыслей правильный. Но код написан небрежно.
Имена полей в форме не совпадают с именами ожидаемыми в скрипте.
Регулярные выражения для проверки значений - нелепые.
Например, условие $mesg !~ /\D/ выполнится только в двух случаях: если сообщение будет пустое или будет содержать только цифры.
Корректные регулярки для проверки телефонов точно есть в гугле.
Нет кода функции adduser.

Автор: axeopa 16.9.2013, 22:36
почитав пирса, кльовий чувак, написав такий код, результат на картинці, тепер треба ту команду перенаправити на консоль щоб вона виконалась, поможіть, останній крок лишився

http://s57.radikal.ru/i156/1309/e3/56fcb064b816.png

#!/usr/bin/perl -w
use CGI qw/:standard/;
print
    header,
    start_html('sms gateway'),
    h1('sms gateway'),
    start_form,
    "enter number : ",textfield('num'),p,
    "enter sms    : ",textfield('sms'),p,
    submit,
    end_form,
    hr,"\n";
 if (param) {
    print "sendsms ", "\"" , param('num'), "\"", " \""  , param('sms'), "\"" ;
    }
    
    print end_html;

Автор: infarch 17.9.2013, 12:02
my $result = `sendsms "+38xxxx" "pret"`;

Автор: axeopa 18.9.2013, 00:52
Це ту команду потрібно вставити тупо в текст програми немає різниці в яке місце ? я пробую неполучається, вона невиконується, може якісь права треба дати чи щось таке ?

Автор: infarch 18.9.2013, 11:05
Начните с малого: напишите перл скрипт (pl файл) для записи в лог файл той строки что пришла в него как аргумент. Выполните из консоли и убедитесь что работает. Потом напишите второй скрипт, опять таки для консоли, а не для CGI. Одним из этих способов:
http://perldoc.perl.org/functions/system.html
http://perldoc.perl.org/functions/exec.html
выполните первый скрипт и посмотрите или срабатывает. Если да то пробуйте отправить смс. Если нет то изучайте код ошибки используя первый метод (system). И только когда вы сможете отправлять смс из консоли, переносите это в веб и CGI. Вот тут, если не сработает, уже можно будет говорить о правах и прочих сложных материях.

Автор: axeopa 18.9.2013, 14:01
я в етот cgi файл добавляю строки


Код

$num1 = +380636999100 ;
$sms1 = " asdasdasd ";
system "sendsms \"$num1\" \"$sms1\"  ";



тогда из консоли

Код

[root@www billing]# perl -w go3.cgi


смс приходить. cgi ведь можна запускать как perl

Автор: axeopa 18.9.2013, 14:31
сначала думал чо проблема в то, что там команда состоит из 3 слов, сделал так:

Код

$now = "int ". `ifconfig`;
print "$now";



вот что :

http://s2.ipicture.ru/uploads/20130918/f7gBQy7N.png

вроде всьо гуд, потом сделал так:

Код

$now = "int ". `ifconfig eth0`;
print "$now";


http://s2.ipicture.ru/uploads/20130918/0754m9Bw.png

получил вивод только о  eth0, без localhost.
тоесть команди работают, но не все, пробовал писать астановку апача тіпа 
Код

"service httpd stop"
 неработает. может какой то дебаг включить, или логи както посмотреть, есть ли какиєто средства здєсь ?

Автор: infarch 19.9.2013, 10:04
Вот это я не понял: 
$now = "int ". `ifconfig`;
Нет, я вижу конкатенацию слова int с результатом, а смысл?
print "$now"; - Зачем интерполяция?
$num1 = "+380636999100"; с кавычками стоило бы написать.

И возвращаясь к вопросу о правах: может веб сервер не имеет права на то что вы  хотите сделать? Вообще такие штуки как смс, емейл, стоит делать через отдельный сервис который под нужными правами работает. А задачи передавать через базу данных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)