在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 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
PHP游戏编程25个脚本代码
Feb 08 PHP
php 获取全局变量的代码
Apr 21 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
Jul 14 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
Dec 21 PHP
php装饰者模式简单应用案例分析
Oct 23 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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中opendir函数用法实例
2014/11/15 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
js面向对象编程总结
2017/02/16 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python sys.argv[]用法实例详解
2018/05/25 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
教师专业理论水平的自我评价分享
2013/11/09 职场文书
应征英语教师求职信
2013/11/27 职场文书
应届毕业生自我评价分享
2013/12/15 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
批评与自我批评范文
2014/10/15 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
Oracle中日期的使用方法实例
2022/07/07 Oracle