在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 相关文章推荐
PHP5中使用DOM控制XML实现代码
May 07 PHP
php数据库抽象层 PDO
May 07 PHP
php中Smarty模板初体验
Aug 08 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
Jun 05 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
php操作access数据库的方法详解
Feb 22 PHP
php微信支付之公众号支付功能
May 30 PHP
PHP中16个高危函数整理
Sep 19 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
php把大写命名转换成下划线分割命名
2015/04/27 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
JavaScript静态的动态
2006/09/18 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
python插入排序算法的实现代码
2013/11/21 Python
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python获取时间戳代码实例
2019/09/24 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
研究生毕业鉴定
2014/01/29 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
中学教师读书笔记
2015/07/01 职场文书
教师节座谈会主持词
2015/07/03 职场文书
JS的深浅复制详细
2021/10/16 Javascript