如何模拟在PHP脚本中使用参数运行的命令行?

时间:2012-11-01 02:48:06

标签: php shell command-line

如何使用PHP脚本中的参数模仿脚本的命令行运行?或者那是不可能的?

换句话说,假设你有以下脚本:

#!/usr/bin/php
<?php
require "../src/php/whatsprot.class.php";

function fgets_u($pStdn) {
    $pArr = array($pStdn);

    if (false === ($num_changed_streams = stream_select($pArr, $write = NULL, $except = NULL, 0))) {
        print("\$ 001 Socket Error : UNABLE TO WATCH STDIN.\n");
        return FALSE;
    } elseif ($num_changed_streams > 0) {
        return trim(fgets($pStdn, 1024));
    }
}

$nickname = "WhatsAPI Test";
$sender =   ""; // Mobile number with country code (but without + or 00)
$imei =     ""; // MAC Address for iOS IMEI for other platform (Android/etc) 


$countrycode = substr($sender, 0, 2);
$phonenumber=substr($sender, 2);

if ($argc < 2) {
    echo "USAGE: ".$_SERVER['argv'][0]." [-l] [-s <phone> <message>] [-i <phone>]\n";
    echo "\tphone: full number including country code, without '+' or '00'\n";
    echo "\t-s: send message\n";
    echo "\t-l: listen for new messages\n";
    echo "\t-i: interactive conversation with <phone>\n";
    exit(1);
}

$dst=$_SERVER['argv'][2];
$msg = "";
for ($i=3; $i<$argc; $i++) {
    $msg .= $_SERVER['argv'][$i]." ";
}

echo "[] Logging in as '$nickname' ($sender)\n";
$wa = new WhatsProt($sender, $imei, $nickname, true);

$url = "https://r.whatsapp.net/v1/exist.php?cc=".$countrycode."&in=".$phonenumber."&udid=".$wa->encryptPassword();
$content = file_get_contents($url);
if(stristr($content,'status="ok"') === false){
    echo "Wrong Password\n";
    exit(0);
}

$wa->Connect();
$wa->Login();

if ($_SERVER['argv'][1] == "-i") {
    echo "\n[] Interactive conversation with $dst:\n";
    stream_set_timeout(STDIN,1);
    while(TRUE) {
        $wa->PollMessages();
        $buff = $wa->GetMessages();
        if(!empty($buff)){
            print_r($buff);
        }
        $line = fgets_u(STDIN);
        if ($line != "") {
            if (strrchr($line, " ")) {
                // needs PHP >= 5.3.0
                $command = trim(strstr($line, ' ', TRUE));
            } else {
                $command = $line;
            }
            switch ($command) {
                case "/query":
                    $dst = trim(strstr($line, ' ', FALSE));
                    echo "[] Interactive conversation with $dst:\n";
                    break;
                case "/accountinfo":
                    echo "[] Account Info: ";
                    $wa->accountInfo();
                    break;
                case "/lastseen":
                    echo "[] Request last seen $dst: ";
                    $wa->RequestLastSeen("$dst"); 
                    break;
                default:
                    echo "[] Send message to $dst: $line\n";
                    $wa->Message(time()."-1", $dst , $line);
                    break;
            }
        }
    }
    exit(0);
}

if ($_SERVER['argv'][1] == "-l") {
    echo "\n[] Listen mode:\n";
    while (TRUE) {
        $wa->PollMessages();
        $data = $wa->GetMessages();
        if(!empty($data)) print_r($data);
        sleep(1);
    }
    exit(0);
}

echo "\n[] Request last seen $dst: ";
$wa->RequestLastSeen($dst); 

echo "\n[] Send message to $dst: $msg\n";
$wa->Message(time()."-1", $dst , $msg);
echo "\n";
?>

要运行此脚本,您需要转到命令行,直到文件所在的目录,然后键入php -s "whatsapp.php" "Number" "Message"之类的内容。

但是,如果我想完全绕过命令行并直接在脚本中执行此操作,以便我可以随时从Web服务器运行它,我该怎么做?

2 个答案:

答案 0 :(得分:0)

首先,你应该使用getopt

在PHP中,它支持短格式和长格式。

用法演示记录在我链接到的页面上。在您的情况下,我怀疑您在检测<message>标记的第二个参数中是否包含-s时会遇到困难。将消息作为自己选项的参数可能会更容易。

$options = getopt("ls:m:i:");

if (isset($options["s"] && !isset($options["m"])) {
  die("-s needs -m");
}

至于从Web服务器运行......好吧,使用getopt()$argv将变量传递给命令行PHP脚本,但是使用{{1}从Web服务器传递变量}和$_GET。如果你能找到一种合理的方法来映射$ _GET变量你的命令行选项,你应该很高兴。

请注意,在获取命令行脚本并通过Web服务器运行它时,存在各种其他注意事项。许可和安全性齐头并进,通常作为彼此的反函数。也就是说,如果您打开权限以便允许其执行所需操作,则可能会在服务器上暴露甚至创建漏洞。我不建议你这样做,除非你更有经验,或者你不介意事情破坏或被脚本小子攻击到你的服务器。

答案 1 :(得分:-1)

您正在寻找反叛,请参阅

http://php.net/manual/en/language.operators.execution.php

或者您可以使用shell_exec()

http://www.php.net/manual/en/function.shell-exec.php