我正在尝试使用 phpseclib 连接到 cisco SF308 交换机。我正在使用这个库成功连接到一些 HP 交换机,但由于某种原因,它无法与我的 cisco 一起使用。这是代码:
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib');
include('/var/www/phpseclib/Net/SSH2.php');
define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX); //add near include lines
$cisco = new Net_SSH2('10.10.10.10');
if (!$cisco->login('username', 'password')) {
exit('Login Failed');
}
echo $cisco->write('\n');
echo $cisco->write('help');
echo $cisco->read('/([0-9A-Z\-])*(#)(\s*)/i', NET_SSH2_READ_REGEX);
echo $cisco->data;
echo $cisco->getLog();
echo $cisco->disconnect();
它总是因登录失败错误消息而死。
我已经尝试在 NET_SSH2 库本身中添加一些调试语句,并且它以错误号 51 终止,它被定义为“NET_SSH2_MSG_USERAUTH_FAILURE”。
hp 交换机和这个 cisco 之间的不同之处在于,当手动连接时,hp 足够“智能”,可以从初始 ssh 命令中获取用户名。例如,如果您要在命令提示符下执行此操作:
ssh username@10.10.10.10
然后回车,它会选择“用户名”作为用户名,它只会提示你输入密码。使用 cisco 交换机(型号为 SF302-08),它仍然提示输入用户名和密码。一旦我第二次提供用户名,然后输入密码,我就可以连接到交换机。
我不确定这是否是导致问题的原因,但这两个开关之间明显不同。我正在尝试为 cisco 查找一些文档,以查看是否有任何方法可以更改/使其在初始连接请求中获取用户名。但如果您有任何其他建议,请告诉我!我全是耳朵。
谢谢。
编辑 1
我打开了复杂的日志记录并获得了失败的全部细节,以防万一这有帮助。这是我的最新代码:
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib');
include('Net/SSH2.php');
define('NET_SSH2_LOGGING', true); //turn on logging.
$ssh = new Net_SSH2('10.10.10.10'); //starting the ssh connection to localhost
if (!$ssh->login('username', 'password')) { //if you can't log on...
echo('Login Failed');
echo 'Error message is: <br>';
$log = $ssh->getLog(NET_SSH2_LOG_COMPLEX);
foreach ($log as $logitem) {
echo $logitem.'<br>';
}
这将返回以下输出:
Login FailedError message is:
<-
->
<- NET_SSH2_MSG_KEXINIT (0.0118s)
-> NET_SSH2_MSG_KEXINIT (0s)
-> NET_SSH2_MSG_KEXDH_INIT (0s)
<- NET_SSH2_MSG_KEXDH_REPLY (0.7912s)
-> NET_SSH2_MSG_NEWKEYS (0s)
<- NET_SSH2_MSG_NEWKEYS (0s)
-> NET_SSH2_MSG_SERVICE_REQUEST (0s)
<- NET_SSH2_MSG_SERVICE_ACCEPT (0.4927s)
-> NET_SSH2_MSG_USERAUTH_REQUEST (0s)
<- NET_SSH2_MSG_USERAUTH_FAILURE (0.0059s)
所以它正在联系交换机,但正如我在最初的帖子中提到的那样,它在尝试验证用户名/密码时失败了。