在PHP中運行Linux命令並啟動SSH服務的例子_php執行個體

來源:互聯網
上載者:User

升級 VPS 後,由於 Ubuntu 的 upstart 與 OpenVZ 的相容問題,導致 sshd 服務不自動啟動了,在嘗試了 vePortal 的 console 與 file manager 及提交支援人員後都不能解決問題之後。

只能靠自己了,大概的思路是在 PHP 中進行 su 命令以執行 sshd 服務,因為 WordPress 還活著,並且可以在後台直接編輯主題相關的 PHP 指令碼。只要把準備好的代碼片斷插入到 header.php 中,並在瀏覽器中訪問一下首頁即可。

相關的代碼邏輯
1. 使用 PHP 的 proc_open 開啟一個進程,重新導向 stdin, stdout, stderr, 這裡會執行一個 python 程式。
2. 在這個 python 程式中開啟一個 pty,並運行一個 sh。
3. 利用步驟 1 中重新導向的 stdin pipe 向 python 程式發送 su 命令, python 會將來自 stdin 的命令資料寫到入 ptmx,而這時 sh 的 stdin, stdout 及 stderr 是重新導向到與 python 開啟的 ptmx 配對的 pts 上的。也就是說 su 命令最終會轉給 sh 進程處理。
4. sh 進程自然的執行了 su 命令,這時 su 進程的 stdin, stdout, stderr 也會被重新導向到那個 pts 上。
5. 在 sleep 一段時間後(主要是等 su 真的跑起來了),再寫入密碼,資料流過程與步驟 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\n");
    fflush($pipes[0]);
    sleep(3);
    fwrite($pipes[0], "PASSWORD\n");
    fflush($pipes[0]);
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);
  }
?>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.