diff options
author | 2002-03-21 15:17:26 +0000 | |
---|---|---|
committer | 2002-03-21 15:17:26 +0000 | |
commit | 9a4e3996f9c484a6b8ffe8233e6c350c9a76c639 (patch) | |
tree | cdfb033a7c66596f7c8d3e6823cd3bc0a5d3f1b4 /usr.bin/ssh/clientloop.c | |
parent | move md5.c, add des-ede3 test (diff) | |
download | wireguard-openbsd-9a4e3996f9c484a6b8ffe8233e6c350c9a76c639.tar.xz wireguard-openbsd-9a4e3996f9c484a6b8ffe8233e6c350c9a76c639.zip |
add built-in command line for adding new port forwardings on the fly.
based on a patch from brian wellington. ok markus@.
Diffstat (limited to 'usr.bin/ssh/clientloop.c')
-rw-r--r-- | usr.bin/ssh/clientloop.c | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/usr.bin/ssh/clientloop.c b/usr.bin/ssh/clientloop.c index 65a6682a68e..7259959ee73 100644 --- a/usr.bin/ssh/clientloop.c +++ b/usr.bin/ssh/clientloop.c @@ -59,7 +59,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: clientloop.c,v 1.96 2002/02/06 14:55:15 markus Exp $"); +RCSID("$OpenBSD: clientloop.c,v 1.97 2002/03/21 15:17:26 jakob Exp $"); #include "ssh.h" #include "ssh1.h" @@ -81,6 +81,7 @@ RCSID("$OpenBSD: clientloop.c,v 1.96 2002/02/06 14:55:15 markus Exp $"); #include "atomicio.h" #include "sshtty.h" #include "misc.h" +#include "readpass.h" /* import options */ extern Options options; @@ -470,6 +471,75 @@ client_process_net_input(fd_set * readset) } } +static void +process_cmdline(Buffer *bin, Buffer *bout, Buffer *berr) +{ + char string[1024]; + void (*handler)(int); + char *s, *cmd; + u_short fwd_port, fwd_host_port; + char buf[1024], sfwd_port[6], sfwd_host_port[6]; + int local = 0; + int n; + + leave_raw_mode(); + handler = signal(SIGINT, SIG_IGN); + s = read_passphrase("\r\nssh> ", RP_ECHO); + if (s == NULL) + goto out; + cmd = s; + + while (*s && isspace(*s)) + s++; + + if (*s == 0) + goto out; + + if (strlen(s) < 2 || s[0] != '-' || !(s[1] == 'L' || s[1] == 'R')) { + log("Invalid command"); + goto out; + } + if (s[1] == 'L') + local = 1; + if (!local && !compat20) { + log("Not supported for SSH protocol version 1"); + goto out; + } + + s += 2; + while (*s && isspace(*s)) + s++; + + if (sscanf(s, "%5[0-9]:%255[^:]:%5[0-9]", + sfwd_port, buf, sfwd_host_port) != 3 && + sscanf(s, "%5[0-9]/%255[^/]/%5[0-9]", + sfwd_port, buf, sfwd_host_port) != 3) { + log("Bad forwarding specification"); + goto out; + } + if ((fwd_port = a2port(sfwd_port)) == 0 || + (fwd_host_port = a2port(sfwd_host_port)) == 0) { + log("Bad forwarding port(s)"); + goto out; + } + if (local) { + n = channel_setup_local_fwd_listener(fwd_port, buf, + fwd_host_port, options.gateway_ports); + if (n <= 0) { + log("Port forwarding failed"); + goto out; + } + } else + channel_request_remote_forwarding(fwd_port, buf, + fwd_host_port); + log("Forwarding port"); +out: + signal(SIGINT, handler); + enter_raw_mode(); + if (cmd) + xfree(cmd); +} + /* process the characters one by one */ static int process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len) @@ -574,6 +644,7 @@ process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len) "%c?\r\n\ Supported escape sequences:\r\n\ ~. - terminate connection\r\n\ +~C - open a command line\r\n\ ~R - Request rekey (SSH protocol 2 only)\r\n\ ~^Z - suspend ssh\r\n\ ~# - list forwarded connections\r\n\ @@ -593,6 +664,10 @@ Supported escape sequences:\r\n\ xfree(s); continue; + case 'C': + process_cmdline(bin, bout, berr); + continue; + default: if (ch != escape_char) { buffer_put_char(bin, escape_char); |