dbclient -e option (part 1 of 3: intro)
Hello everybody, today I was fiddling with c-kermit and zssh to test in-band file transfers. Both tools insist adding the "-e none" to the command line arguments to tell openssh to make the session fully transparent. dbclient instead prints its version and quits because treats "-e" as a switch and "none" becomes the hostname. I have two solutions: - a mini-invasive surgery (adds 0 bytes to the binary) to move the "case 'e'" in cli-runopts.c in the right spot so that -e can accept arguments still doing nothing and printing the warning message as before (see part 2), or - a full implementation of the -e argument adding 80 bytes of bloat :), in part 3. personally I like the bloated solution so "dbclient -e $'\x1d'" can bring back the handy '^]' I miss from the old telnet times where escapes were not printable. I hope you will review my second patch and include it upstream. Best regards,
dbclient -e option (part 2 of 3: trivial patch)
here is the trivial patch. -e is still a no-op but it will accept arguments --- 2016.73.old/cli-runopts.c 2016-03-18 15:44:43.0 +0100 +++ 2016.73.new/cli-runopts.c 2016-05-13 18:55:00.0 +0100 @@ -297,7 +297,6 @@ break; #endif case 'F': - case 'e': #ifndef ENABLE_USER_ALGO_LIST case 'c': case 'm': @@ -313,6 +312,7 @@ print_version(); exit(EXIT_SUCCESS); break; + case 'e': case 'b': next = &dummy; /* FALLTHROUGH */
dbclient -e option (part 3 of 3: full implementation)
here is the -e full implementation. enjoy! diff -Naur dropbear-2016.73.old/cli-chansession.c dropbear-2016.73.new/cli-chansession.c --- 2016.73.old/cli-chansession.c 2016-03-18 15:44:43.0 +0100 +++ 2016.73.new/cli-chansession.c 2016-05-13 18:55:00.0 +0100 @@ -372,7 +372,9 @@ if (cli_opts.wantpty) { cli_tty_setup(); - channel->read_mangler = cli_escape_handler; + if (cli_opts.escapechar != '\0') { + channel->read_mangler = cli_escape_handler; + } cli_ses.last_char = '\r'; } @@ -465,13 +467,13 @@ c = buf[0]; - if (cli_ses.last_char == DROPBEAR_ESCAPE_CHAR) { + if (cli_ses.last_char == cli_opts.escapechar) { skip_char = do_escape(c); cli_ses.last_char = 0x0; } else { - if (c == DROPBEAR_ESCAPE_CHAR) { + if (c == cli_opts.escapechar) { if (cli_ses.last_char == '\r') { - cli_ses.last_char = DROPBEAR_ESCAPE_CHAR; + cli_ses.last_char = cli_opts.escapechar; skip_char = 1; } else { cli_ses.last_char = 0x0; diff -Naur dropbear-2016.73.old/cli-runopts.c dropbear-2016.73.new/cli-runopts.c --- 2016.73.old/cli-runopts.c 2016-03-18 15:44:43.0 +0100 +++ 2016.73.new/cli-runopts.c 2016-05-13 18:55:00.0 +0100 @@ -91,6 +91,7 @@ #ifdef ENABLE_USER_ALGO_LIST "-c Specify preferred ciphers ('-c help' to list options)\n" "-m Specify preferred MACs for packet verification (or '-m help')\n" + "-e Sets the escape character for sessions with a pty\n" #endif "-VVersion\n" #ifdef DEBUG_TRACE @@ -127,6 +128,7 @@ unsigned int cmdlen; char* dummy = NULL; /* Not used for anything real */ + char* escape = NULL; char* recv_window_arg = NULL; char* keepalive_arg = NULL; char* idle_timeout_arg = NULL; @@ -218,6 +220,9 @@ opt = OPT_AUTHKEY; break; #endif + case 'e': /* escape char */ + next = &escape; + break; case 't': /* we want a pty */ cli_opts.wantpty = 1; break; @@ -297,7 +302,6 @@ break; #endif case 'F': - case 'e': #ifndef ENABLE_USER_ALGO_LIST case 'c': case 'm': @@ -420,6 +424,14 @@ cli_opts.remoteport = "22"; } + if (escape == NULL) { + cli_opts.escapechar = DROPBEAR_ESCAPE_CHAR; + } else if (strcmp ("none", escape) == 0) { + cli_opts.escapechar = '\0'; + } else { + cli_opts.escapechar = escape[0] & 0xff; + } + /* If not explicitly specified with -t or -T, we don't want a pty if * there's a command, but we do otherwise */ if (cli_opts.wantpty == 9) { diff -Naur dropbear-2016.73.old/dbclient.1 dropbear-2016.73.new/dbclient.1 --- 2016.73.old/dbclient.1 2016-03-18 15:44:43.0 +0100 +++ 2016.73.new/dbclient.1 2016-05-13 18:55:00.0 +0100 @@ -147,6 +147,9 @@ .B \-s The specified command will be requested as a subsystem, used for sftp. Dropbear doesn't implement sftp itself but the OpenSSH sftp client can be used eg \fIsftp -S dbclient user@host\fR .TP +.B \-e \fIcharacter +Sets the escape character for sessions with a pty (default: '~'). Setting the character to an empty string or "none" disables any escapes and makes the session fully transparent. +.TP .B \-V Print the version diff -Naur dropbear-2016.73.old/runopts.h dropbear-2016.73.new/runopts.h --- 2016.73.old/runopts.h 2016-03-18 15:44:43.0 +0100 +++ 2016.73.new/runopts.h 2016-05-13 18:55:00.0 +0100 @@ -131,6 +131,7 @@ char *username; char *cmd; + int escapechar; int wantpty; int always_accept_key; int no_hostkey_check;
Re: dbclient -e option (part 4 of 3: yes, 4!)
Il 13/05/2016 19:15, Nik Soggia wrote: enjoy! Mailman chewed up the patches. here they are again. Regards, begin-base64 644 dropbear-2016.73.patches.tar.xz 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 ujy83dsAAaAMgFAAALmwXJ6xxGf7AgAEWVo=