X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/eea098a35a7ed7fd460ffb549c241aa9d47c2919..4278ff63eceba288225b85bf82506c680d427821:/ssh.c diff --git a/ssh.c b/ssh.c index 70eaa772..d500e849 100644 --- a/ssh.c +++ b/ssh.c @@ -39,7 +39,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: ssh.c,v 1.132 2001/07/31 09:28:44 jakob Exp $"); +RCSID("$OpenBSD: ssh.c,v 1.141 2001/08/29 23:27:23 stevesk Exp $"); #include #include @@ -118,6 +118,9 @@ int fork_after_authentication_flag = 0; */ Options options; +/* optional user configfile */ +char *config = NULL; + /* * Name of the host we are connecting to. This is the name given on the * command line, or the HostName specified for the user-supplied name in a @@ -160,6 +163,8 @@ usage(void) fprintf(stderr, "Options:\n"); fprintf(stderr, " -l user Log in using this user name.\n"); fprintf(stderr, " -n Redirect input from " _PATH_DEVNULL ".\n"); + fprintf(stderr, " -F config Config file (default: ~/%s).\n", + _PATH_SSH_USER_CONFFILE); fprintf(stderr, " -A Enable authentication agent forwarding.\n"); fprintf(stderr, " -a Disable authentication agent forwarding (default).\n"); #ifdef AFS @@ -169,6 +174,9 @@ usage(void) fprintf(stderr, " -x Disable X11 connection forwarding (default).\n"); fprintf(stderr, " -i file Identity for public key authentication " "(default: ~/.ssh/identity)\n"); +#ifdef SMARTCARD + fprintf(stderr, " -I reader Set smartcard reader.\n"); +#endif fprintf(stderr, " -t Tty; allocate a tty even if command is given.\n"); fprintf(stderr, " -T Do not allocate a tty.\n"); fprintf(stderr, " -v Verbose; display verbose debugging messages.\n"); @@ -186,6 +194,7 @@ usage(void) fprintf(stderr, " -R listen-port:host:port Forward remote port to local address\n"); fprintf(stderr, " These cause %s to listen for connections on a port, and\n", __progname); fprintf(stderr, " forward them to the other side by connecting to host:port.\n"); + fprintf(stderr, " -D port Enable dynamic application-level port forwarding.\n"); fprintf(stderr, " -C Enable compression.\n"); fprintf(stderr, " -N Do not execute a shell or command.\n"); fprintf(stderr, " -g Allow remote hosts to connect to forwarded ports.\n"); @@ -249,6 +258,7 @@ main(int ac, char **av) { int i, opt, exit_status, cerr; u_short fwd_port, fwd_host_port; + char sfwd_port[6], sfwd_host_port[6]; char *p, *cp, buf[256]; struct stat st; struct passwd *pw; @@ -312,7 +322,7 @@ main(int ac, char **av) again: while ((opt = getopt(ac, av, - "1246ab:c:e:fgi:kl:m:no:p:qstvxACD:I:L:NPR:TVX")) != -1) { + "1246ab:c:e:fgi:kl:m:no:p:qstvxACD:F:I:L:NPR:TVX")) != -1) { switch (opt) { case '1': options.protocol = SSH_PROTO_1; @@ -372,7 +382,7 @@ again: break; case 'I': #ifdef SMARTCARD - options.smartcard_device = atoi(optarg); + options.smartcard_device = xstrdup(optarg); #else fprintf(stderr, "no support for smartcards.\n"); #endif @@ -461,33 +471,31 @@ again: case 'l': options.user = optarg; break; + + case 'L': case 'R': - if (sscanf(optarg, "%hu/%255[^/]/%hu", &fwd_port, buf, - &fwd_host_port) != 3 && - sscanf(optarg, "%hu:%255[^:]:%hu", &fwd_port, buf, - &fwd_host_port) != 3) { + if (sscanf(optarg, "%5[0-9]:%255[^:]:%5[0-9]", + sfwd_port, buf, sfwd_host_port) != 3 && + sscanf(optarg, "%5[0-9]/%255[^/]/%5[0-9]", + sfwd_port, buf, sfwd_host_port) != 3) { fprintf(stderr, - "Bad forwarding specification '%s'.\n", + "Bad forwarding specification '%s'\n", optarg); usage(); /* NOTREACHED */ } - add_remote_forward(&options, fwd_port, buf, - fwd_host_port); - break; - case 'L': - if (sscanf(optarg, "%hu/%255[^/]/%hu", &fwd_port, buf, - &fwd_host_port) != 3 && - sscanf(optarg, "%hu:%255[^:]:%hu", &fwd_port, buf, - &fwd_host_port) != 3) { + if ((fwd_port = a2port(sfwd_port)) == 0 || + (fwd_host_port = a2port(sfwd_host_port)) == 0) { fprintf(stderr, - "Bad forwarding specification '%s'.\n", - optarg); - usage(); - /* NOTREACHED */ + "Bad forwarding port(s) '%s'\n", optarg); + exit(1); } - add_local_forward(&options, fwd_port, buf, - fwd_host_port); + if (opt == 'L') + add_local_forward(&options, fwd_port, buf, + fwd_host_port); + else if (opt == 'R') + add_remote_forward(&options, fwd_port, buf, + fwd_host_port); break; case 'D': @@ -522,6 +530,9 @@ again: case 'b': options.bind_address = optarg; break; + case 'F': + config = optarg; + break; default: usage(); } @@ -606,12 +617,20 @@ again: log_init(av[0], options.log_level == -1 ? SYSLOG_LEVEL_INFO : options.log_level, SYSLOG_FACILITY_USER, 1); - /* Read per-user configuration file. */ - snprintf(buf, sizeof buf, "%.100s/%.100s", pw->pw_dir, _PATH_SSH_USER_CONFFILE); - read_config_file(buf, host, &options); - - /* Read systemwide configuration file. */ - read_config_file(_PATH_HOST_CONFIG_FILE, host, &options); + /* + * Read per-user configuration file. Ignore the system wide config + * file if the user specifies a config file on the command line. + */ + if (config != NULL) { + read_config_file(config, host, &options); + } else { + snprintf(buf, sizeof buf, "%.100s/%.100s", pw->pw_dir, + _PATH_SSH_USER_CONFFILE); + + /* Read systemwide configuration file. */ + read_config_file(_PATH_HOST_CONFIG_FILE, host, &options); + read_config_file(buf, host, &options); + } /* Fill configuration defaults. */ fill_default_options(&options); @@ -706,7 +725,7 @@ again: * Now that we are back to our own permissions, create ~/.ssh * directory if it doesn\'t already exist. */ - snprintf(buf, sizeof buf, "%.100s/%.100s", pw->pw_dir, _PATH_SSH_USER_DIR); + snprintf(buf, sizeof buf, "%.100s%s%.100s", pw->pw_dir, strcmp(pw->pw_dir, "/") ? "/" : "", _PATH_SSH_USER_DIR); if (stat(buf, &st) < 0) if (mkdir(buf, 0700) < 0) error("Could not create directory '%.200s'.", buf); @@ -756,6 +775,16 @@ again: } xfree(sensitive_data.keys); } + for (i = 0; i < options.num_identity_files; i++) { + if (options.identity_files[i]) { + xfree(options.identity_files[i]); + options.identity_files[i] = NULL; + } + if (options.identity_keys[i]) { + key_free(options.identity_keys[i]); + options.identity_keys[i] = NULL; + } + } exit_status = compat20 ? ssh_session2() : ssh_session(); packet_close(); @@ -1151,7 +1180,7 @@ load_public_identity_files(void) int i = 0; #ifdef SMARTCARD - if (options.smartcard_device >= 0 && + if (options.smartcard_device != NULL && options.num_identity_files + 1 < SSH_MAX_IDENTITY_FILES && (public = sc_get_key(options.smartcard_device)) != NULL ) { Key *new; @@ -1182,7 +1211,7 @@ load_public_identity_files(void) key_free(public); } -#endif +#endif /* SMARTCARD */ for (; i < options.num_identity_files; i++) { filename = tilde_expand_filename(options.identity_files[i], original_real_uid);