在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 相关文章推荐
将数组写入txt文件 var_export
Apr 21 PHP
PHP 读取文件内容代码(txt,js等)
Dec 06 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
用来解析.htgroup文件的PHP类
Sep 05 PHP
PHP 数组和字符串互相转换实现方法
Mar 26 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
php简单备份与还原MySql的方法
May 09 PHP
laravel自定义分页效果
Jul 23 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 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
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
2014/11/22 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
zend framework重定向方法小结
2016/05/28 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
javascript 写类方式之二
2009/07/05 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
python中requests库session对象的妙用详解
2017/10/30 Python
python绘制直线的方法
2018/06/30 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
Python3进制之间的转换代码实例
2019/08/24 Python
python 画函数曲线示例
2019/12/04 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
新娘父亲婚礼致辞
2014/01/16 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
职工趣味运动会方案
2014/02/10 职场文书
企业管理标语
2014/06/10 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
比赛口号霸气押韵
2015/12/24 职场文书