在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 AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
PHP计划任务、定时执行任务的实现代码
Apr 23 PHP
解析php取整的几种方式
Jun 25 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
PHP实现HTTP断点续传的方法
Jun 17 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
php实现的递归提成方案实例
Nov 14 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
PHP实现图片压缩
Sep 09 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中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
JS实现时间格式化的方式汇总
2013/10/16 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
jQuery动态添加
2016/04/07 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
python将时分秒转换成秒的实例
2019/12/07 Python
python3中编码获取网页的实例方法
2020/11/16 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
出国留学自荐信
2013/10/25 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
个人简历自我评价
2014/02/02 职场文书
学历公证书范本
2014/04/09 职场文书
五好关工委申报材料
2014/05/31 职场文书
运动会班级口号
2014/06/09 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
Vue深入理解插槽slot的使用
2022/08/05 Vue.js