在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 MSSQL 存储过程的方法
Dec 24 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
Oct 08 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
thinkphp5实现无限级分类
Feb 18 PHP
php array_chunk()函数用法与注意事项
Jul 12 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的SQL注入实现(测试代码安全不错)
2011/02/27 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
php生成随机颜色的方法
2014/11/13 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
js中时间格式化的几种方法
2018/07/22 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
python实现微信接口(itchat)详细介绍
2017/10/23 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
对Python中plt的画图函数详解
2018/11/07 Python
Python3爬虫全国地址信息
2019/01/05 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
python复合条件下的字典排序
2020/12/18 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
私有程序集与共享程序集有什么区别
2013/04/05 面试题
AJAX的优缺点都有什么
2015/08/18 面试题
金融专业个人的自我评价
2013/10/18 职场文书
齐云山导游词
2015/02/06 职场文书
Python PIL按比例裁剪图片
2022/05/11 Python