try to fix putty can not connect to centos 6.8, but not fixed.
parent
70d53e7bdc
commit
9b353f89c8
|
@ -292,13 +292,13 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user,
|
||||||
if (_this->m_auth_mode != TS_AUTH_MODE_NONE)
|
if (_this->m_auth_mode != TS_AUTH_MODE_NONE)
|
||||||
ssh_options_set(_this->m_srv_session, SSH_OPTIONS_USER, _this->m_user_name.c_str());
|
ssh_options_set(_this->m_srv_session, SSH_OPTIONS_USER, _this->m_user_name.c_str());
|
||||||
|
|
||||||
#ifdef EX_DEBUG
|
//#ifdef EX_DEBUG
|
||||||
// int _timeout_us = 500000000; // 5 sec.
|
// // int _timeout_us = 500000000; // 5 sec.
|
||||||
|
// // ssh_options_set(_this->m_srv_session, SSH_OPTIONS_TIMEOUT_USEC, &_timeout_us);
|
||||||
|
//#else
|
||||||
|
// int _timeout_us = 10000000; // 10 sec.
|
||||||
// ssh_options_set(_this->m_srv_session, SSH_OPTIONS_TIMEOUT_USEC, &_timeout_us);
|
// ssh_options_set(_this->m_srv_session, SSH_OPTIONS_TIMEOUT_USEC, &_timeout_us);
|
||||||
#else
|
//#endif
|
||||||
int _timeout_us = 10000000; // 10 sec.
|
|
||||||
ssh_options_set(_this->m_srv_session, SSH_OPTIONS_TIMEOUT_USEC, &_timeout_us);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
rc = ssh_connect(_this->m_srv_session);
|
rc = ssh_connect(_this->m_srv_session);
|
||||||
|
@ -325,29 +325,21 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user,
|
||||||
|
|
||||||
|
|
||||||
if (_this->m_auth_mode == TS_AUTH_MODE_PASSWORD) {
|
if (_this->m_auth_mode == TS_AUTH_MODE_PASSWORD) {
|
||||||
// //rc = ssh_userauth_password(_this->m_srv_session, NULL, _this->m_user_auth.c_str());
|
|
||||||
// rc = SSH_AUTH_DENIED;
|
|
||||||
// if (rc == SSH_AUTH_SUCCESS) {
|
|
||||||
// _this->m_is_logon = true;
|
|
||||||
// return SSH_AUTH_SUCCESS;
|
|
||||||
// }
|
|
||||||
// else if (rc == SSH_AUTH_ERROR) {
|
|
||||||
// EXLOGE("[ssh] invalid password for password mode to login to real SSH server %s:%d.\n", _this->m_server_ip.c_str(), _this->m_server_port);
|
|
||||||
// _this->m_have_error = true;
|
|
||||||
// _this->m_retcode = SESS_STAT_ERR_AUTH_DENIED;
|
|
||||||
// return SSH_AUTH_ERROR;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 优先尝试交互式登录(SSHv2推荐)
|
// 优先尝试交互式登录(SSHv2推荐)
|
||||||
rc = ssh_userauth_kbdint(_this->m_srv_session, NULL, NULL);
|
rc = ssh_userauth_kbdint(_this->m_srv_session, NULL, NULL);
|
||||||
while(rc == SSH_AUTH_INFO) {
|
while(rc == SSH_AUTH_INFO) {
|
||||||
int nprompts = ssh_userauth_kbdint_getnprompts(_this->m_srv_session);
|
int nprompts = ssh_userauth_kbdint_getnprompts(_this->m_srv_session);
|
||||||
|
if(0 == nprompts) {
|
||||||
|
rc = ssh_userauth_kbdint(_this->m_srv_session, NULL, NULL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (int iprompt = 0; iprompt < nprompts; ++iprompt) {
|
for (int iprompt = 0; iprompt < nprompts; ++iprompt) {
|
||||||
char echo = 0;
|
char echo = 0;
|
||||||
const char* prompt = ssh_userauth_kbdint_getprompt(session, iprompt, &echo);
|
const char* prompt = ssh_userauth_kbdint_getprompt(_this->m_srv_session, iprompt, &echo);
|
||||||
EXLOGV("[ssh] interactive login prompt: %s\n", prompt);
|
EXLOGV("[ssh] interactive login prompt: %s\n", prompt);
|
||||||
|
|
||||||
rc = ssh_userauth_kbdint_setanswer(_this->m_srv_session, 0, _this->m_user_auth.c_str());
|
rc = ssh_userauth_kbdint_setanswer(_this->m_srv_session, iprompt, _this->m_user_auth.c_str());
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
EXLOGE("[ssh] invalid password for interactive mode to login to real SSH server %s:%d.\n", _this->m_server_ip.c_str(), _this->m_server_port);
|
EXLOGE("[ssh] invalid password for interactive mode to login to real SSH server %s:%d.\n", _this->m_server_ip.c_str(), _this->m_server_port);
|
||||||
_this->m_have_error = true;
|
_this->m_have_error = true;
|
||||||
|
@ -355,6 +347,8 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user,
|
||||||
return SSH_AUTH_ERROR;
|
return SSH_AUTH_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc = ssh_userauth_kbdint(_this->m_srv_session, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc == SSH_AUTH_SUCCESS) {
|
if (rc == SSH_AUTH_SUCCESS) {
|
||||||
|
@ -419,15 +413,23 @@ int SshSession::_on_auth_password_request(ssh_session session, const char *user,
|
||||||
|
|
||||||
ssh_channel SshSession::_on_new_channel_request(ssh_session session, void *userdata) {
|
ssh_channel SshSession::_on_new_channel_request(ssh_session session, void *userdata) {
|
||||||
// 客户端尝试打开一个通道(然后才能通过这个通道发控制命令或者收发数据)
|
// 客户端尝试打开一个通道(然后才能通过这个通道发控制命令或者收发数据)
|
||||||
EXLOGV("[ssh] allocated session channel\n");
|
EXLOGV("[ssh] client open channel\n");
|
||||||
|
|
||||||
SshSession *_this = (SshSession *)userdata;
|
SshSession *_this = (SshSession *)userdata;
|
||||||
|
|
||||||
ssh_channel cli_channel = ssh_channel_new(session);
|
ssh_channel cli_channel = ssh_channel_new(session);
|
||||||
|
if(cli_channel == NULL) {
|
||||||
|
EXLOGE("[ssh] can not create channel for client.\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
ssh_set_channel_callbacks(cli_channel, &_this->m_cli_channel_cb);
|
ssh_set_channel_callbacks(cli_channel, &_this->m_cli_channel_cb);
|
||||||
|
|
||||||
// 我们也要向真正的服务器申请打开一个通道,来进行转发
|
// 我们也要向真正的服务器申请打开一个通道,来进行转发
|
||||||
ssh_channel srv_channel = ssh_channel_new(_this->m_srv_session);
|
ssh_channel srv_channel = ssh_channel_new(_this->m_srv_session);
|
||||||
|
if(srv_channel == NULL) {
|
||||||
|
EXLOGE("[ssh] can not create channel for server.\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
if (ssh_channel_open_session(srv_channel)) {
|
if (ssh_channel_open_session(srv_channel)) {
|
||||||
EXLOGE("[ssh] error opening channel to real server: %s\n", ssh_get_error(session));
|
EXLOGE("[ssh] error opening channel to real server: %s\n", ssh_get_error(session));
|
||||||
ssh_channel_free(cli_channel);
|
ssh_channel_free(cli_channel);
|
||||||
|
@ -450,6 +452,7 @@ ssh_channel SshSession::_on_new_channel_request(ssh_session session, void *userd
|
||||||
_this->m_channel_srv_cli.insert(std::make_pair(srv_channel, cli_info));
|
_this->m_channel_srv_cli.insert(std::make_pair(srv_channel, cli_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXLOGD("[ssh] channel for client and server created.\n");
|
||||||
return cli_channel;
|
return cli_channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,17 +866,8 @@ int SshSession::_on_client_shell_request(ssh_session session, ssh_channel channe
|
||||||
SshSession *_this = (SshSession *)userdata;
|
SshSession *_this = (SshSession *)userdata;
|
||||||
|
|
||||||
if (_this->m_is_sftp) {
|
if (_this->m_is_sftp) {
|
||||||
EXLOGE("[ssh] try to request shell on a sftp-session.\n");
|
EXLOGE("[ssh] request shell on a sftp-session is denied.\n");
|
||||||
// char buf[2048] = { 0 };
|
return SSH_ERROR;
|
||||||
// snprintf(buf, sizeof(buf),
|
|
||||||
// "\r\n\r\n"\
|
|
||||||
// "!! ERROR !!\r\n"\
|
|
||||||
// "Session-ID '%s' has been used for SFTP.\r\n"\
|
|
||||||
// "\r\n", _this->m_sid.c_str()
|
|
||||||
// );
|
|
||||||
// ssh_channel_write(channel, buf, strlen(buf));
|
|
||||||
//
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXLOGD("[ssh] client request shell\n");
|
EXLOGD("[ssh] client request shell\n");
|
||||||
|
@ -881,17 +875,20 @@ int SshSession::_on_client_shell_request(ssh_session session, ssh_channel channe
|
||||||
TS_SSH_CHANNEL_INFO *srv_info = _this->_get_srv_channel(channel);
|
TS_SSH_CHANNEL_INFO *srv_info = _this->_get_srv_channel(channel);
|
||||||
if (NULL == srv_info || NULL == srv_info->channel) {
|
if (NULL == srv_info || NULL == srv_info->channel) {
|
||||||
EXLOGE("[ssh] when client request shell, not found server channel.\n");
|
EXLOGE("[ssh] when client request shell, not found server channel.\n");
|
||||||
return 1;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
srv_info->type = TS_SSH_CHANNEL_TYPE_SHELL;
|
srv_info->type = TS_SSH_CHANNEL_TYPE_SHELL;
|
||||||
|
|
||||||
TS_SSH_CHANNEL_INFO *cli_info = _this->_get_cli_channel(srv_info->channel);
|
TS_SSH_CHANNEL_INFO *cli_info = _this->_get_cli_channel(srv_info->channel);
|
||||||
if (NULL == cli_info || NULL == cli_info->channel) {
|
if (NULL == cli_info || NULL == cli_info->channel) {
|
||||||
EXLOGE("[ssh] when client request shell, not found client channel.\n");
|
EXLOGE("[ssh] when client request shell, not found client channel.\n");
|
||||||
return 1;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
cli_info->type = TS_SSH_CHANNEL_TYPE_SHELL;
|
cli_info->type = TS_SSH_CHANNEL_TYPE_SHELL;
|
||||||
|
|
||||||
|
// FIXME: if client is putty, it will block here. the following function will never return.
|
||||||
|
// at this time, can not write data to this channel. read from this channel with timeout, got 0 byte.
|
||||||
|
// I have no idea how to fix it... :(
|
||||||
return ssh_channel_request_shell(srv_info->channel);
|
return ssh_channel_request_shell(srv_info->channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1116,12 +1113,8 @@ int SshSession::_on_server_channel_data(ssh_session session, ssh_channel channel
|
||||||
" - authroized by %s\r\n"\
|
" - authroized by %s\r\n"\
|
||||||
"=============================================\r\n"\
|
"=============================================\r\n"\
|
||||||
"\r\n",
|
"\r\n",
|
||||||
// \
|
|
||||||
// "\033]0;tpssh://%s\007\r\n",
|
|
||||||
_this->m_server_ip.c_str(),
|
_this->m_server_ip.c_str(),
|
||||||
_this->m_server_port, auth_mode
|
_this->m_server_port, auth_mode
|
||||||
// ,
|
|
||||||
// _this->m_server_ip.c_str()
|
|
||||||
);
|
);
|
||||||
|
|
||||||
int buf_len = strlen(buf);
|
int buf_len = strlen(buf);
|
||||||
|
@ -1130,11 +1123,7 @@ int SshSession::_on_server_channel_data(ssh_session session, ssh_channel channel
|
||||||
memcpy(&_data[0], buf, buf_len);
|
memcpy(&_data[0], buf, buf_len);
|
||||||
memcpy(&_data[buf_len], data, len);
|
memcpy(&_data[buf_len], data, len);
|
||||||
|
|
||||||
// 注意,这里虽然可以改变窗口(或者标签页)的标题,但是因为这是服务端发回的第一个包,后面服务端可能还会发类似的包(仅一次)来改变标题
|
|
||||||
// 导致窗口标题又被改变,因此理论上应该解析服务端发回的包,如果包含上述格式的,需要替换一次。
|
|
||||||
//_write(info->channel, buf, strlen(buf));
|
|
||||||
ret = ssh_channel_write(info->channel, &_data[0], _data.size());
|
ret = ssh_channel_write(info->channel, &_data[0], _data.size());
|
||||||
//EXLOGD("--- first send to client : %d %d %d\n", _data.size(), ret, len);
|
|
||||||
|
|
||||||
_this->m_recving_from_srv = false;
|
_this->m_recving_from_srv = false;
|
||||||
return len;
|
return len;
|
||||||
|
@ -1150,8 +1139,6 @@ int SshSession::_on_server_channel_data(ssh_session session, ssh_channel channel
|
||||||
EXLOGE("[ssh] send data(%dB) to client failed (2). [%d][%s][%s]\n", len, ret, ssh_get_error(_this->m_cli_session), ssh_get_error(_this->m_cli_session));
|
EXLOGE("[ssh] send data(%dB) to client failed (2). [%d][%s][%s]\n", len, ret, ssh_get_error(_this->m_cli_session), ssh_get_error(_this->m_cli_session));
|
||||||
}
|
}
|
||||||
|
|
||||||
//EXLOGD("--- send to client: %d %d\n", ret, len);
|
|
||||||
|
|
||||||
_this->m_recving_from_srv = false;
|
_this->m_recving_from_srv = false;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue