php ssh2执行shell_ssh secure shell怎么调用shell脚本 - CSDN
精华内容
参与话题
  • PHP ssh2实现远程执行操作

    千次阅读 2016-09-10 16:17:05
    本文主要介绍PHPssh2扩展的使用,实现远程ssh2连接、执行shell命令以及传送文件

    背景

    在Python中做远程SSH操作是很方便的,有很多的模块如paramiko、fabric,甚至是ansible、salt,但目前公司使用PHP来开发监控,实现基于logstash的日志监控,需要对客户端进行一些shell操作,初次实现时使用PHP调用python脚本的方法实现logstash的初始化和状态验证,但一直不太稳定,而且这种方式很蹩脚,让人很不爽,所以找时间研究了一下PHP中的ssh远程执行命令的方法,发现有类似paramiko的ssh2扩展可以使用。

    安装

    PHP扩展安装有三种主要方法:编译安装、pecl、composer
    分别对应python中的编译安装、easy_install、pip,但总体的体验来说,composer比pip还是差不少,必须吐槽一下
    具体安装方法参考:安装php ssh2扩展

    使用演示

    1. 新建ssh2连接

    $conn = ssh2_connect($ip,$port);   //初始化连接
    $pubkey = APP_PATH . 'public/shell/pub_key';   //这里的公钥对不是必须为当前用户的
    $prikey = APP_PATH . 'public/shell/pri_key';
    $res = ssh2_auth_pubkey_file($conn, $user, $pubkey, $prikey);   //基于rsa秘钥进行验证
                                                                                                          //如果使用密码需要使用另一个人函数ssh2_auth_password 

    2. 执行shell命令

    $stream = ssh2_exec($conn, 'service logstash status');  //执行结果以流的形式返回
    $dio_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);  //获得标准输入输出留
    $err_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);  //获得错误输出留
    stream_set_blocking($err_stream, true);
    stream_set_blocking($dio_stream, true);
    $result_err = stream_get_contents($err_stream); 
    $result_dio = stream_get_contents($dio_stream); //获取流的内容,即命令的返回内容
    fclose($stream);

    3. 远程传输文件

    $filename = 'logstash-' . $id . '.conf';
    $src = APP_PATH . 'public/logconfig/' . $filename;   //本地文件
    $dst = '/etc/logstash/conf.d/' . $filename;  //远程目录地址
    if (file_exists($src)) {
          $flag = ssh2_scp_send($conn, $src, $dst, 0644);  //默认权限为0644,返回为bool
          if ($flag) {
          ......
          }
    }

    4. 其它相关功能

    除了上述演示的几个核心功能外,ssh2扩展也可以实现sftp、交互式shell、tunnel等功能,详细请参考PHP在线手册

    展开全文
  • function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist"); if(!($con = ssh2_connect("10.3.2.0", "22"))) { echo "fail: unable to establish connection"; } else { if(!ssh2_auth_...
  • 这个功能主要用于在web端利用程序对远程服务器进行操作,通过PHP_ssh执行shell脚本来实现。 首先要安装php_ssh2组件,linux中centos7下有ssh2源,直接安装。window下则需要自行下载dll组件加载,具体方法自行搜索。 ...

    这个功能主要用于在web端利用程序对远程服务器进行操作,通过PHP_ssh执行shell脚本来实现。

    首先要安装php_ssh2组件,linux中centos7下有ssh2源,直接安装。window下则需要自行下载dll组件加载,具体方法自行搜索。

     

    安装完毕后就可以在PHP写执行shell脚本的程序了

    $ssh_user='root';        //登陆linux的ssh2用户名
    $ssh_pwd='********';      //登陆linux的密码
    $ssh_port='22';                          //端口号22
    $ssh_host='192.168.0.100';        //服务器IP地址
    
    //先测试拓展是否安装并开启
    if(!function_exists("ssh2_connect")){
            exit('SSH扩展没有安装或者没有安装成功');
        }
    
    //建立ssh2连接
    $ssh2 = ssh2_connect($ssh_host, $ssh_port);
        if(!$ssh2){
            exit('连接服务器失败');
        }else{
            echo '成功连接上了服务器';
        }
    
    //连接成功后进行密码验证,没验证无法进行其他操作。
    if(!ssh2_auth_password( $ssh2, $ssh_user,  $ssh_pwd )){
            return false;
        }

    成功连接,并且通过密码验证后就可以进行shell脚本的操作了,下面来一些简单的,例如建立一个文件夹。

    $e="mkdir -m 777 /var/www/html/test";   //shell脚本语句
    ssh2_exec($ssh2, $e);            //通过ssh2_exec执行语句

    转载于:https://www.cnblogs.com/suiyuewuxin/p/6858105.html

    展开全文
  • 最近公司有一个需求,需要调取同事开发的shell脚本,传入shell所需的值并唤起shell,获得shell执行的结果展示。 shell在测试服务器的宿主机上,PHP是放到docker容器内的,这就让人很无奈了,秉着办法总比困难多的...

    最近公司有一个需求,需要调取同事开发的shell脚本,传入shell所需的值并唤起shell,获得shell执行的结果展示。

    shell在测试服务器的宿主机上,PHP是放到docker容器内的,这就让人很无奈了,秉着办法总比困难多的思想,整理出了几个思路。

    1:在宿主机上部署PHP环境,这样PHP和shell不存在跨容器的情况,但是这样就破坏掉先有的docker结构,不推荐;

    2:如果mysql装在宿主机上的话,用mysql做触发器,把命令行当成一个字段存入,插入一条记录的时候,直接用触发器执行这条命令行,这种方法局限性很大,还得是mysql在宿主机上,不推荐;

    3:docker容器内做ssh登陆操作,直接登陆到宿主机,这样可以直接在宿主机上调取shell,暂时算最合适的处理方法。

    过程:首先要在docker内安装libssh2和ssh2 PHP扩展

    安装libssh2时报了一个错,少了几个依赖库,忘记截图了,大概apt-get install zlib-devel openssl-devel  libssh2-devel php-devel,

    提示少哪个自行安装一下: 

    cd tmp

    wget https://www.libssh2.org/download/libssh2-1.8.0.tar.gz

    tar zxvf libssh2-1.8.0.tar.gz

    cd libssh2-1.8.0

    ./configure

    make && make install

    libssh2安装成功之后接下来是ssh2,百度基本都是复制说一定要下载1.0版本,但是我试了一下,报错!现在必须要求是最新版本:

    cd tmp

    wget https://pecl.php.net/get/ssh2-1.2.tgz

    tar zxvf ssh2-1.2.tgz

    mv /tmp/ssh2-1.2.tgz /usr/src/php/ext/ssh2

    docker-php-ext-install ssh2

    ssh2安装完成,重启docker容器   docker restart 容器名

    打开phpinfo()可以看到ssh2安装成功

    接下来是PHP使用SSH2调用宿主机shell

    $host='127.0.0.1';   //服务器的ip

    $user='root';        //用户名

    $passwd='root';  //密码

    $shell_command = 'ls';

    $connection = ssh2_connect($host, 22);   // 链接远程服务器

    $auth_methods = ssh2_auth_none($connection, $user);   // 获取验证方式

    if (in_array('password', $auth_methods )){    // 通过password方式登录远程服务器

           if (ssh2_auth_password($connection, $user, $passwd)){

                $stream = ssh2_exec($connection,$shell_command);   // 执行shell

                stream_set_blocking($stream, true); // 获取执行pwd后的内容

                echo stream_get_contents($stream);

            }

    }

    $shell_command 这里还有一个坑,简单一点运行时间较短的shell或者.sh是可以正常唤起执行输出没问题,复杂一点并且执行时间长的没有返回结果的shell这里是唤不起来的,需要在$shell_command后跟一个输出文件,例:nohup sh /public/shell/xx.sh -configfile /public/11.txt -num 2 -con 2 -h a -ce b -t c -l d -k e -i f >/public/xx.log &,这样的话stream_set_blocking($stream, true);echo stream_get_contents($stream);这两行代码是没有意义的,注释即可!

    展开全文
  • I know I can use <code>ssh2_shell(), but by using it I would have to send the commands inside the PHP, and it's not what i want. I already gave the permissions needed to <code>index.php</code> and...
  • 登录成功之后可以输入shell命令,然后将执行结果返回 2.利用xampp快速搭建LAMP环境,之所以选用xampp,主要原因就是快!! [root@iZ2zefbgycwbez4hr3fg6rZ local]# ./xampp-linux-x64-5.6.3-0-installer.run 3....

    1.背景:最近做一个远程设备管理系统,要求输入远程设备的用户名和密码,登录到主机;登录成功之后可以输入shell命令,然后将执行结果返回

    2.利用xampp快速搭建LAMP环境,之所以选用xampp,主要原因就是快!!

    [root@iZ2zefbgycwbez4hr3fg6rZ local]# ./xampp-linux-x64-5.6.3-0-installer.run

    3.安装ssh2的依赖

    [root@iZ2zefbgycwbez4hr3fg6rZ local]# yum install libssh2 libssh2-devel gcc-c++ 

    4.安装ssh2

    首先下载ssh2

    [root@iZ2zefbgycwbez4hr3fg6rZ local]# wget http://pecl.php.net/get/ssh2-0.12.tgz

    解压

    [root@iZ2zefbgycwbez4hr3fg6rZ local]# tar -zxvf ssh2-0.12.tgz

    进入到ssh2目录

    [root@iZ2zefbgycwbez4hr3fg6rZ local]# cd ssh2-0.12

    执行phpize命令,提示要先安装autoconf

    于是yum安装autoconf

    [root@iZ2zefbgycwbez4hr3fg6rZ ssh2-0.12]# yum -y install autoconf

    再次执行phpize,这次没有报错

    [root@iZ2zefbgycwbez4hr3fg6rZ ssh2-0.12]# /opt/lampp/bin/phpize
    [root@iZ2zefbgycwbez4hr3fg6rZ ssh2-0.12]# ./configure --with-php-config=/opt/lampp/bin/php-config LIBS=-ldl
    [root@iZwz9ccvnq6egujzif4sftZ ssh2-0.12]# make
    [root@iZwz9ccvnq6egujzif4sftZ ssh2-0.12]# make install

    修改php.ini

    [root@iZwz9ccvnq6egujzif4sftZ ssh2-0.12]# vim /opt/lampp/etc/php.ini

    添加一行

    extension=ssh2.so

    5.测试
    首先删除原先网站根目录下所有文件,并新建一个test.php

    [root@iZ2zefbgycwbez4hr3fg6rZ ssh2-0.12]# cd /opt/lampp/htdocs/
    [root@iZ2zefbgycwbez4hr3fg6rZ htdocs]# rm -rf *
    [root@iZ2zefbgycwbez4hr3fg6rZ htdocs]# vim test.php

    test.php内容如下:

    <?php
        $user="要连接的主机用户名";
        $pass="要连接的主机密码";
        $connection=ssh2_connect('要连的主机IP',22);
        ssh2_auth_password($connection,$user,$pass);
        $cmd="cd /usr;ls;";
        $ret=ssh2_exec($connection,$cmd);
        stream_set_blocking($ret, true);
        echo (stream_get_contents($ret));

    $cmd="cd /usr;ls";这行代码表示切换到/usr目录下并执行ls命令

    分号将多条shell命令分隔开

    浏览器地址访问 ip/test.php

    发现将在远程主机上的shell命令已经执行成功! 

    如果你遇到什么问题或者对本篇文章有什么建议,,欢迎添加本人qq1822581649,,一同探讨技术问题!

    转载于:https://www.cnblogs.com/lwn007/p/8735499.html

    展开全文
  • <pre><code>$output = shell_exec('if [ $? -eq "0" ];then echo "All done" else echo "Not Work" fi'); echo $output; </code></pre> <p>But it is not working. Means <code>run.php</code> runs in linux ...
  • class SSH2 { /** * @var $host [远程主机ip或域名 host] */ protected $host; /** * @var $port [端口 port] */ pro...
  • SSH下常用Shell指令

    千次阅读 2008-07-16 09:19:00
    SSH是许多国外虚拟主机IDC提供的Linux Shell环境.本文给出常用的SSHShell指令.此文为本人原创,绝非从网上复制而来,我相信其精确性可完善性非网络上凌乱文章可比鉴于篇幅,只给出基本指令,常用参数.所有指令在Bash ...
  • ssh2的使用方式: $connect=ssh2_connect("192.168.1.2",22); ssh2_auth_password($connect,user,pass); $stream=ssh2_exec($connect, "ls /home"); stream_set_blocking($stream, true); $output = stream_get_conte
  • 在Ubuntu下PHP的使用ssh2扩展开发web

    千次阅读 2016-06-18 14:00:53
    php下使用shell去开发web管理Ubuntu系统其实并不难,按照一般步骤就可以了,不过要注意2个坑 1.ssh2扩展使用shell命令与用户权限有关 2.如果解决ssh扩展获取不了刷屏命令(如top)的信息和执行shell独占web资源
  • php登陆ssh执行命令

    2019-07-06 23:50:10
    $connection=ssh2_connect('172.16.10.3',22);ssh2_auth_password($connection,$user,$pass);$cmd="/data/script/start.sh knowledgelib_fix_2";$ssh2_exec($connection,$cmd); ?>前提是php要安装ssh.so扩展. .....
  • SSH Secure Shell Client 远程登录时,vim 显示语法高亮!  解决办法如下:  ① 编辑 /etc/profile  # vi /etc/profile  ……  export TERM=dtterm  保存,退出。  # source /etc/profil
  • /dev/null 2>&1 & echo $!'); </code></pre> <p>The script inserts one row in a MySQL database. I have tested the exact same command inside the quotes via SSH with putty and it worked ...
  • <p>I am able to SSH through a normal SSH client <p><img src="https://i.stack.imgur.com/C7ah2.png" alt="enter image description here"></p> <p>While I am able to execute simple commands like <pre>...
  • Ganymed_SSH2执行执行nohup命令失败 1 背景    问题:“” 因为最近一个SQL同事离职,导致有一堆哔了狗的杂事儿全交接到我的手中。这些事儿比较简单却比较麻烦,比如每天都需要写几个shell命令去检查linux机上定时...
  • andy@AndyMacBookPro:/usr/local/src$ php -v PHP 5.4.40 (cli) (built: May 3 2015 22:07:42) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies  wi
  • <p>Firstly, we wanna move the changes from one system to another system and for this, we have a shell script in <code>synchfolders.sh</code> file as follows <p><code>rsync -av --delete -e 'sshpass -...
  • cat ./file.txt | grep -v "^#" | ...上述代码,当file.txt中的内容超过了2行,那么问题就出现了,第二行的内容并不会读出来。 原因以及解释如下:(来自网络) 在while循环中ssh中断的问题 解决方案,ssh -n 其中-n 于
1 2 3 4 5 ... 20
收藏数 14,094
精华内容 5,637
关键字:

php ssh2执行shell