1

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 サーバーからいつでも実行できるようにするにはどうすればよいでしょうか?

4

2 に答える 2

0

まず、 getoptを使用する必要があります。

PHP では、短い形式と長い形式の両方をサポートしています。

使用デモは、リンク先のページに記載されています。あなたの場合、タグの 2 番目のパラメーター<message>として a が含まれているかどうかを検出するのが難しいと思います。-sメッセージを独自のオプションのパラメーターにする方がおそらく簡単です。

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

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

Web サーバーから何かを実行する場合は... と を使用してコマンドライン PHP スクリプトに変数を渡しますが、getopt()とを使用し$argvて Web サーバーから変数を渡します。$_GET 変数をコマンド ライン オプションにマップする適切な方法を見つけられれば、問題ありません。$_GET$_POST

コマンド ライン スクリプトを取得して Web サーバー経由で実行する場合は、他にもさまざまな考慮事項があることに注意してください。パーミッションとセキュリティは密接に関係しており、通常は互いに逆の機能を果たします。つまり、必要なことを実行できるようにアクセス許可を開くと、サーバーの脆弱性が公開されたり、作成されたりする可能性があります。あなたがより経験を積んでいない限り、または物事が壊れたり、スクリプトキディによって攻撃されたりしても気にしない場合を除いて、これを行うことはお勧めしません。

于 2012-11-01T04:44:52.903 に答える
-1

あなたはバックティックを探しています、見てください

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

または、 shell_exec() を使用できます

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

于 2012-11-01T02:52:44.457 に答える