[asterisk-users] System Command not executing php

J Gao jgao at veecall.com
Wed Aug 24 18:42:27 CDT 2011


On 11-08-24 03:48 PM, Steve Edwards wrote:
> On Wed, 24 Aug 2011, J Gao wrote:
>
>> I admit that using AGI() may not correct here. This is a work around 
>> about passing multiple args to php script. (I had this trouble 
>> before.) I would like to know what is the correct way to call the php 
>> script through SYSTEM().
>
> (Please keep in mind I'm not a PHP weenie so my experiences may be 
> colored by my C background.)
>
> Depending on how your host is set up and the contents of your script, 
> it may be as simple as:
>
>         exten = *,n,system(example.php)
>
> This assumes your script starts with a 'shebang' like:
>
>     #!/usr/bin/php -f
>
> and that the path to example.php is enumerated in the PATH environment 
> variable of the Asterisk process.
>
> If these conditions are not met, you can specify your way around them 
> in the parameters (arguments sound so argumentative) passed to the 
> system() application.
>
> The process executing Asterisk must also have execute permission to 
> every directory in the path to the script and both read and execute 
> permissions to the script. Using '777' is insecure and the mark of a 
> newb.
>
> You can pass multiple parameters on the command line like:
>
>         exten = *,n,system(echo ${EPOCH} ${CHANNEL} >/tmp/foo)
>
> You can confirm its execution with:
>
>     cat /tmp/foo
>
> (When I wrote this example, I used the EXTEN channel variable instead 
> of EPOCH. Extra points for the first reader to explain why that was 
> not a good example. Anyone, anyone?)
>
> So the problem is not passing multiple parameters, but accessing them 
> in your program.
>
> In most programming languages, the program initialization code creates 
> and populates an array containing either the parameters or pointers to 
> the parameters.
>
> In PHP, the array is named $argv. In C, it is whatever the programmer 
> named the second parameter to the main() function. I think most C 
> programmers name this array of char pointers argv because everybody 
> expects that it have this name.
>
> In any case, the 'zeroth' element contains the path to the program 
> which may be useful if you have multiple links to the program because 
> you want the program to behave differently depending on which link was 
> used to execute the program. Probably not, but now you know.
>
> Within your script you can access the command line parameters with 
> code like:
>
> #!/usr/bin/php -f
> <?
>
>         echo "The zeroth parameter is \"$argv[0]\"\n";
>         echo "The first parameter is \"$argv[1]\"\n";
>         echo "The second parameter is \"$argv[2]\"\n";
>
>         exit(0);
>
> ?>
>
> If you were to execute this script with a dialplan like:
>
>         exten = *,n,system(echo.php ${EPOCH} ${CHANNEL} >/tmp/foo)
>
> you would find that /tmp/foo contained:
>
> The zeroth parameter is "./echo.php"
> The first parameter is "1314224887" The second parameter is 
> "SIP/841-line-1-b7961340"
>
> Personally (leaping up on my soapbox), I find specifying a bunch of 
> anonymous parameters difficult to maintain. I prefer to use the 
> getopt() function in PHP (or getopt_long() function in C) and define a 
> 'self-documenting' command line. (I also do this for my AGIs.)
>
> For example, I would define '--channel' and '--epoch' options so that 
> I could execute the above example like:
>
>         exten = *,n,system(echo.php --epoch=${EPOCH} 
> --channel=${CHANNEL})
>
> or
>
>         exten = *,n,system(echo.php --channel=${CHANNEL} 
> --epoch=${EPOCH})
>
> Aside from allowing you to specify the parameters in any order (I'm 
> big on 'alphabetization'), it is much easier to maintain when you pass 
> several parameters.
>
Thank you Steve for the reply. I tested your way and it works. So I am 
going to correct my scripts. (But I hasn't figure out your question 
about the using of EXTEN channel variable. I can only guessing it could 
be you are using "*".)

Cheers,

jian

-- 




More information about the asterisk-users mailing list