在PHP中运行Linux命令并启动SSH服务的例子
升级VPS后,由于Ubuntu的upstart与OpenVZ的兼容问题,导致sshd服务不自动启动了,在尝试了vePortal的console与filemanager及提交技术支持后都不能解决问题之后。
只能靠自己了,大概的思路是在PHP中进行su命令以执行sshd服务,因为WordPress还活着,并且可以在后台直接编辑主题相关的PHP脚本。只要把准备好的代码片断插入到header.php中,并在浏览器中访问一下主页即可。
相关的代码逻辑
1.使用PHP的proc_open打开一个进程,重定向stdin,stdout,stderr,这里会执行一个python程序。
2.在这个python程序中打开一个pty,并运行一个sh。
3.利用步骤1中重定向的stdinpipe向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'importpty;pty.spawn(\"/bin/sh\")'",$descriptorspec,$pipes); if(is_resource($process)){ fwrite($pipes[0],"su-c'servicesshstart'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); } ?>