dbclient -e option (part 3 of 3: full implementation)

Nik Soggia dropbear at niksoggia.it
Sat May 14 01:15:17 AWST 2016


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.000000000 +0100
+++ 2016.73.new/cli-chansession.c	2016-05-13 18:55:00.000000000 +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.000000000 +0100
+++ 2016.73.new/cli-runopts.c	2016-05-13 18:55:00.000000000 +0100
@@ -91,6 +91,7 @@
  #ifdef ENABLE_USER_ALGO_LIST
  					"-c <cipher list> Specify preferred ciphers ('-c help' to list options)\n"
  					"-m <MAC list> Specify preferred MACs for packet verification (or '-m help')\n"
+					"-e <char> Sets the escape character for sessions with a pty\n"
  #endif
  					"-V    Version\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.000000000 +0100
+++ 2016.73.new/dbclient.1	2016-05-13 18:55:00.000000000 +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 at 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.000000000 +0100
+++ 2016.73.new/runopts.h	2016-05-13 18:55:00.000000000 +0100
@@ -131,6 +131,7 @@
  	char *username;

  	char *cmd;
+	int escapechar;
  	int wantpty;
  	int always_accept_key;
  	int no_hostkey_check;


More information about the Dropbear mailing list