在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之第三天
Oct 09 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
Jan 06 PHP
PHP开发中常用的字符串操作函数
Feb 08 PHP
php URL验证正则表达式
Jul 19 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
php去掉URL网址中带有PHPSESSID的配置方法
Jul 08 PHP
php获取url参数方法总结
Nov 13 PHP
PHP register_shutdown_function()函数的使用示例
Jun 23 PHP
php类自动加载器实现方法
Jul 28 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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/07/08 PHP
深入解析php中的foreach函数
2013/08/31 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
JavaScript中的Location地址对象
2008/01/16 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
对numpy中shape的深入理解
2018/06/15 Python
Django中ORM的基本使用教程
2020/12/22 Python
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
会计系中文个人求职信
2013/12/24 职场文书
文明宿舍获奖感言
2014/02/07 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
入党综合考察材料
2014/06/02 职场文书
出纳岗位职责
2015/01/31 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL