我在尝试使用 phpseclib2 或 phpseclib3 库或本机使用 Secure Shell2 (libssh2) 模拟类似于命令“ssh -J [email protected] [email protected]”的跳转时遇到问题。
我可以成功连接到堡垒,但是当我尝试使用“exec”执行 SSH 命令时,这是不允许的,给我一个“权限被拒绝(公钥)”错误。这似乎是因为它不是像直接 bash 命令“ssh -J”那样真正的跳转。
使用 phpseclib3 在 PHP 中实现
<?php
require __DIR__ . '/../vendor/autoload.php';
use phpseclib\Crypt\RSA;
use phpseclib\Net\SSH2;
// Connection parameters
$bastionHost = 'bastion.net';
$bastionPort = 22;
$bastionUser = 'identifier';
$bastionPass = '';
$address = 'xx.xx.xx.xx';
$user = 'identifier';
$port = 22;
$privateKeyPath = 'ssh_key';
$rsa = new RSA();
$rsa->loadKey(file_get_contents($privateKeyPath));
$ssh = new SSH2($bastionHost, $bastionPort);
if (!$ssh->login($bastionUser, $rsa)) {
throw new \Exception('Login failed');
}
echo $ssh->exec("ssh $user@$address"); // Permission denied (publickey)
我正在寻找一种解决方案来真正模拟跳跃的行为。任何建议将不胜感激。谢谢!
隧道不仅仅是“在远程启动另一个 ssh 命令”,它是协议的一部分,并且目前尚未在 phpseclib 中实现。
https://github.com/phpseclib/phpseclib/issues/1096
替代方案是将现有代码与 SSH 代理和代理转发一起使用。