【PHP小课堂】一起学习PHP中SSH相关扩展的使用

一起学习PHP中SSH相关扩展的使用

对于 PHP 来说,很少有用它来做运维相关管理系统的,不过,这并不代表我们 PHP 就不能远程管理服务器了。其实,也是有直接进行远程操作相关的扩展工具供我们使用的,就像我们今天要学习的这个 SSH 扩展。扩展的安装就是正常的 PHP 安装,使用的是 ssh2 这个扩展包,具体的安装过程就不详细说了,直接来看如何使用吧。

连接远程 SSH 服务器

连接过程非常简单,建立连接,然后登录就可以了。

$conn = ssh2_connect('192.168.56.106');
var_dump(ssh2_auth_password($conn, 'root', '123456')); // bool(true)

使用 ssh2_connect() 就可以建立连接并且获得连接句柄。这里我们是本地建立的一台虚拟机,所以直接就使用 root 而且密码也非常简单,大家操作线上服务器时可不能这么任性。而且如果真的需要操作线上真实环境的主机的话,更建议使用密钥的方式来连接,而不是像我们这样直接用户名密码的方式。关于密钥方式也有很多函数可以供大家使用,大家可以自行了解一下。

执行远程命令

连接服务器成功后,最主要的就是能够执行各种操作命令,这个也是我们要使用 ssh2 这个扩展的核心。当然,目的也是为了要进行远程服务器的操控管理。我们有两种执行命令的方式。

单条语句执行

$stream = ssh2_exec($conn, "ls -l /");$dio_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
$err_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);stream_set_blocking($dio_stream, true);
stream_set_blocking($err_stream, true);echo stream_get_contents($dio_stream);
echo  stream_get_contents($err_stream);// total 152
// drwxrwx---    1 root vboxsf 131072 Dec 31  1979 adata_hd330
// lrwxrwxrwx.   1 root root        7 May 10  2019 bin -> usr/bin
// dr-xr-xr-x.   6 root root     4096 Jan 29 01:54 boot
// drwxr-xr-x   20 root root     3080 Mar  4 19:42 dev
// drwxr-xr-x. 103 root root     8192 Mar  4 19:42 etc
// drwxr-xr-x.   3 root root       23 Mar  4 20:33 home
// lrwxrwxrwx.   1 root root        7 May 10  2019 lib -> usr/lib
// lrwxrwxrwx.   1 root root        9 May 10  2019 lib64 -> usr/lib64
// drwxr-xr-x.   3 root root       19 Jan 29 01:40 media
// drwxr-xr-x.   2 root root        6 May 10  2019 mnt
// drwxr-xr-x.   3 root root       39 Jan 29 02:07 opt
// dr-xr-xr-x  118 root root        0 Mar  4 19:42 proc
// dr-xr-x---.  15 root root     4096 Feb 25 04:58 root
// drwxr-xr-x   32 root root      940 Mar  4 19:43 run
// lrwxrwxrwx.   1 root root        8 May 10  2019 sbin -> usr/sbin
// drwxr-xr-x.   2 root root        6 May 10  2019 srv
// dr-xr-xr-x   13 root root        0 Mar  4 19:41 sys
// drwxrwxrwt.   5 root root      118 Mar  4 20:36 tmp
// drwxr-xr-x.  12 root root      144 Mar 16  2020 usr
// drwxr-xr-x.  21 root root     4096 Mar 16  2020 varfclose($stream);

对于单独的一条语句来说,我们可以使用 ssh2_exec() 这个函数来直接执行这条命令。它返回的结果是一个流,所以我们需要通过流的方式来读取返回的内容。在这里,我们就是简单地查看一下根目录下的内容。这块的操作非常简单,不过需要注意的是,如果返回的内容非常多的话,就不要使用 stream_get_contents() 了,它的返回大小是有限制的,我们可以使用 fgets() 这类的文件流相关函数来遍历读取。具体内容大家可以查阅官方文档,其中有不少 Notes 都会讲到这个问题。

