在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制作简单的内容采集器的代码
Nov 28 PHP
PHP 变量类型的强制转换
Oct 23 PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
PHP中类的自动加载的方法
Mar 17 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
七种PHP开发环境搭建工具
Jun 28 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
9个PHP开发常用功能函数小结
2011/07/15 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
js定时器实例分享
2016/12/20 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
深入理解JavaScript 箭头函数
2019/05/30 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python中的rjust()方法使用详解
2015/05/19 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
护理职业生涯规划书
2014/01/24 职场文书
厂区绿化方案
2014/05/08 职场文书
微笑服务演讲稿
2014/05/13 职场文书
团队会宣传标语
2014/10/09 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
党员证明信
2015/06/19 职场文书
MySql分区类型及创建分区的方法
2022/04/13 MySQL