在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添加MySQL数据记录代码
Jun 07 PHP
PHP 一个页面执行时间类代码
Mar 05 PHP
php下使用curl模拟用户登陆的代码
Sep 10 PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
php使用百度翻译api示例分享
Jan 31 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
PHP基本语法总结
Sep 06 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 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
php调用mysql存储过程
2007/02/14 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php 实现进制相互转换
2016/04/07 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
javascript的内存管理详解
2013/08/07 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
Python深入学习之对象的属性
2014/08/31 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
python图像常规操作
2017/11/11 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
python实现打砖块游戏
2020/02/25 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
PHP中如何创建和修改数组
2012/05/02 面试题
怎样在程序里获得一个空指针
2015/01/24 面试题
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
会计岗位职责
2015/02/03 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript