在PHP中运行Linux命令并启动SSH服务的例子

升级 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);
  }
?>

(0)

相关推荐

  • ssh远程执行命令方法和Shell脚本实例

    写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 server 亲测!! ssh执行远程操作 命令格式 复制代码 代码如下: ssh -p $port $user@$p 'cmd'    $port : ssh连接端口号  $user: ssh连接用户名  $ip:ssh连接的ip地址  cmd:远程服务器需要执行的操作 准备工作 基于公私钥认证或者用户

  • vbs qq自动登录脚本改进版

    复制代码 代码如下: On Error Resume Next Dim WshShell, QQPath, QQselectset wshshell=createobject("wscript.shell")set fso=createobject("scripting.filesystemobject") key="HKLM\SOFTWARE\Tencent\PlatForm_TYPE_LIST\1\"QQPath=wshshell.regre

  • python下paramiko模块实现ssh连接登录Linux服务器

    本文实例讲述了python下paramiko模块实现ssh连接登录Linux服务器的方法.分享给大家供大家参考.具体分析如下: python下有个paramiko模块,这个模块可以实现ssh登录linux服务器,下面贴出代码,注意,我在centos5.6下,python2.6.5,paramiko-1.7的版本下测试成功. #!/usr/bin/env python import paramiko hostname='172.28.102.249' username='root' passwor

  • 脚本实现SSH登录邮件报警

    登录保护是一个非常重要的环节,下面通过图文并茂的方式给大家详细讲解下: 前两天@cyy 给我发了一个图 然后我就想到USHQ的ssh登录app通知功能,然后就像如果把这个部署到自用的服务器就好了.至少多一层安全系数. 首先要感谢@Legion 帮忙搞定了几个错误以及搞定了Geo2IP的JSON转换. (P.S.此人为自动化运维大神级人物,现任职于德国一数据统计企业.) 当然,我和他相比我就是战五渣了...大家一定要多向 @Legion 学习啊~~ 说下需要做的准备: sendmail或者Post

  • 在PHP中运行Linux命令并启动SSH服务的例子

    升级 VPS 后,由于 Ubuntu 的 upstart 与 OpenVZ 的兼容问题,导致 sshd 服务不自动启动了,在尝试了 vePortal 的 console 与 file manager 及提交技术支持后都不能解决问题之后. 只能靠自己了,大概的思路是在 PHP 中进行 su 命令以执行 sshd 服务,因为 WordPress 还活着,并且可以在后台直接编辑主题相关的 PHP 脚本.只要把准备好的代码片断插入到 header.php 中,并在浏览器中访问一下主页即可. 相关的代码逻

  • 在后台运行Linux命令的方法

    通常情况下,当你在终端运行一个命令,在你开始输入另外一个命令之前,你必须等待当前命令运行结束.这被称为在前台运行命令,或者前台进程.当一个进程在前台运行时,它占用了你的 shell,并且你可以通过输入设备和它进行交互. 那么当一个命令运行需要很长时间,而你又想同时运行另外的命令,应该怎么办?有几种选项可以选择.最明显并且最直接的选项就是启动一个新的 Shell 会话,并且在上面运行命令.另外一个选项,就是在后台运行命令. 一个后台进程就是说一个进程/命令在终端启动后,运行在后台,并且不会和用户发

  • python脚本内运行linux命令的方法

    本文实例讲述了python脚本内运行linux命令的方法.分享给大家供大家参考.具体实现方法如下: #/usr/bin/env python import subprocess class RunCmd(object): def cmd_run(self, cmd): self.cmd = cmd subprocess.call(self.cmd, shell=True) #Sample usage a = RunCmd() a.cmd_run('ls -l') 希望本文所述对大家的Python

  • 在IDEA中使用Linux命令的操作方法

    相比于Windows系统,Linux系统提供了大量丰富的命令行工具,可以简单高效地进行工作.而大部分开发人员,都只知道Linux系统的命令,不太清楚Windows系统的命令,所以我们希望能够在Windows系统也能使用到Linux系统的相关命令. Gow就是这么一款工具,在Windows系统安装Gow,就可以在cmd窗口使用Linux命令. Gow (Gnu On Windows)是Cygwin的轻量级替代品.一个Windows下模拟Linux命令行工具集合,它集成了Liunx环境下130多种实

  • golang代码中调用Linux命令

    目录 传统方案--crontab 分布式任务调度 go执行shell命令 实际我们在golang代码中调用Linux命令 1.普通调用 2.结合协程调用,可控制中断调用 传统方案--crontab 缺点 配置任务时,需要SSh登录脚本服务器进行操作 服务器宕机,任务将终止调度,需要人工迁移 排查问题低效,无法方便的查看任务状态与错误输出 分布式任务调度 优点 可视化Web后台,方便进行任务管理 分布式架构.集群化调度,不存在单点故障 追踪任务执行状态,采集任务输出,可视化log查看 go执行sh

  • 使用 windows bat 脚本命令一键启动MySQL服务的方法

    @echo off rem Copyright (c) 2019 Moses and/or its affiliates. rem Get Administrator Rights >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' NEQ '0' ( goto UACPrompt ) else (

  • Erlang中执行linux命令的两种方法

    os.cmd(Cmd) os模块提供了cmd函数可以执行linux系统shell命令(也可以执行windows命令).返回一个Cmd命令的标准输出字符串结果.例如在linux系统中执行os:cmd("date"). 返回linux的时间. 这种比较简单,一般情况下,也满足了大部分需求. erlang:open_port(PortName, PortSettings) 当os.cmd(Cmd) 满足不了你的需求的时候,就可以用强大的open_port(PortName, PortSett

  • Linux 添加开机启动方法(服务/脚本)

    系统启动时需要加载的配置文件 /etc/profile./root/.bash_profile /etc/bashrc./root/.bashrc /etc/profile.d/*.sh./etc/profile.d/lang.sh /etc/sysconfig/i18n./etc/rc.local(/etc/rc.d/rc.local) 一.修改开机启动文件:/etc/rc.local(或者/etc/rc.d/rc.local) # 1.编辑rc.local文件 [root@localhost

  • PowerShell中运行CMD命令的技巧总结(解决名称冲突和特殊字符等问题)

    引言 我从老旧的 CMD.EXE 命令行换到优秀的 POWSERSHELL.EXE 已经有一段时间啦.您可能知道新的 Windows PowerShell 可以运行任何旧命令.不过有些旧命令的名称或语法可能会产生问题.但这都不是事儿. 麻烦 1:名称冲突 PowerShell 的 cmdlet 别名和旧命令的名称有冲突是个常见的问题.比如说您喜欢的服务控制命令 SC.EXE.SC.EXE 非常灵活!我能理解您为什么喜欢它(不要为用 NET.EXE 管理服务找借口).如果您想查看 SMB Serv

  • 命令行启动mssqlserver服务的方法示例

    最近mssql服务老是开机启动不了,干脆也就不让他启动了,开完机了手动启动吧,由于每次都要用管理工具启动太麻烦,所以还是命令行方便些. 记录如下: 使用"SQLServer命令行"的方式来启动和关闭IIS.SQLServer. 一个批处理文件start.bat,是启动: 复制代码 代码如下: net start mssqlserver net start w3svc 一个是停止stop.bat: 复制代码 代码如下: net stop mssqlserver net stop iisa

随机推荐