2016-08-21 5 views
0

ユーザが特定のbashスクリプトをバックグラウンドで実行し、そのコンテンツを取得し、そのファイルを保存するために使用された一時ファイルを削除できるWebベースのインタフェースを作成しようとしています。出力。すべてが計画どおりに動作しているようですしながら、PHPでテンポラリファイルの名前とパスを保存する

<form method="POST"> 
    <button type="submit" name="scan" class="btn btn-default">Run script</button> 
</form> 

<?php 

if (isset($_POST['scan'])) { 

    $tmpfname = tempnam("/tmp", "SS-"); 
    shell_exec('script.sh > '. $tmpfname .' &'); 
} 

?> 

<form method="POST"> 
    <button type="submit" name="check-and-delete" class="btn btn-default">Check if script is running and delete the temporary file</button> 
</form> 

<?php 

if (isset($_POST['check-and-delete'])) { 
    if (shell_exec("pgrep <its process>") != '') { 
     echo 'Script is running'; 

    } else { 
     echo 'Script is NOT running'; 

     echo '<pre>'. file_get_contents($tmpfname) .'</pre>'; 
     unlink($tmpfname); 
    } 
} 

しかし、最終的には、$tmpfnameは、そのコンテンツを取得し、それを削除することができなくなる空のように表示されます。これまでのところ私は、これは持っています。

次のようになります:

  1. ユーザーはRun scriptをクリックします。
    • 1.1. tmpファイルが作成されました。
    • 1.2.スクリプトは実行され、出力はtmpファイルにリダイレクトされます。
  2. ユーザクリックCheck if script is running and delete the temporary file
    • 2.1.スクリプトがまだ実行中であるかどうかを確認するためのチェックが実行されました。スクリプトがまだ実行されている場合は、何も行われずにエコーされます。
    • 2.2.スクリプトが実行されていない(終了している)場合は、tmpファイルの内容を取得してファイルを削除する必要があります。

問題が2.2に遭遇しています。一時ファイルの名前/フルパスを永続的に保存するにはどうすればよいですか

+0

ここでの問題は、 '$ tmpfname'の値が2番目の投稿で利用できないことです。フォームに追加したり、セッションに保存したりすることもできます。 PS:あなたのコードをより一般的にするためには、 'tempnam("/tmp "、" SS - ")の代わりに' tempnam(sys_get_temp_dir()、 'SS - '); –

+0

「フォームに追加する」とはどういう意味ですか? – McJohnson

+0

私は次のように書いています:第2フォームに '$ tmpfname'を隠しフィールドとして追加してください。 –

答えて

1

これは、私が言ったことを明確にするはずです:セッションに$tmpfnameを保存してください。私はこのコードを保証するものではありません、他のエラーがあるかもしれません。

// always start sessions 
session_start(); 

<form method="POST"> 
    <button type="submit" name="scan" class="btn btn-default">Run script</button> 
</form> 

<?php 

if (isset($_POST['scan'])) { 

    $tmpfname = tempnam(sys_get_temp_dir(), "SS-"); 
    shell_exec('script.sh > '. $tmpfname .' &'); 
    // store in session 
    $_SESSION['tmpfname'] = $tmpfname; 
} 

?> 

<form method="POST"> 
    <button type="submit" name="check-and-delete" class="btn btn-default">Check if script is running and delete the temporary file</button> 
</form> 

<?php 

if (isset($_POST['check-and-delete'])) { 
    if (shell_exec("pgrep <its process>") != '') { 
     echo 'Script is running'; 

    } else { 
     echo 'Script is NOT running'; 
     // retrieve from session 
     $tmpfname = $_SESSION['tmpfname']; 
     echo '<pre>'. file_get_contents($tmpfname) .'</pre>'; 
     unlink($tmpfname); 
    } 
} 
+0

それは働いています。答えを受け入れ、あなたの時間をありがとう。しかし、私はまだセッションなしでフォーム内でどのようにこれを達成できるのか不思議です。可能であればPoCもできますか?ありがとうございました。 – McJohnson

+0

隠しフォームフィールドを使用するのは良い解決策ではありませんが、信頼性がありません。しかし、次のように動作します:このコードを2番目の形式に追加してください: '<?エコー ""; ?> '$ _POST ['tmpfname']'として送信します。 –

+0

ああ、そうです。はい、私はセッションに固執します。ヘッドアップに感謝します。 – McJohnson

関連する問題