42

私はcronジョブが初めてで、これが機能するかどうかわかりません.

セキュリティ上の理由から、特定の GET 値 (ユーザー名、パスワード、およびセキュリティ コード) を検索する 1 ページのスクリプトを作成して、コンピューターと 3 つすべてを知っている人だけがコマンドを実行できるようにすることを考えました。

スクリプトを作成し、ブラウザで実行すると動作しますが、GET 値を使用して cron ジョブを実行することは可能ですか?

例は私が走っていることです

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

これは可能ですか?

4

9 に答える 9

11

あなたの質問に対する直接的な答えではありませんが、より良い解決策だと思います:

cron 以外にスクリプトを実行させたくない場合は、web-root の外に置いてください。そうすれば、Web サーバー経由のアクセスはまったくありません。

コマンドを特別なユーザーとしても実行する必要がある場合は、使用せずGETにユーザーログインを取得し、ログインセッション(特定のセットセッション変数...)を確認し、そのページにのみスクリプトを含めます.

一般にアクセス可能なスクリプトは次のようになります。

session_start();

if (isset($_SESSION['user']))
{
  include '/path/to/script/outside/of/web-root';
}
else
{
  die('No access.');
}
于 2012-07-02T16:55:52.290 に答える
5

この投稿はすでに数年前のものですが、これが最も役に立ったので、他の人にも役立つように私の調査結果を共有させてください.

私は DirectAdmin を使用しており、cron の例は両方とも機能しています。[Send all Cron output to E-Mail] からメール アドレスを削除したため、cron ジョブのメール通知が届きません。

20 分ごとに実行される cURL リクエストから始めました。

*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'

URL の前後の「 」に注意してください。そうしないと、複数のパラメータを追加できません。

私はそのページを API にインスパイアされた方法として使用して、別の Web サイトから収集したいくつかの統計の更新をトリガーし、他の Web サイトから JSON 形式で取得できるようにしています。パラメータ「update」は更新プロセスをトリガーし、パラメータ「key」は、検証されると、cronjob が更新を要求したときにのみ実行したい追加の更新アクションをトリガーします。

上記の cronjob は基本的に両方向で帯域幅を消費するので、PHP ベースの cronjob を使用したかったのですが、パラメーターに問題が発生しました...そのため、この投稿を見つけて 1 日を節約できました :)

*/20 * * * * /usr/local/bin/php /home/path/to/public_html/app/stats/index.php update key=1234

ご覧のとおり、ファイル名 (index.php) がパスに含まれるようになり、その後にパラメーターが続きます (? と & は使用しません)。

このようにして cronjob を動作させることができますが、パラメーターが経由で渡されないため、途中までしか進んでいません...キー$_GETのチェックを使用してスクリプトをコーディングした場合、これは少し面倒です!$_GET

それで、それはどのように機能しますか?シンプルな (少なくともいくつかの調査の後)、cronjob は という名前の変数を介してスクリプトにパラメーターを渡します$argv

その知識をもとに、 を次のように変換する方法を探しまし$argv$_GET

  1. 更新は、手動と cronjob の両方でトリガーできます。
  2. スクリプト全体を書き直す必要はありませんでした。

$argvが実際に設定されている場合にのみ実行する次のソリューションを見つけたので、if issetチェックでラップしました。

if( isset( $argv ) )
{
    foreach( $argv as $arg ) {
        $e = explode( '=', $arg );
        if( count($e) == 2 )
            $_GET[$e[0]] = $e[1];
        else    
            $_GET[$e[0]] = 0;
    }
}

これもあなたに役立つことを願っています:)

于 2017-01-03T17:01:40.523 に答える
2

これはうまくいきます:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
于 2012-07-02T16:56:00.053 に答える