version 1.330, 2010/01/09 23:04:13 |
version 1.331, 2010/01/11 01:39:46 |
|
|
*/ |
*/ |
int fork_after_authentication_flag = 0; |
int fork_after_authentication_flag = 0; |
|
|
|
/* forward stdio to remote host and port */ |
|
char *stdio_forward_host = NULL; |
|
int stdio_forward_port = 0; |
|
|
/* |
/* |
* General data structure for command line options and options configurable |
* General data structure for command line options and options configurable |
* in configuration files. See readconf.h. |
* in configuration files. See readconf.h. |
|
|
" [-i identity_file] [-L [bind_address:]port:host:hostport]\n" |
" [-i identity_file] [-L [bind_address:]port:host:hostport]\n" |
" [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]\n" |
" [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]\n" |
" [-R [bind_address:]port:host:hostport] [-S ctl_path]\n" |
" [-R [bind_address:]port:host:hostport] [-S ctl_path]\n" |
" [-w local_tun[:remote_tun]] [user@]hostname [command]\n" |
" [-W host:port] [-w local_tun[:remote_tun]]\n" |
|
" [user@]hostname [command]\n" |
); |
); |
exit(255); |
exit(255); |
} |
} |
|
|
|
|
again: |
again: |
while ((opt = getopt(ac, av, "1246ab:c:e:fgi:kl:m:no:p:qstvx" |
while ((opt = getopt(ac, av, "1246ab:c:e:fgi:kl:m:no:p:qstvx" |
"ACD:F:I:KL:MNO:PR:S:TVw:XYy")) != -1) { |
"ACD:F:I:KL:MNO:PR:S:TVw:W:XYy")) != -1) { |
switch (opt) { |
switch (opt) { |
case '1': |
case '1': |
options.protocol = SSH_PROTO_1; |
options.protocol = SSH_PROTO_1; |
|
|
exit(255); |
exit(255); |
} |
} |
break; |
break; |
|
case 'W': |
|
if (parse_forward(&fwd, optarg, 1, 0)) { |
|
stdio_forward_host = fwd.listen_host; |
|
stdio_forward_port = fwd.listen_port; |
|
xfree(fwd.connect_host); |
|
} else { |
|
fprintf(stderr, |
|
"Bad stdio forwarding specification '%s'\n", |
|
optarg); |
|
exit(255); |
|
} |
|
no_tty_flag = 1; |
|
no_shell_flag = 1; |
|
options.clear_forwardings = 1; |
|
options.exit_on_forward_failure = 1; |
|
break; |
case 'q': |
case 'q': |
options.log_level = SYSLOG_LEVEL_QUIET; |
options.log_level = SYSLOG_LEVEL_QUIET; |
break; |
break; |
|
|
} |
} |
|
|
static void |
static void |
|
client_cleanup_stdio_fwd(int id, void *arg) |
|
{ |
|
debug("stdio forwarding: done"); |
|
cleanup_exit(0); |
|
} |
|
|
|
static int |
|
client_setup_stdio_fwd(const char *host_to_connect, u_short port_to_connect) |
|
{ |
|
Channel *c; |
|
|
|
debug3("client_setup_stdio_fwd %s:%d", host_to_connect, |
|
port_to_connect); |
|
if ((c = channel_connect_stdio_fwd(host_to_connect, port_to_connect)) |
|
== NULL) |
|
return 0; |
|
channel_register_cleanup(c->self, client_cleanup_stdio_fwd, 0); |
|
return 1; |
|
} |
|
|
|
static void |
ssh_init_forwarding(void) |
ssh_init_forwarding(void) |
{ |
{ |
int success = 0; |
int success = 0; |
int i; |
int i; |
|
|
|
if (stdio_forward_host != NULL) { |
|
if (!compat20) { |
|
fatal("stdio forwarding require Protocol 2"); |
|
} |
|
if (!client_setup_stdio_fwd(stdio_forward_host, |
|
stdio_forward_port)) |
|
fatal("Failed to connect in stdio forward mode."); |
|
} |
|
|
/* Initiate local TCP/IP port forwardings. */ |
/* Initiate local TCP/IP port forwardings. */ |
for (i = 0; i < options.num_local_forwards; i++) { |
for (i = 0; i < options.num_local_forwards; i++) { |