【发布时间】:2014-08-09 10:35:05
【问题描述】:
在我的 VPN 上,我有一个远程服务器和一个远程路由器(它使用 API 运行 RouterOS 并支持 ssh 连接)。我想要的是编写一个 php 脚本并将其部署在服务器上,这样它将使用 IP 地址和登录凭据连接到远程路由器,然后运行一些命令。
我在互联网上读到有一个解决方案是 libssh2.php 库,但我不知道如何安装/使用甚至测试它是否在服务器上工作。服务器正在运行 CentOS。
提前谢谢你!!!
【问题讨论】:
在我的 VPN 上,我有一个远程服务器和一个远程路由器(它使用 API 运行 RouterOS 并支持 ssh 连接)。我想要的是编写一个 php 脚本并将其部署在服务器上,这样它将使用 IP 地址和登录凭据连接到远程路由器,然后运行一些命令。
我在互联网上读到有一个解决方案是 libssh2.php 库,但我不知道如何安装/使用甚至测试它是否在服务器上工作。服务器正在运行 CentOS。
提前谢谢你!!!
【问题讨论】:
我认为您最好使用phpseclib, a pure PHP SSH implementation。它比 libssh2 有很多优点:
http://phpseclib.sourceforge.net/ssh/compare.html
这是一个例子:
<?php
include('Net/SSH2.php');
$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
exit('Login Failed');
}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>
【讨论】:
我之前这样做过,只是直接使用 SSH 命令。例如:
$sshCmd = "ssh user@1.2.3.45 \"ls -la ~\"";
exec($sshCmd, $output, $errorCode);
echo "Error code: $errorCode\n";
echo "Output: " . implode("\n", $output);
如果您有更复杂的脚本要运行,您可以将 then 放入 .sh 脚本中,然后通过 bash 运行:
$sshCmd = "ssh user@1.2.3.45 'bash -s' < \"/path/to/script.sh\"";
exec($sshCmd, $output, $errorCode);
echo "Error code: $errorCode\n";
echo "Output: " . implode("\n", $output);
【讨论】:
exec 可以选择返回命令输出和错误代码。我已经更新了我的示例以显示这一点。
ssh admin@192.168.252.34 "/system backup name=phpRemoteBackup"。首先,您可以在您的 shell 中尝试此操作,以仔细检查它是否确实有效。也尝试不使用die() 语句。相反,请按照我的答案中的示例代码检查 ssh 的输出和错误代码。