升級 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);
}
?>