<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="PHP中运行Linux命令(su命令以执行sshd服务)并启动SSH服务的例子" id="card1">
<p> 游客</p><p>
标题:PHP中运行Linux命令(su命令以执行sshd服务)并启动SSH服务的例子<br/>
正文:<br/>
升级 VPS 后，由于 Ubuntu 的 upstart 与 OpenVZ 的兼容问题，导致 sshd 服务不自动启动了，在尝试了 vePortal 的 console 与 file manager 及提交技术支持后都不能解决问题之后。只能靠自己了，大概的思路是在 PHP 中进行 su 命令以执行 sshd 服务，因为 WordPress 还活着，并且可以在后台直接编辑主题相关的 PHP 脚本。只要把准备好的代码片断插入到 header.php 中，并在浏览器中访问一下主页即可。相关的代码逻辑<br/>1. 使用 PHP 的 proc_open 打开一个进程，重定向 stdin, stdout, stderr, 这里会执行一个 python 程序。<br/>2. 在这个 python 程序中打开一个 pty，并运行一个 sh。<br/>3. 利用步骤 1 中重定向的 stdin pipe 向 python 程序发送 su 命令, python 会将来自 stdin 的命令数据写到入 ptmx，而这时 sh 的 stdin, stdout 及 stderr 是重定向到与 python 打开的 ptmx 配对的 pts 上的。也就是说 su 命令最终会转给 sh 进程处理。<br/>4. sh 进程自然的执行了 su 命令，这时 su 进程的 stdin, stdout, stderr 也会被重定向到那个 pts 上。<br/>5. 在 sleep 一段时间后（主要是等 su 真的跑起来了），再写入密码，数据流过程与步骤 3、4 一致。相关的代码片断：代码如下:&amp;lt;?php<br/>  $descriptorspec = array(<br/>    0 =&amp;gt; array(&quot;pipe&quot;, &quot;r&quot;),  // stdin<br/>    1 =&amp;gt; array(&quot;pipe&quot;, &quot;w&quot;),  // stdout<br/>    2 =&amp;gt; array(&quot;pipe&quot;, &quot;w&quot;)   // stderr<br/>  );<br/>  $process = proc_open(&quot;python -c 'im<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1616&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1616&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1616&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1616&amp;Page=2">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=1616">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=1616">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>