Mercurial > dropbear
annotate cli-runopts.c @ 447:278805938dcf
Patch from Nicolai Ehemann to try binding before going to the background,
so that if it exits early (because something's already listening etc)
then it will return an exitcode of 1.
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 19 Jul 2007 15:54:18 +0000 |
parents | 2cd2edfa11ee |
children | 3e6c536bc023 |
rev | line source |
---|---|
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
1 /* |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
2 * Dropbear - a SSH2 server |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
3 * |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
4 * Copyright (c) 2002,2003 Matt Johnston |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
5 * All rights reserved. |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
6 * |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
7 * Permission is hereby granted, free of charge, to any person obtaining a copy |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
8 * of this software and associated documentation files (the "Software"), to deal |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
9 * in the Software without restriction, including without limitation the rights |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
11 * copies of the Software, and to permit persons to whom the Software is |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
12 * furnished to do so, subject to the following conditions: |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
13 * |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
14 * The above copyright notice and this permission notice shall be included in |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
15 * all copies or substantial portions of the Software. |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
16 * |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
23 * SOFTWARE. */ |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
24 |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
25 #include "includes.h" |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
26 #include "runopts.h" |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
27 #include "signkey.h" |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
28 #include "buffer.h" |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
29 #include "dbutil.h" |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
30 #include "algo.h" |
64 | 31 #include "tcpfwd.h" |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
32 |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
33 cli_runopts cli_opts; /* GLOBAL */ |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
34 |
47 | 35 static void printhelp(); |
36 static void parsehostname(char* userhostarg); | |
68
eee77ac31ccc
cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
37 #ifdef ENABLE_CLI_PUBKEY_AUTH |
47 | 38 static void loadidentityfile(const char* filename); |
39 #endif | |
64 | 40 #ifdef ENABLE_CLI_ANYTCPFWD |
41 static void addforward(char* str, struct TCPFwdList** fwdlist); | |
42 #endif | |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
43 |
47 | 44 static void printhelp() { |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
45 |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
46 fprintf(stderr, "Dropbear client v%s\n" |
333
9341570412e5
mention a command in the help
Matt Johnston <matt@ucc.asn.au>
parents:
326
diff
changeset
|
47 "Usage: %s [options] [user@]host [command]\n" |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
48 "Options are:\n" |
47 | 49 "-p <remoteport>\n" |
258
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
50 "-l <username>\n" |
56
6f091656c100
newlines which weren't there
Matt Johnston <matt@ucc.asn.au>
parents:
47
diff
changeset
|
51 "-t Allocate a pty\n" |
6f091656c100
newlines which weren't there
Matt Johnston <matt@ucc.asn.au>
parents:
47
diff
changeset
|
52 "-T Don't allocate a pty\n" |
325
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
53 "-N Don't run a remote command\n" |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
54 "-f Run in background after auth\n" |
418
ab57ba0cb667
Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents:
412
diff
changeset
|
55 "-y Always accept remote host key if unknown\n" |
68
eee77ac31ccc
cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
56 #ifdef ENABLE_CLI_PUBKEY_AUTH |
56
6f091656c100
newlines which weren't there
Matt Johnston <matt@ucc.asn.au>
parents:
47
diff
changeset
|
57 "-i <identityfile> (multiple allowed)\n" |
47 | 58 #endif |
64 | 59 #ifdef ENABLE_CLI_LOCALTCPFWD |
181
1916df7df911
* Add references in the manpages to the dbclient manpage
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
60 "-L <listenport:remotehost:remoteport> Local port forwarding\n" |
258
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
61 "-g Allow remote hosts to connect to forwarded ports\n" |
62 | 62 #endif |
64 | 63 #ifdef ENABLE_CLI_REMOTETCPFWD |
62 | 64 "-R <listenport:remotehost:remoteport> Remote port forwarding\n" |
65 #endif | |
94
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
66 #ifdef DEBUG_TRACE |
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
67 "-v verbose\n" |
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
68 #endif |
47 | 69 ,DROPBEAR_VERSION, cli_opts.progname); |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
70 } |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
71 |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
72 void cli_getopts(int argc, char ** argv) { |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
73 |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
74 unsigned int i, j; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
75 char ** next = 0; |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
76 unsigned int cmdlen; |
68
eee77ac31ccc
cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
77 #ifdef ENABLE_CLI_PUBKEY_AUTH |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
78 int nextiskey = 0; /* A flag if the next argument is a keyfile */ |
47 | 79 #endif |
64 | 80 #ifdef ENABLE_CLI_LOCALTCPFWD |
62 | 81 int nextislocal = 0; |
82 #endif | |
64 | 83 #ifdef ENABLE_CLI_REMOTETCPFWD |
62 | 84 int nextisremote = 0; |
85 #endif | |
66
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
86 char* dummy = NULL; /* Not used for anything real */ |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
87 |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
88 /* see printhelp() for options */ |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
89 cli_opts.progname = argv[0]; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
90 cli_opts.remotehost = NULL; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
91 cli_opts.remoteport = NULL; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
92 cli_opts.username = NULL; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
93 cli_opts.cmd = NULL; |
325
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
94 cli_opts.no_cmd = 0; |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
95 cli_opts.backgrounded = 0; |
47 | 96 cli_opts.wantpty = 9; /* 9 means "it hasn't been touched", gets set later */ |
418
ab57ba0cb667
Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents:
412
diff
changeset
|
97 cli_opts.always_accept_key = 0; |
68
eee77ac31ccc
cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
98 #ifdef ENABLE_CLI_PUBKEY_AUTH |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
181
diff
changeset
|
99 cli_opts.privkeys = NULL; |
47 | 100 #endif |
64 | 101 #ifdef ENABLE_CLI_LOCALTCPFWD |
102 cli_opts.localfwds = NULL; | |
446
2cd2edfa11ee
Just use /dev/urandom since that's what everyone ends up using anyway.
Matt Johnston <matt@ucc.asn.au>
parents:
442
diff
changeset
|
103 opts.listen_fwd_all = 0; |
62 | 104 #endif |
64 | 105 #ifdef ENABLE_CLI_REMOTETCPFWD |
106 cli_opts.remotefwds = NULL; | |
62 | 107 #endif |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
108 /* not yet |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
109 opts.ipv4 = 1; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
110 opts.ipv6 = 1; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
111 */ |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
112 |
47 | 113 /* Iterate all the arguments */ |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
114 for (i = 1; i < (unsigned int)argc; i++) { |
68
eee77ac31ccc
cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
115 #ifdef ENABLE_CLI_PUBKEY_AUTH |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
116 if (nextiskey) { |
47 | 117 /* Load a hostkey since the previous argument was "-i" */ |
118 loadidentityfile(argv[i]); | |
119 nextiskey = 0; | |
120 continue; | |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
121 } |
47 | 122 #endif |
64 | 123 #ifdef ENABLE_CLI_REMOTETCPFWD |
124 if (nextisremote) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
125 TRACE(("nextisremote true")) |
64 | 126 addforward(argv[i], &cli_opts.remotefwds); |
127 nextisremote = 0; | |
128 continue; | |
129 } | |
130 #endif | |
131 #ifdef ENABLE_CLI_LOCALTCPFWD | |
132 if (nextislocal) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
133 TRACE(("nextislocal true")) |
64 | 134 addforward(argv[i], &cli_opts.localfwds); |
135 nextislocal = 0; | |
136 continue; | |
137 } | |
138 #endif | |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
139 if (next) { |
47 | 140 /* The previous flag set a value to assign */ |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
141 *next = argv[i]; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
142 if (*next == NULL) { |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
143 dropbear_exit("Invalid null argument"); |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
144 } |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
145 next = NULL; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
146 continue; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
147 } |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
148 |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
149 if (argv[i][0] == '-') { |
47 | 150 /* A flag *waves* */ |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
151 |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
152 switch (argv[i][1]) { |
418
ab57ba0cb667
Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents:
412
diff
changeset
|
153 case 'y': /* always accept the remote hostkey */ |
ab57ba0cb667
Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents:
412
diff
changeset
|
154 cli_opts.always_accept_key = 1; |
ab57ba0cb667
Add '-y' option to dbclient to accept the host key without checking
Matt Johnston <matt@ucc.asn.au>
parents:
412
diff
changeset
|
155 break; |
47 | 156 case 'p': /* remoteport */ |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
157 next = &cli_opts.remoteport; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
158 break; |
68
eee77ac31ccc
cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
159 #ifdef ENABLE_CLI_PUBKEY_AUTH |
47 | 160 case 'i': /* an identityfile */ |
134 | 161 /* Keep scp happy when it changes "-i file" to "-ifile" */ |
162 if (strlen(argv[i]) > 2) { | |
163 loadidentityfile(&argv[i][2]); | |
164 } else { | |
165 nextiskey = 1; | |
166 } | |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
167 break; |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
168 #endif |
47 | 169 case 't': /* we want a pty */ |
170 cli_opts.wantpty = 1; | |
171 break; | |
172 case 'T': /* don't want a pty */ | |
173 cli_opts.wantpty = 0; | |
174 break; | |
325
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
175 case 'N': |
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
176 cli_opts.no_cmd = 1; |
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
177 break; |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
178 case 'f': |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
179 cli_opts.backgrounded = 1; |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
180 break; |
64 | 181 #ifdef ENABLE_CLI_LOCALTCPFWD |
182 case 'L': | |
183 nextislocal = 1; | |
184 break; | |
258
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
185 case 'g': |
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
186 opts.listen_fwd_all = 1; |
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
187 break; |
64 | 188 #endif |
189 #ifdef ENABLE_CLI_REMOTETCPFWD | |
190 case 'R': | |
191 nextisremote = 1; | |
192 break; | |
193 #endif | |
66
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
194 case 'l': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
195 next = &cli_opts.username; |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
196 break; |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
197 case 'h': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
198 printhelp(); |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
199 exit(EXIT_SUCCESS); |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
200 break; |
442
d82a2a44c684
Add -u option to specify /dev/urandom instead
Matt Johnston <matt@ucc.asn.au>
parents:
418
diff
changeset
|
201 case 'u': |
446
2cd2edfa11ee
Just use /dev/urandom since that's what everyone ends up using anyway.
Matt Johnston <matt@ucc.asn.au>
parents:
442
diff
changeset
|
202 /* backwards compatibility with old urandom option */ |
442
d82a2a44c684
Add -u option to specify /dev/urandom instead
Matt Johnston <matt@ucc.asn.au>
parents:
418
diff
changeset
|
203 break; |
94
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
204 #ifdef DEBUG_TRACE |
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
205 case 'v': |
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
206 debug_trace = 1; |
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
207 break; |
c85c88500ea6
DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
208 #endif |
66
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
209 case 'F': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
210 case 'e': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
211 case 'c': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
212 case 'm': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
213 case 'D': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
214 #ifndef ENABLE_CLI_REMOTETCPFWD |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
215 case 'R': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
216 #endif |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
217 #ifndef ENABLE_CLI_LOCALTCPFWD |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
218 case 'L': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
219 #endif |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
220 case 'o': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
221 case 'b': |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
222 next = &dummy; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
223 default: |
66
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
224 fprintf(stderr, |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
225 "WARNING: Ignoring unknown argument '%s'\n", argv[i]); |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
226 break; |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
227 } /* Switch */ |
105 | 228 |
229 /* Now we handle args where they might be "-luser" (no spaces)*/ | |
230 if (next && strlen(argv[i]) > 2) { | |
231 *next = &argv[i][2]; | |
232 next = NULL; | |
233 } | |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
234 |
47 | 235 continue; /* next argument */ |
236 | |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
237 } else { |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
238 TRACE(("non-flag arg: '%s'", argv[i])) |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
239 |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
240 /* Either the hostname or commands */ |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
241 |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
242 if (cli_opts.remotehost == NULL) { |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
243 |
47 | 244 parsehostname(argv[i]); |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
245 |
47 | 246 } else { |
46
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
247 |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
248 /* this is part of the commands to send - after this we |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
249 * don't parse any more options, and flags are sent as the |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
250 * command */ |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
251 cmdlen = 0; |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
252 for (j = i; j < (unsigned int)argc; j++) { |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
253 cmdlen += strlen(argv[j]) + 1; /* +1 for spaces */ |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
254 } |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
255 /* Allocate the space */ |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
256 cli_opts.cmd = (char*)m_malloc(cmdlen); |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
257 cli_opts.cmd[0] = '\0'; |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
258 |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
259 /* Append all the bits */ |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
260 for (j = i; j < (unsigned int)argc; j++) { |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
261 strlcat(cli_opts.cmd, argv[j], cmdlen); |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
262 strlcat(cli_opts.cmd, " ", cmdlen); |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
263 } |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
264 /* It'll be null-terminated here */ |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
265 |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
266 /* We've eaten all the options and flags */ |
3bea78e1b175
Filled out a bit, with commandline support etc
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
267 break; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
268 } |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
269 } |
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
270 } |
47 | 271 |
272 if (cli_opts.remotehost == NULL) { | |
66
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
273 printhelp(); |
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
274 exit(EXIT_FAILURE); |
47 | 275 } |
276 | |
277 if (cli_opts.remoteport == NULL) { | |
278 cli_opts.remoteport = "22"; | |
279 } | |
280 | |
281 /* If not explicitly specified with -t or -T, we don't want a pty if | |
282 * there's a command, but we do otherwise */ | |
283 if (cli_opts.wantpty == 9) { | |
284 if (cli_opts.cmd == NULL) { | |
285 cli_opts.wantpty = 1; | |
286 } else { | |
287 cli_opts.wantpty = 0; | |
288 } | |
289 } | |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
290 |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
291 if (cli_opts.backgrounded && cli_opts.cmd == NULL |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
292 && cli_opts.no_cmd == 0) { |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
293 dropbear_exit("command required for -f"); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
294 } |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
295 } |
47 | 296 |
68
eee77ac31ccc
cleaning up the pubkey defines
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
297 #ifdef ENABLE_CLI_PUBKEY_AUTH |
47 | 298 static void loadidentityfile(const char* filename) { |
299 | |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
181
diff
changeset
|
300 struct SignKeyList * nextkey; |
47 | 301 sign_key *key; |
302 int keytype; | |
303 | |
304 key = new_sign_key(); | |
305 keytype = DROPBEAR_SIGNKEY_ANY; | |
306 if ( readhostkey(filename, key, &keytype) != DROPBEAR_SUCCESS ) { | |
307 | |
308 fprintf(stderr, "Failed loading keyfile '%s'\n", filename); | |
309 sign_key_free(key); | |
310 | |
311 } else { | |
312 | |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
181
diff
changeset
|
313 nextkey = (struct SignKeyList*)m_malloc(sizeof(struct SignKeyList)); |
47 | 314 nextkey->key = key; |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
181
diff
changeset
|
315 nextkey->next = cli_opts.privkeys; |
47 | 316 nextkey->type = keytype; |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
181
diff
changeset
|
317 cli_opts.privkeys = nextkey; |
47 | 318 } |
319 } | |
320 #endif | |
321 | |
322 | |
323 /* Parses a [user@]hostname argument. userhostarg is the argv[i] corresponding | |
324 * - note that it will be modified */ | |
64 | 325 static void parsehostname(char* orighostarg) { |
47 | 326 |
327 uid_t uid; | |
328 struct passwd *pw = NULL; | |
64 | 329 char *userhostarg = NULL; |
330 | |
331 /* We probably don't want to be editing argvs */ | |
332 userhostarg = m_strdup(orighostarg); | |
47 | 333 |
334 cli_opts.remotehost = strchr(userhostarg, '@'); | |
335 if (cli_opts.remotehost == NULL) { | |
336 /* no username portion, the cli-auth.c code can figure the | |
337 * local user's name */ | |
338 cli_opts.remotehost = userhostarg; | |
339 } else { | |
340 cli_opts.remotehost[0] = '\0'; /* Split the user/host */ | |
341 cli_opts.remotehost++; | |
342 cli_opts.username = userhostarg; | |
343 } | |
344 | |
345 if (cli_opts.username == NULL) { | |
346 uid = getuid(); | |
347 | |
348 pw = getpwuid(uid); | |
349 if (pw == NULL || pw->pw_name == NULL) { | |
350 dropbear_exit("Unknown own user"); | |
351 } | |
352 | |
353 cli_opts.username = m_strdup(pw->pw_name); | |
354 } | |
355 | |
356 if (cli_opts.remotehost[0] == '\0') { | |
357 dropbear_exit("Bad hostname"); | |
358 } | |
359 } | |
64 | 360 |
361 #ifdef ENABLE_CLI_ANYTCPFWD | |
362 /* Turn a "listenport:remoteaddr:remoteport" string into into a forwarding | |
363 * set, and add it to the forwarding list */ | |
364 static void addforward(char* origstr, struct TCPFwdList** fwdlist) { | |
365 | |
366 char * listenport = NULL; | |
367 char * connectport = NULL; | |
368 char * connectaddr = NULL; | |
369 struct TCPFwdList* newfwd = NULL; | |
370 char * str = NULL; | |
371 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
372 TRACE(("enter addforward")) |
64 | 373 |
411
253958302381
Revert bogus fix, make a note that the var is meant to 'leak'
Matt Johnston <matt@ucc.asn.au>
parents:
407
diff
changeset
|
374 /* We need to split the original argument up. This var |
253958302381
Revert bogus fix, make a note that the var is meant to 'leak'
Matt Johnston <matt@ucc.asn.au>
parents:
407
diff
changeset
|
375 is never free()d. */ |
64 | 376 str = m_strdup(origstr); |
377 | |
378 listenport = str; | |
379 | |
380 connectaddr = strchr(str, ':'); | |
381 if (connectaddr == NULL) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
382 TRACE(("connectaddr == NULL")) |
64 | 383 goto fail; |
384 } | |
407
ea0929224294
Fix another leak found by Klocwork
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
385 *connectaddr = '\0'; |
64 | 386 connectaddr++; |
387 | |
388 connectport = strchr(connectaddr, ':'); | |
389 if (connectport == NULL) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
390 TRACE(("connectport == NULL")) |
64 | 391 goto fail; |
392 } | |
407
ea0929224294
Fix another leak found by Klocwork
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
393 *connectport = '\0'; |
64 | 394 connectport++; |
395 | |
396 newfwd = (struct TCPFwdList*)m_malloc(sizeof(struct TCPFwdList)); | |
397 | |
398 /* Now we check the ports - note that the port ints are unsigned, | |
399 * the check later only checks for >= MAX_PORT */ | |
400 newfwd->listenport = strtol(listenport, NULL, 10); | |
401 if (errno != 0) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
402 TRACE(("bad listenport strtol")) |
64 | 403 goto fail; |
404 } | |
405 | |
406 newfwd->connectport = strtol(connectport, NULL, 10); | |
407 if (errno != 0) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
408 TRACE(("bad connectport strtol")) |
64 | 409 goto fail; |
410 } | |
411 | |
412 newfwd->connectaddr = connectaddr; | |
413 | |
414 if (newfwd->listenport > 65535) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
415 TRACE(("listenport > 65535")) |
64 | 416 goto badport; |
417 } | |
418 | |
419 if (newfwd->connectport > 65535) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
420 TRACE(("connectport > 65535")) |
64 | 421 goto badport; |
422 } | |
423 | |
424 newfwd->next = *fwdlist; | |
425 *fwdlist = newfwd; | |
426 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
134
diff
changeset
|
427 TRACE(("leave addforward: done")) |
64 | 428 return; |
429 | |
430 fail: | |
431 dropbear_exit("Bad TCP forward '%s'", origstr); | |
432 | |
433 badport: | |
434 dropbear_exit("Bad TCP port in '%s'", origstr); | |
435 } | |
436 #endif |