我正在尝试使用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进行死亡,错误编号为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)
所以它正在联系交换机,但正如我在初始帖子中提到的那样,它在尝试验证用户名/密码时失败了。
答案 0 :(得分:2)
经过一些研究,这是我们问题的解决方案。其他人可能以不同的方式解决了,但这似乎对我们有用。
我们注意到以下内容:
像phpseclib这样的流行ssh库在这个交换机上失败了。
php的ssh2_auth_none函数在此开关上返回TRUE。
这是什么意思?
似乎ssh协议有一个名为“none”的身份验证方法。这是不安全的,通常在大多数交换机上禁用。 ssh2_auth_none()函数尝试在没有任何身份验证的情况下进行连接,如果失败,则返回服务器接受的身份验证方法列表。对于SF300 ..它通过并且不返回任何用于认证方法的内容。
尽管他们无法为我们提供解决方案,但CISCO技术支持确实明确指出小型企业级交换机具有有限的CLI和简化的SSH版本,因此您无法将其视为企业级别具有完整的ssh实现的开关。
如果它有帮助,这里有一小段代码,展示如何连接到这些类型的设备:
<?php
$username = 'myusername';
$password = 'mypassword';
$connection = ssh2_connect('123.123.123.123', 22);
//$authentication_methods = ssh2_auth_none($connection, 'user');
$stdio_stream = ssh2_shell($connection);
fwrite($stdio_stream,$username."\n");
sleep(1);
fwrite($stdio_stream,$password."\n");
sleep(1);
echo "Results: " . stream_get_contents($stdio_stream);
echo 'sending show bonjour command:<br>';
fwrite($stdio_stream, "show bonjour".PHP_EOL); //you can use \n instead of PHP_EOL but PHP_EOL is recommended.
sleep(1);
echo "<br>Results: " . stream_get_contents($stdio_stream);
?>
希望这有助于任何试图以编程方式连接到这些类型设备的人。
答案 1 :(得分:1)
我不熟悉您正在使用的库,但我不得不使用Perl使用Cisco路由器编写一些内容。为此,我使用了Net :: Telnet :: Cisco模块,该模块处理与Cisco设备交互的一些特性。当我连接到Cisco Nexus设备,而不是常规的IOS设备时,这就破了。我必须通过改变模块用于识别指示telnet会话等待用户输入的字符串的正则表达式来修复它。我能够看到使用Wireshark从IOS设备和Nexus设备发送的确切字符串。我怀疑你需要类似的东西。
答案 2 :(得分:0)
我会检查您使用的IP地址是否正确,并检查用户名和密码是否有权连接