PHPでLinuxコマンドを実行してSSHサービスを起動する例


VPSをアップグレードした後、Ubuntuのup startとOpenVZの互換性の問題で、sshdサービスが自動的に起動しなくなりました。vePortalのconsoneとfile managerを試してみました。技術サポートを提出しても問題が解決できなくなりました。
自分だけでいいです。PHPでスコマンドを実行します。WordPressはまだ生きていますので、テーマに関するPHPスクリプトは楽屋で直接編集できます。用意したコードの断片をheader.phpに挿入してブラウザでホームページを訪問すればいいです。
関連コード論理1.PHPのproc_を使用するopenはプロセスを開き、stdin、stdout、stder、ここでpythonプログラムを実行します。2.このpythonプログラムでptyを開き、shを実行します。3.ステップ1でリダイレクトされたstdin pipeを利用して、pythonプログラムにスコマンドを送信します。pythonはstdinからのコマンドデータをptmxに書き込みます。このときshのstdinは、stdoutおよびstderがpythonで開いているptmxと対になるptsにリダイレクトされます。つまりス命令は最終的にshプロセスに移行します。4.shプロセスは自然にスコマンドを実行します。この時スプロセスのstdin、stdout、stderもそのptsにリダイレクトされます。5.sleepの時間後(主にスーが本当に走るのを待つ)にパスワードを書き込み、データの流れはステップ3、4と一致します。
関連コードの断片:

<?php
  $descriptorspec = array(
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout
    2 => array("pipe", "w")   // stderr
  );
  $process = proc_open("python -c 'import pty; pty.spawn(\"/bin/sh\")'", $descriptorspec, $pipes);
  if (is_resource($process)) {
    fwrite($pipes[0], "su -c 'service ssh start' root
");
    fflush($pipes[0]);
    sleep(3);
    fwrite($pipes[0], "PASSWORD
");
    fflush($pipes[0]);
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);
  }
?>