我正在使用该ssh2_connect()
方法与远程服务器建立连接.如果我提供正确的主机名和端口号,则连接正确建立.由于错误的凭据无法连接,我试图调用回调函数,但我尝试它的方式是在连接失败后不调用回调.
这是我试过的代码:
$callbacks = array(
'ignore' => array($this, 'callbackSshDisconnect'),
'debug' => array($this, 'callbackSshDisconnect'),
'macerror' => array($this, 'callbackSshDisconnect'),
'disconnect' => array($this, 'callbackSshDisconnect'),
);
ssh2_connect($hostName,$port,array('hostkey', 'ssh-rsa'),$callbacks);
public function callbackSshDisconnect($reason, $message, $language) {
$this->log('disconnected');
$this->log($reason);die;
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
当ssh2_connect因主机,端口等错误而失败时,它不会调用任何回调.
相反,什么是返回false
PHP文档说:
成功时返回资源,错误时返回FALSE.
$result = ssh2_connect($hostName,$port,array('hostkey' => 'ssh-rsa'),$callbacks);
if ($result === false)
exit("ssh2_connect failed");
Run Code Online (Sandbox Code Playgroud)
另外,阅读文档,你的
array('hostkey', 'ssh-rsa')
Run Code Online (Sandbox Code Playgroud)
应该
array('hostkey' => 'ssh-rsa')
Run Code Online (Sandbox Code Playgroud)
除了拼写错误之外,您没有做错任何事情: array('hostkey', 'ssh-rsa')
should be array('hostkey' => 'ssh-rsa')
。ssh_connect()
对于连接失败,该函数仅返回 false;当使用错误的凭据时,回调还没有启动。
有一些解决方案(例如下面 rubo77 所建议的),但我发现的解决方案会给你最大的控制权,并允许你做你想做的事情(例如跟踪 MAC 错误),那就是使用 phpseclib 库(http://phpseclib.php )。 sourceforge.net/ssh/intro.html)用于 ssh 连接和控制。它提供了对命令的非常精细的控制,并且还包括日志记录。
这不是最简单的解决方案,但您可以像直接在键盘/终端上一样进行精细控制。
您可以控制超时并可以对命令使用回调。但如果您想要更好的控制,请使用read()
和write()
并可以监控断开连接或其他问题。检查有关使用 phpseclib 进行日志记录的文档:您可以记录并解析日志,或者调用getLastError()
.
'Connection closed by server'
例如,日志文件将在断开连接时显示,但也会告诉您是否在登录时使用不受支持的身份验证模式等。
或者了解更多信息,请阅读代码:例如,这里是断开连接的原因:
$this->disconnect_reasons = array(
1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT',
2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR',
3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED',
4 => 'NET_SSH2_DISCONNECT_RESERVED',
5 => 'NET_SSH2_DISCONNECT_MAC_ERROR',
6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR',
7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE',
8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED',
9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE',
10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST',
11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION',
12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS',
13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER',
14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE',
15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME'
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1785 次 |
最近记录: |