我正在尝试通过PHP中的ssh与imap进行通信。 以下代码演示了如何通过ssh连接到imap:
$ssh_conn = ssh2_connect($sshIP, $sshPORT);
ssh2_auth_password($ssh_conn, $sshUSERNAME, $sshPASSWORD);
$stream = ssh2_tunnel($c, $imapSERVER, $imapPORT);
似乎一切正常,我通过ssh连接到imap。没有错误,我在$ stream中有资源。
然后我尝试将LOGIN命令写入流,像这样:
fwrite($stream, "A1 LOGIN username password\r\n");
问题是服务器没有任何响应。
我试图得到这样的答复:
while (true) {
echo fread($stream, 4096);
}
不用担心用于向imap服务器写入和读取数据的代码,这只是我举例编写的。这在这里并不重要。问题是我没有从imap得到任何回应。始终为空字符串。
我敢肯定,由于我使用大的HORDE库https://dev.horde.org/imap_client/,并且在使用SOCKS5或HTTPS流时,编写和读取方法也能正常工作!
我还尝试了其他SSH服务器-失败了。
那么,哪里可能有问题? 另外,以下信息可能会有用: 将stream_get_meta_data()用于ssh和socks5流时,我得到了不同的信息。
SSH:
array(8) {
["exit_status"]=>
int(0)
["timed_out"]=>
bool(false)
["blocked"]=>
bool(true)
["eof"]=>
bool(false)
["stream_type"]=>
string(12) "SSH2 Channel"
["mode"]=>
string(2) "r+"
["unread_bytes"]=>
int(0)
["seekable"]=>
bool(false)
}
SOCKS5:
array(8) {
["crypto"]=>
array(4) {
["protocol"]=>
string(7) "TLSv1.2"
["cipher_name"]=>
string(27) "ECDHE-RSA-AES128-GCM-SHA256"
["cipher_bits"]=>
int(128)
["cipher_version"]=>
string(7) "TLSv1.2"
}
["timed_out"]=>
bool(false)
["blocked"]=>
bool(true)
["eof"]=>
bool(false)
["stream_type"]=>
string(14) "tcp_socket/ssl"
["mode"]=>
string(2) "r+"
["unread_bytes"]=>
int(0)
["seekable"]=>
bool(false)
}
我还通知了重要的事情,如果我将端口143用于imap服务器,则它可以正常工作。如果我使用端口993,则不起作用。但是143不是ssl。因此,我什至不能使用LOGIN命令。我认为原因与SSL有关。但是,如何为ssh隧道设置ssl?