多条语句批量执行

有时候,我们想一次执行多条命令,这时就可以使用另外一种方式来进行操作。

$shell = ssh2_shell($conn, 'xterm');
fwrite($shell, "mkdir /home/shelltest/;".PHP_EOL);
fwrite($shell, "cd /home;".PHP_EOL);
fwrite($shell, "ls -l /home;". PHP_EOL);
sleep(1);echo stream_get_contents($shell);
// Activate the web console with: systemctl enable --now cockpit.socket// Last login: Thu Mar  4 20:36:36 2021 from 192.168.56.102
// mkdir /home/shelltest/;
// cd /home;
// ls -l /home;
// [root@localhost ~]# mkdir /home/shelltest/;
// [root@localhost ~]# cd /home;
// [root@localhost home]# ls -l /home;
// total 0
// drwxr-xr-x 2 root root 20 Mar  4 20:36 shelltestfclose($shell);

使用 ssh2_shell() 可以看作是打开了一个可以写入的流句柄,然后我们使用 fwrite() 向这个流中写入命令。在这里为什么要 sleep() 一下呢?其实这个流的写入操作并不是同步的,所以如果不加一个暂停的话,可能 PHP 就直接执行过去了,而命令并没有正常地发送完成就中断了。这个是需要注意的地方。同样,我们可以使用 stream_get_contents() 或者其它读取流的方式来获得执行的结果。

在这段代码中,我们建立了一个目录,然后进入它的上级 home 目录中,最后返回目录里面的内容信息。从打印的结果还能够看出,它会输出整个登录后的信息,就像我们真的打开了一个 ssh shell 工具一样。

文件传输

除了命令的操控之外,SSH 中另外一个非常重要的能力就是可以实现 sftp 以及 scp 之类的文件传输的功能,这些功能在 ssh2 扩展中也是支持的。

sftp 上传下载

$sftp = ssh2_sftp($conn);
ssh2_sftp_mkdir($sftp, '/tmp/test/');
copy('./1.txt', "ssh2.sftp://{$sftp}/tmp/test/11.txt");$stream = ssh2_exec($conn, "ls -l /tmp/test/");$dio_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
$err_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);stream_set_blocking($dio_stream, true);
stream_set_blocking($err_stream, true);echo stream_get_contents($dio_stream);
echo  stream_get_contents($err_stream);// total 1
// -rw-r--r-- 1 root root 73 Mar  4 20:37 11.txtfclose($stream);echo file_get_contents("ssh2.sftp://{$sftp}/tmp/test/11.txt"); // 123123123123123123123123123123123123123123123123123123123123123123123123

首先,我们使用 ssh2_sftp() 函数获取一个 sftp 句柄。然后通过 ssh2_sftp_mkdir() 创建了一个目录。接着,通过普通的 PHP 函数配合 ssh2.sftp 这个伪协议,就可以像操作本地文件一样来操作远程的文件了。是不是非常高大上。

中间的一段代码是通过 ssh2_exec() 去查看我们上传的文件,可以看到文件和目录都是正常存在的。最后,我们通过 file_get_contents() 并且配合伪协议来读取文件的内容,其实这就相当于从远程服务器下载文件了。

之前的文章中我们已经简单地学习过一些伪协议相关的内容,所以这里也就不多解释了,但是不得不说,这种形式的操作真的非常方便和直观。不管是 copy() 还是 file_get_contents() 真的就和我们操作本地文件一样的感觉。

当然,除了上面介绍的 ssh2_sftp() 和 ssh2_sftp_mkdir() 之外,扩展中还有 ssh2_sftp_chmod()、ssh2_sftp_rename()、ssh2_sftp_unlink() 等等的函数,相信从名字大家也能看出它们的作用,这里就不多做解释了,大家可以查阅文档获取相关的资料。

scp 传输文件

最后,我们再来看看更为简单的 scp 方式的文件传输。

ssh2_scp_send($conn, './1.txt', '/home/shelltest/22.txt'); // /home/shelltest/22.txt
ssh2_scp_recv($conn, '/home/shelltest/22.txt', './222.txt'); // ./222.txt

虽说 scp 现在用得不多了(没 rsync 快),不过它的使用可真是方便。ssh2_scp_send() 用于发送一个本地文件到远程服务器,ssh2_scp_recv() 用于从远程服务器拉取一个文件,是不是有点简单的过头了。就跟我们平常使用的 copy() 之类的函数一样的感觉。

总结

今天我们简单的了解了一下 ssh2 这个扩展的一些简单操作,核心的东西也就是这些了。在官方文档中还有很多其它的函数不过都是和密钥登录相关的内容,在这里也就不多赘述了,有需要的小伙伴自己查阅一下就可以,而且他们的使用都并不复杂。剩下的就是 sftp 和 scp 相关的内容了。总体来说,这个扩展还是比较方便好用的,如果只是简单的小型的运维管理功能,是完全可以满足的,当然,具体业务具体分析,使用什么还是大家自己定夺。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/03/source/3.%E4%B8%80%E8%B5%B7%E5%AD%A6%E4%B9%A0PHP%E4%B8%ADSSH%E7%9B%B8%E5%85%B3%E6%89%A9%E5%B1%95%E7%9A%84%E4%BD%BF%E7%94%A8.php

参考文档:

https://www.php.net/manual/zh/book.ssh2.php

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性代数|机器学习-P2 A的列向量空间

文章目录 1. Ax矩阵的形式2. ACR 矩阵分解2.1 rank1 矩阵分解2.2 rank2 矩阵分解2.3 ACMR,求M 3. Ax 向量 1. Ax矩阵的形式 假设我们有如下矩阵A: A x [ 2 1 3 3 1 4 5 7 12 ] [ x 1 x 2 x 3 ] \begin{equation} Ax\begin{bmatrix} 2&1&3\\\\ 3&1&am…

【微信小程序开发】小程序中的上滑加载更多,下拉刷新是如何实现的?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

期望20K,2年golang深圳某互联网小公司一面

后续约了二面(CTO面),需要到现场,基本没问啥具体的技术知识,都是聊规划和个人职业目标 一面 1、假设访问百度网站,从在浏览器输入网址,到最终页面展示出来,中间会发生哪些事情&…

使用Python和wxPython将PNG文件转换为JPEG文件

简介: 在图像处理中,有时候我们需要将PNG格式的图像文件转换为JPEG格式。本篇博客将介绍如何使用Python编程语言和wxPython图形用户界面库,以及Pillow图像处理库来实现这一转换过程。通过本文的指导,您将学习如何快速将指定文件夹…

30分钟快速上手scapy

在前两篇博客中,笔者简单分享了如何使用scapy进行网络流量的分析,但比较粗略,没有详细说明,本文我们就0开始,一起快速学习一下scapy 框架的使用。 另附之前的两篇博客,有需要快速参考代码的请自取&#xf…

外贸如何找国外客户?

外贸客户开发国外客户可以使用多种软件来完成,以下是一些常用的软件推荐: 即时通讯软件: SKYPE:一款功能丰富的即时通讯软件,支持视频聊天、多人语音会议、文件传输等,方便与海外客户进行实时沟通。Line&a…

工具MyBatis Generator(MBG)

MyBatis Generator(MBG),这是官方帮我们提供的一个自动生成代码的工具,前面的课程中,我们都是脑袋里想好,pojo有哪些属性,属性的类型是什么,对应的数据表中的字段名字是什么,匹配的类型是什么..…

用增之Firebase

