在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 setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
Jun 24 PHP
php中hashtable实现示例分享
Feb 13 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
Yii2实现log输出到file及database的方法
Nov 12 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
PHP实现文件上传后台处理脚本
Mar 04 PHP
PHP二维数组分页2种实现方法解析
Jul 09 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
js 小数取整的函数
2010/05/10 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
python从ftp下载数据保存实例
2013/11/20 Python
Python中的下划线详解
2015/06/24 Python
Python tkinter事件高级用法实例
2018/01/31 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
利用python求积分的实例
2019/07/03 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
Python模块常用四种安装方式
2020/10/20 Python
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
周年庆典邀请函范文
2014/01/24 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python