通过 php 利用 ssh2扩展操作 linux、mysql
1、首先安装扩展
这里是centos中的php安装ssh2扩展,记得关闭selinux和firewalld
yum install libssh2 libssh2-devel php-devel gcc-c++(make 需要)
下载ssh2扩展,从http://pecl.php.net/package/ssh2,有linux扩展包,也有windows的dll,如果是php5安装ssh2-0.13或0.12扩展,php7安装1.0
笔者 的php版本是5.6 安装的扩展是ssh2-0.13
wget https://pecl.php.net//get/ssh2-0.13.tgz
tar -zvxf ssh2-0.13.tgz
cd ssh2-0.13
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config LIBS=-ldl
make && make install
vi /etc/php.ini 或者 vi /usr/local/php/etc/php.ini
加入extension=ssh2.so
重新启动php-fpm 和 nginx
killall php-fpm
service php-fpm start
service nginx restart
查看phpinfo
2、利用php ssh2 代码执行程序
代码示例:
<?php
$connection = ssh2_connect('192.168.0.145', 22);
ssh2_auth_password($connection, 'username', 'password');
//执行linux 命令
$stream = ssh2_exec($connection, '/usr/local/bin/php -i');
stream_set_blocking( $stream, true );
echo (stream_get_contents($stream));
$stream = ssh2_exec($connection, 'ls');
stream_set_blocking( $stream, true );
echo (stream_get_contents($stream));
?>
实例:
$connection = ssh2_connect('192.168.1.176', 22);
ssh2_auth_password($connection, 'root', 'rootroot');
$stream = ssh2_exec($connection, 'service mysql status');
stream_set_blocking( $stream, true );
$res = stream_get_contents($stream);
$res = trim(substr($res,strpos($res,'L')+1,strpos($res,"g")-3));
$connection = ssh2_connect('192.168.1.176', 22);
ssh2_auth_password($connection, 'root', 'rootroot');
$status = $_GET['status'];
if($status==1){
$stream = ssh2_exec($connection, 'service mysql stop');
stream_set_blocking( $stream, true );
$res = stream_get_contents($stream);
echo $res;
}else{
$stream = ssh2_exec($connection, 'service mysql start');
stream_set_blocking( $stream, true );
$res=stream_get_contents($stream);
echo $res;
}
这里是密码类型登录,下面是另一种 秘钥类型登录
附录:linux ssh-keygen命令生成密钥:
其实,linux下的ssh-keygen下也可以生成密钥,在linux下输入ssh-keygen -t rsa,在提示下,输入密钥的名称(这里为key)和私钥加密密码,既完成密钥生成。生成的两个文件中,“key”为私钥,“key.pub”为公钥。如下图所示:
cd ~/.ssh/清空 authorized_keys 的内容
将私钥 内容放入 authorized_keys 中
cat /mm/key.pub >> authorized_keys
<?php
$connection = ssh2_connect('192.168.1.176', 22, array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection, 'root',
'/mm/key.pub',
'/mm/key')) {
echo "Public Key Authentication Successful";
} else {
die('Public Key Authentication Failed');
}
?>
原理上是成功的 ,但是笔者测试了很多次都失败了 后来笔者又转战方法 使用xshell 来生成秘钥
ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法。
使用密钥登录分为3步:
1、生成密钥(公钥与私钥);
2、放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中;
3、配置ssh客户端使用密钥登录。
一、生成密钥公钥(Public key)与私钥(Private Key)
打开Xshell,在菜单栏点击“tools”,在弹出的菜单中选择“User Key Generation Wizard...”(密钥生成向导),如下图:
弹出“User Key Generation Wizard”对话框,在“Key Type”项选择“RSA”公钥加密算法,“Key Length”选择为“2048”位密钥长度,如下图:
点击“Next”,等待密钥生成:
继续下一步,在“Key Name”中输入Key的文件名称,我这里为“key”;在“Passphrase”处输入一个密码用于加密私钥,并再次输入密码确认,如下图: 这里密码可以不输入
点击“Next”,密钥生成完毕(Public key Format选择SSH2-OpenSSH格式),这里显示的是公钥,我们可以复制公钥然后再保存,也可以直接保存公钥到文件,如下图。这里点击Save as a file 保存的就是公钥匙
点击“Save as file...”按钮,将公钥(Public key)保存到磁盘,文件名为“key.pub”,备用。
保存私钥
这里保存的才是私钥 将公私钥匙上传到 /usr/local/nginx/html/sshtest/
二、上传公钥(Public Key)到服务器:
使用到Xshell登录到服务器,进入到“/root/.ssh/”目录,运行rz命令(如果没有rz命令,运行yum install lrzsz安装),将key.pub发送到服务器,然后运行如下命令,将公钥(Public Key)导入到“authorized_keys”文件:
这里可以直接使用上面的方法 不使用 rz (简单粗暴)
- [root@localhost ~]# cd /root/.ssh/
- [root@localhost .ssh]# rz
- rz waiting to receive.
- [root@localhost .ssh]# cat me.pub >> authorized_keys
- [root@localhost .ssh]# chmod 600 authorized_keys
- [root@localhost .ssh]# ls
- authorized_keys known_hosts me.pub
- [root@localhost .ssh]# cat authorized_keys
- ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4VCOWFrARc1m3MfEAL50v2Z2siavO3Ijpr/LZ00EZah8EjfZhqjAc/agkljyXmNGpVDpRdtlYco8h3P5vegXOEgKcX74fDYm0vNdVABVD1XSD8ElNyLTCCNk7rZJbi3htJox3Q1n0vnMmB5d20d9occkAx4Ac94RWNS33EC5CszNTMgAIn+uZl0FlQklS1oSyWFahSTWyA6b33qG7Y5E4b6J/caObnPx6EgtBrgi97gXJHZWyYlGrpWmUuhPqs5XToRB08CVxAyzewtq1MXv0p+Po4L1pbHLRf+TSoZ5RSBZZjY4/JMAzdXHNtnAyO0j0VNGbBXKUcNSAHZ
这时
<?php
$connection = ssh2_connect('192.168.1.176', 22, array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection, 'root',
'/usr/local/nginx/html/sshtest/id_rsa_1024.pub',
'/usr/local/nginx/html/sshtest/id_rsa_1024')) { //这里没有使用密码 如果使用密码 '/usr/local/nginx/html/sshtest/id_rsa_1024','密码')) {
echo "Public Key Authentication Successful";
} else {
die('Public Key Authentication Failed');
}
?>
相关链接:相关链接
php中的ssh2模块学习 中有更详细的介绍。
不同服务器之间的ssh2文件的上传和下载