目录 简介 开发准备: 1、在Firebase平台创建项目 2、将项目关联到应用 3、项目配置 简介 前面讲了google ddl部分,本篇为Firebase的事件上报部分,包括在FireBase平台创建应用 , 如果有用到ddl…

【网络安全的神秘世界】JavaScript

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 01-JavaScript简介 JavaScript背景 2003年之前,JavaScript被称为“牛皮藓”,用来制作页面上的广告、弹窗、漂浮的广告 2004年&a…

小猪APP分发:让APP封装变得如此简单

你是否曾经在开发完一款APP后,为了封装、分发而头疼不已?别担心,小猪APP分发来拯救你了!这款神器不仅能让你的工作变得更加高效,还能让你的APP在各大平台上顺利分发。 小猪APP封装www.ppzhu.net APP封装的挑战 开发一…

2024-06-04 架构-不同层次的抽象的处理-分析

摘要: 2024-06-04 架构-不同层次的抽象的处理-分析. 不同层次的抽象: 将事情做不同的情况的解耦,关于在于理解事情本身的性质,如何解耦,如何处理当将事情解耦成不同的情况后,就可以针对不同的事情,最不同的处理。这么…

docker 停止重启容器命令start/stop/restart详解(容器生命周期管理教程-2)

Docker 提供了多个命令来管理容器的生命周期, 其中start、stop 和 restart。这些命令允许用户控制容器的运行状态。 1. docker start 命令格式: docker start [OPTIONS] CONTAINER [CONTAINER...]功能: 启动一个或多个已经停止的 Docker …

i.MX8MP平台开发分享(CSU控制器篇)

芯片使用 CSU(Central Security Unit) 来管理所有不直接支持安全(如 CPU 内核)的主/从设备的安全。 ATF中的CSU配置如下,OCARM和OCRAM_S被配置为了安全等级2,非锁定状态。 static const struct imx_csu_c…

WLAN工作原理

目录 一、引言二、FAT AP的工作模式与挑战三、FIT APAC的组网方式四、CAPWAPI隧道技术五、WLAN网络的关键报文六、漫游机制七、总结 一、引言 随着无线网络的迅猛发展,WLAN(无线局域网)技术已广泛应用于各个领域,为企业和个人提供…

若依 ruoyi-vue element-ui el-cascader 级联选择器 选择任意一级选项,去掉单选按钮,选中点击后隐藏

Cascader 级联选择器 选择任意一级选项&#xff0c;去掉单选按钮。 这兄弟文章写的可以&#xff0c;查了一堆文章&#xff0c;基本搞完才发现。 官方的例子不支持选中后自动关闭&#xff0c;要点击旁边空白&#xff0c;并且单选框太小了。 <el-form-item label"所属地…

基于SSM+Jsp的二手手机回收平台系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

libsystemctlm-soc项目分析

概述 libsystemctlm-soc项目是Xilinx的SystemC库。 环境安装 verilator安装 # Prerequisites: #sudo apt-get install git help2man perl python3 make autoconf g flex bison ccache #sudo apt-get install libgoogle-perftools-dev numactl perl-doc #sudo apt-get insta…

java 使用WebClient发送https请求

核心逻辑 绕过ssl证书检查 具体操作 话不多说上代码 // 构建WebClient public static WebClient createWebClient() throws SSLException {SslContext context SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();HttpClient htt…

JavaScript 从入门到精通Object(对象)

文章目录 对象文本和属性方括号计算属性 属性值简写属性名称限制属性存在性测试&#xff0c;“in” 操作符“for…in” 循环像对象一样排序 总结✅任务你好&#xff0c;对象检查空对象对象属性求和将数值属性值都乘以 2 对象引用和复制通过引用来比较克隆与合并&#xff0c;Obj…

Keil编译bin格式固件方法

打开Option选项卡&#xff0c;选择User&#xff0c;在After Build/Rebuild下面增加以下命令&#xff1a; fromelf.exe --bin -o "L.bin" "#L"