svnno****@sourc*****
svnno****@sourc*****
2017年 5月 12日 (金) 21:42:07 JST
Revision: 6717 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6717 Author: doda Date: 2017-05-12 21:42:07 +0900 (Fri, 12 May 2017) Log Message: ----------- シェルではなくサブシステムを起動する機能の追加 ticket:37165 Modified Paths: -------------- trunk/ttssh2/ttxssh/ssh.c trunk/ttssh2/ttxssh/ssh.h trunk/ttssh2/ttxssh/ttxssh.c trunk/ttssh2/ttxssh/ttxssh.h -------------- next part -------------- Modified: trunk/ttssh2/ttxssh/ssh.c =================================================================== --- trunk/ttssh2/ttxssh/ssh.c 2017-05-12 12:42:01 UTC (rev 6716) +++ trunk/ttssh2/ttxssh/ssh.c 2017-05-12 12:42:07 UTC (rev 6717) @@ -6799,7 +6799,13 @@ // FWD_prep_forwarding()\x82\xC5shell ID\x82\xF0\x8Eg\x82\xA4\x82̂ŁA\x90\xE6\x82ɐݒ\xE8\x82\xF0\x8E\x9D\x82\xC1\x82Ă\xAD\x82\xE9\x81B(2005.7.3 yutaka) // changed window size from 64KB to 32KB. (2006.3.6 yutaka) // changed window size from 32KB to 128KB. (2007.10.29 maya) - c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT, TYPE_SHELL, -1); + if (pvar->use_subsystem) { + c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT, TYPE_SUBSYSTEM_GEN, -1); + } + else { + c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT, TYPE_SHELL, -1); + } + if (c == NULL) { UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar, "Could not open new channel. TTSSH is already opening too many channels."); @@ -7541,7 +7547,7 @@ buffer_put_int(msg, remote_id); if (c->type == TYPE_SCP) { s = "exec"; - } else if (c->type == TYPE_SFTP) { + } else if (c->type == TYPE_SFTP || c->type == TYPE_SUBSYSTEM_GEN) { s = "subsystem"; } else { s = ""; // NOT REACHED @@ -7566,6 +7572,10 @@ char *sbuf = "sftp"; buffer_put_string(msg, sbuf, strlen(sbuf)); } + else if (c->type == TYPE_SUBSYSTEM_GEN) { + buffer_put_string(msg, pvar->subsystem_name, strlen(pvar->subsystem_name)); + pvar->session_nego_status = 0; + } len = buffer_len(msg); outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); @@ -7831,16 +7841,25 @@ return FALSE; } - if (pvar->session_nego_status == 1 && pvar->shell_id == channel_id) { - // \x83\x8A\x83\x82\x81[\x83g\x82\xC5 auth-****@opens***** \x82\xAA\x83T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82ĂȂ\xA2\x82̂\xC5 - // \x83G\x83\x89\x81[\x82͋C\x82ɂ\xB9\x82\xB8\x8E\x9F\x82i\x82\xDE + if (pvar->shell_id == channel_id) { + if (c->type == TYPE_SUBSYSTEM_GEN) { + // \x83T\x83u\x83V\x83X\x83e\x83\x80\x82̋N\x93\xAE\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x82̂Ő\xE9\x81B + notify_fatal_error(pvar, "subsystem request failed.", 1); + return TRUE; + } + else { // TYPE_SHELL + if (pvar->session_nego_status == 1) { + // \x83\x8A\x83\x82\x81[\x83g\x82\xC5 auth-****@opens***** \x82\xAA\x83T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82ĂȂ\xA2\x82̂\xC5 + // \x83G\x83\x89\x81[\x82͋C\x82ɂ\xB9\x82\xB8\x8E\x9F\x82i\x82\xDE - strncpy_s(buf, sizeof(buf), - "auth-****@opens***** is not supported by remote host.", - _TRUNCATE); - notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE); + strncpy_s(buf, sizeof(buf), + "auth-****@opens***** is not supported by remote host.", + _TRUNCATE); + notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE); - return send_pty_request(pvar, c); + return send_pty_request(pvar, c); + } + } } ssh2_channel_delete(c); @@ -8608,7 +8627,7 @@ } // \x83y\x83C\x83\x8D\x81[\x83h\x82Ƃ\xB5\x82ăN\x83\x89\x83C\x83A\x83\x93\x83g(Tera Term)\x82֓n\x82\xB7 - if (c->type == TYPE_SHELL) { + if (c->type == TYPE_SHELL || c->type == TYPE_SUBSYSTEM_GEN) { pvar->ssh_state.payload_datalen = str_len; pvar->ssh_state.payload_datastart = 8; // id + strlen @@ -8689,7 +8708,7 @@ } // \x83y\x83C\x83\x8D\x81[\x83h\x82Ƃ\xB5\x82ăN\x83\x89\x83C\x83A\x83\x93\x83g(Tera Term)\x82֓n\x82\xB7 - if (c->type == TYPE_SHELL) { + if (c->type == TYPE_SHELL || c->type == TYPE_SUBSYSTEM_GEN) { pvar->ssh_state.payload_datalen = strlen; pvar->ssh_state.payload_datastart = 12; // id + data_type + strlen @@ -8934,7 +8953,7 @@ _snprintf_s(log, sizeof(log), _TRUNCATE, "SSH2_MSG_CHANNEL_CLOSE was received. local:%d remote:%d", c->self_id, c->remote_id); notify_verbose_message(pvar, log, LOG_LEVEL_VERBOSE); - if (c->type == TYPE_SHELL) { + if (c->type == TYPE_SHELL || c->type == TYPE_SUBSYSTEM_GEN) { ssh2_channel_send_close(pvar, c); // TCP connection closed Modified: trunk/ttssh2/ttxssh/ssh.h =================================================================== --- trunk/ttssh2/ttxssh/ssh.h 2017-05-12 12:42:01 UTC (rev 6716) +++ trunk/ttssh2/ttxssh/ssh.h 2017-05-12 12:42:07 UTC (rev 6717) @@ -112,7 +112,7 @@ #define SSH_PROTOFLAG_HOST_IN_FWD_OPEN 2 enum channel_type { - TYPE_SHELL, TYPE_PORTFWD, TYPE_SCP, TYPE_SFTP, TYPE_AGENT, + TYPE_SHELL, TYPE_PORTFWD, TYPE_SCP, TYPE_SFTP, TYPE_AGENT, TYPE_SUBSYSTEM_GEN, }; // for SSH1 Modified: trunk/ttssh2/ttxssh/ttxssh.c =================================================================== --- trunk/ttssh2/ttxssh/ttxssh.c 2017-05-12 12:42:01 UTC (rev 6716) +++ trunk/ttssh2/ttxssh/ttxssh.c 2017-05-12 12:42:07 UTC (rev 6717) @@ -1930,6 +1930,11 @@ else { pvar->settings.IconID = IDI_SECURETT; } + } else if (MATCH_STR(option + 4, "-subsystem=") == 0) { + pvar->use_subsystem = TRUE; + strncpy_s(pvar->subsystem_name, + sizeof(pvar->subsystem_name), + option + 15, _TRUNCATE); // /ssh1 \x82\xC6 /ssh2 \x83I\x83v\x83V\x83\x87\x83\x93\x82̐V\x8BK\x92lj\xC1 (2006.9.16 maya) } else if (strcmp(option + 4, "1") == 0) { Modified: trunk/ttssh2/ttxssh/ttxssh.h =================================================================== --- trunk/ttssh2/ttxssh/ttxssh.h 2017-05-12 12:42:01 UTC (rev 6716) +++ trunk/ttssh2/ttxssh/ttxssh.h 2017-05-12 12:42:07 UTC (rev 6717) @@ -324,6 +324,9 @@ unsigned int server_compat_flag; void *hostkey_ctx; + + BOOL use_subsystem; + char subsystem_name[256]; } TInstVar; #define LOG_LEVEL_FATAL 5