在PHP中运行Linux命令并启动SSH服务的例子


Posted in PHP onJune 12, 2014

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

PHP 相关文章推荐
E路文章系统PHP
Dec 11 PHP
说明的比较细的php 正则学习实例
Jul 30 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
Apr 29 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
php上传文件并存储到mysql数据库的方法
Mar 16 PHP
php判断访问IP的方法
Jun 19 PHP
php单一接口的实现方法
Jun 20 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
用php实现分页效果的示例代码
Dec 10 PHP
PHP小教程之实现双向链表
Jun 12 #PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
Jun 12 #PHP
PHP命名空间(Namespace)简明教程
Jun 11 #PHP
PHP APC配置文件2套和参数详解
Jun 11 #PHP
PHP捕获Fatal error错误的方法
Jun 11 #PHP
PHP独立Session数据库存储操作类分享
Jun 11 #PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 #PHP
You might like
生成卡号php代码
2008/04/09 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
serialVersionUID具有什么样的特征
2014/02/20 面试题
《这儿真好》教学反思
2014/02/22 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
项目合作协议书
2014/09/23 职场文书
华山导游词
2015/02/03 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
pandas数值排序的实现实例
2021/07/25 Python