在PHP中運(yùn)行Linux命令并啟動SSH服務(wù)的例子
升級 VPS 后,由于 Ubuntu 的 upstart 與 OpenVZ 的兼容問題,導(dǎo)致 sshd 服務(wù)不自動啟動了,在嘗試了 vePortal 的 console 與 file manager 及提交技術(shù)支持后都不能解決問題之后。
只能靠自己了,大概的思路是在 PHP 中進(jìn)行 su 命令以執(zhí)行 sshd 服務(wù),因?yàn)?WordPress 還活著,并且可以在后臺直接編輯主題相關(guān)的 PHP 腳本。只要把準(zhǔn)備好的代碼片斷插入到 header.php 中,并在瀏覽器中訪問一下主頁即可。
相關(guān)的代碼邏輯
1. 使用 PHP 的 proc_open 打開一個進(jìn)程,重定向 stdin, stdout, stderr, 這里會執(zhí)行一個 python 程序。
2. 在這個 python 程序中打開一個 pty,并運(yùn)行一個 sh。
3. 利用步驟 1 中重定向的 stdin pipe 向 python 程序發(fā)送 su 命令, python 會將來自 stdin 的命令數(shù)據(jù)寫到入 ptmx,而這時 sh 的 stdin, stdout 及 stderr 是重定向到與 python 打開的 ptmx 配對的 pts 上的。也就是說 su 命令最終會轉(zhuǎn)給 sh 進(jìn)程處理。
4. sh 進(jìn)程自然的執(zhí)行了 su 命令,這時 su 進(jìn)程的 stdin, stdout, stderr 也會被重定向到那個 pts 上。
5. 在 sleep 一段時間后(主要是等 su 真的跑起來了),再寫入密碼,數(shù)據(jù)流過程與步驟 3、4 一致。
相關(guān)的代碼片斷:
<?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);
}
?>
相關(guān)文章
php實(shí)現(xiàn)可以設(shè)置中獎概率的抽獎程序代碼分享
這篇文章主要介紹了一個抽獎程序,要求一等獎的中獎概率是0.12%,二等獎中獎概率是3%,三等獎中獎概率是12%,其他中獎概率是都是謝謝惠顧2014-01-01
CodeIgniter自定義控制器MY_Controller用法分析
這篇文章主要介紹了CodeIgniter自定義控制器MY_Controller用法,結(jié)合實(shí)例形式分析了CodeIgniter自定義控制器MY_Controller的定義與使用技巧,需要的朋友可以參考下2016-01-01
Laravel Memcached緩存驅(qū)動的配置與應(yīng)用方法分析
這篇文章主要介紹了Laravel Memcached緩存驅(qū)動的配置與應(yīng)用方法,結(jié)合實(shí)例形式分析了在Laravel框架配置Memcached緩存及相關(guān)使用方法,需要的朋友可以參考下2016-10-10
thinkphp數(shù)據(jù)查詢和遍歷數(shù)組實(shí)例
這篇文章主要介紹了thinkphp數(shù)據(jù)查詢和遍歷數(shù)組的方法,包括數(shù)據(jù)庫的DSN方法配置、CURD操作方法以及模板的遍歷數(shù)組等技巧,具有一定的借鑒價值,需要的朋友可以參考下2014-11-11
php實(shí)現(xiàn)12306火車票余票查詢和價格查詢(12306火車票查詢)
這篇文章主要介紹了使用php實(shí)現(xiàn)的12306火車票余票查詢和價格查詢功能,大家參考使用吧2014-01-01
CI使用Tank Auth轉(zhuǎn)移數(shù)據(jù)庫導(dǎo)致密碼用戶錯誤的解決辦法
Tank Auth是針對Codeigniter的權(quán)限管理類庫,功能很強(qiáng)大。但是將數(shù)據(jù)庫轉(zhuǎn)到另一臺服務(wù)器上,會出現(xiàn)之前的用戶名和密碼都無法登錄的情況。這篇文章主要介紹了CI使用Tank Auth轉(zhuǎn)移數(shù)據(jù)庫導(dǎo)致密碼用戶錯誤的解決辦法,需要的朋友可以參考下2014-06-06

