楚狐在线 - 资讯杂烩
资讯杂烩   在线工具   益智游戏   影音娱乐   网站导航

通过PHP的SSH2扩展模块执行Linux命令-通过密钥登录


  前面我写了一个篇关于《通过PHP的SSH2扩展模块执行Linux命令-通过密码登录》的文章,主要介绍如何实现PHP通过SSH协议实现远程服务器的命令执行,登录远程服务器采用的是密码登录,密钥登录安全性相对更高,今天就如何改造成密钥登录进行优化,具体如下:
  一、SSH2扩展通过密钥登录需要用到私钥和公钥两个文件,分别命名为privatekey、publickey,放在非web目录下,如:/usr/local/nginx/ssh-key/目录下,且对ssh-key和两个密钥文件的权限有严格要求,具体设置如下,否则可能就是密钥文件无法访问或无权限使用:

chmod 0700 -R /usr/local/nginx/ssh-key
chmod 0600 -R /usr/local/nginx/ssh-key/*

  二、私钥和公钥的格式也需要注意,我采用PuTTYgen生成的公钥和私钥文件,默认的在SSH2扩展使用是有问题的,其中:
  1、私钥格式应为-----BEGIN RSA PRIVATE KEY-----开始,以-----END RSA PRIVATE KEY-----结束,可以在PuTTYgen的顶部菜单【Conversions】选择【Export OpenSSH key】将私钥存为privatekey即可,如下示例:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAv9Q8OGOXRnHUk9l9gxB2agipHOqNq2+kmxh5WddwA1vw4cRc
2qUqgxzGioJR/X62FqQ/E4IAQq2Dz0s7VNhzyH9uodSkmsQ/4iyFIC7q6dmPCSds
zCzEgXwGrxQ4RI6MlhYpGIxxALeDdwOEqaMN8df1QmSKgYeaozkPbXPxbA4U1Dbq
KJDdmnia1LYPJmSBN2n1nOtKFD9FbAZ0xBRRhOvxjKgqV/0MY6m3CesFhZftWJWQ
fCSqFapkgmlRy4jlCVukDOdggoWCEFmvoyyRBn+h+RrdxUq6xWIGobKi7isPYkax
d7A6xIrnWa+/9vE6gu1esEq4JShaLPHUBsT5jQIDAQABAoIBAQCIU51keap1Xsoz
NJqVPWraGkONEEgUMOhrbK45Ifkx+fIrkHBo1n5q5VVX9BuuqpFfb+R/yaDDwipt
dEq7FoTaVW3bRpKghp3b78XARHegL4QOfl08kQgp+WmKnTULy76vnxofnxdj6gdc
2jw6jm2HlPFw+KDSQvuryg5ju8U0A2Z7HMYogPUGuHUauf2qvcqkfKYr7WX3+S8j
yyYLYMT67takRB1Qmp7Q8Sf13BAQGNuE0posz9L6nBZ8ndeZTqysEsYjQ6XoT7T9
sh5SAYzRjDj2obiMqNsQYziiKJbZ5kdX2p0l9EdC3UMIuVIf0Hr/90MGLC126qs2
R2nb/D+FAoGBAOkR9q3Xm3YtmqomGLj2Yokb9NV33InGwwMGdsQvw0x6UwUeuglw
/B1W2QldQ3tqQkP6U7NgAaa5FEVGxRJSynRd9UCAba/daBM14G53i5m6k52MSFaA
Jj8FvqThbEjICIG97q2P/j32fQLnHxWr5IFZ61PkPS/qm/LPHWa9zoDLAoGBANKz
lbdCu6Y1S2jeJ0T6u6UK3hEbzzISqpgl3bro77DlnioAMZWBw4ZC8H+NmVp5Hzy8
pfBOlAiWIm+4UpiYxURTN4vjLbG+l+plcmOr3PNM0VFjVk5mrhQ+EUBhMeeyq0cV
IIAfgo6Tu8DJRq7ZWd4qbh1YbVls5rjDv4dFM9wHAoGBANocwIAxnL/8r5f5rPsz
QEVVj0tSL2YURx2GqBCzLg5dD2JkPe9l99oxE01LJULSzw60ri3Yc9Mlsw2dzAF4
zxQVddWWGpARIDuSGOToJRGJZGl1BaFFrgUeiCne96oo4KUiLMHqViCAkr7rsdBj
G6Xdk3ffyU8VPDn/j2E90Yn/AoGAW49cjPF718MrDNwU1n3akuLBE1AxXoIMDefO
jc1xcz6k132UDnMAQ1TNa7Bdppohv+P+fAm5fG25czD2+4bPmlxLNAe5sJaxL1N8
POHPNw73mtV/CLzIAtXh60cRR601jsMYh3Sp6Ek8eo88nvime8uWZDwr8INJU5sE
nMSuv3sCgYBFVMGyZNuYEStyzW2u6lOTuRBdCiIe1NUx64tEGXLetUC1HhJb+xG4
wpagLcW7jWtdKIVAOXmbNiry0FutRdCxH3Z7uVR3jnunzUzMyeA73Y7K6eghQdcD
Ea2p3LY8maHwXXh+sUN35fUWY+cZHWEYYpo2CxLGHm0X3OkRPAZFeA==
-----END RSA PRIVATE KEY-----

  2、公钥的格式默认导出的也不支持,需要改成一段文本,格式类似如下:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/1Dw4Y5dGcdST2X2DEHZqCKkc6o2rb6SbGHlZ13ADW/DhxFzapSqDHMaKglH9frYWpD8TggBCrYPPSztU2HPIf26h1KSaxD/iLIUgLurp2Y8JJ2zMLMSBfAavFDhEjoyWFikYjHEAt4N3A4Spow3x1/VCZIqBh5qjOQ9tc/FsDhTUNuookN2aeJrUtg8mZIE3afWc60oUP0VsBnTEFFGE6/GMqCpX/QxjqbcJ6wWFl+1YlZB8JKoVqmSCaVHLiOUJW6QM52CChYIQWa+jLJEGf6H5Gt3FSrrFYgahsqLuKw9iRrF3sDrEiudZr7/28TqC7V6wSrglKFos8dQGxPmN rsa-key-20260601

  三、PHP代码调用示例如下:

<?php
// 配置信息
$host = '192.168.1.100';
$port = 22;
$username = 'root';
// 如果你的私钥有密码保护,请输入密码;如果没有,保持空字符串 '' 即可
$passphrase = ''; 

$private_key = '/usr/local/nginx/ssh-key/private_key'; // 加了分号
$public_key  = '/usr/local/nginx/ssh-key/publickey';  // 加了分号,并规范了变量名

// 1. 建立连接
$connection = ssh2_connect($host, $port);

if (!$connection) {
    die("错误:无法连接到服务器 $host \n");
}

// 2. 身份验证 (已改为使用公钥/私钥对登录)
if (!ssh2_auth_pubkey_file($connection, $username, $public_key, $private_key, $passphrase)) {
    die("错误:密钥身份验证失败 \n");
}

echo "成功通过密钥连接到 $host \n";

// 3. 执行命令
$command = 'ls -la /var/www/html && uptime';
$stream = ssh2_exec($connection, $command);

if (!$stream) {
    die("错误:命令执行失败 \n");
}

// 4. 获取执行结果
stream_set_blocking($stream, true);
$output = stream_get_contents($stream);

// 5. 关闭流
fclose($stream);

// 输出结果
echo "执行结果如下:\n";
echo "--------------------------\n";
echo $output;
echo "--------------------------\n";
?>
返回首页    发布日期:2026年06月01日

Copyright © 2026   楚狐在线   All Rights ReservedLA.   反馈留言