在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 相关文章推荐
php &amp;&amp; 逻辑与运算符使用说明
Mar 04 PHP
PHP迅雷、快车、旋风下载专用链转换代码
Jun 15 PHP
php学习之数据类型之间的转换介绍
Jun 09 PHP
zf框架的校验器InArray使用示例
Mar 13 PHP
PHP Reflection API详解
May 12 PHP
如何利用http协议发布博客园博文评论
Aug 03 PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 PHP
配置Nginx+PHP的正确思路与过程
May 10 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
php解析非标准json、非规范json的方式实例
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巧获服务器端信息
2006/12/06 PHP
PHP实现微信对账单处理
2018/10/01 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
Python流程控制常用工具详解
2020/02/24 Python
如何利用Python 进行边缘检测
2020/10/14 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
园艺师求职信
2014/03/10 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
市场调查策划方案
2014/06/10 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
Redis分布式锁Redlock的实现
2021/08/07 Redis
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS