|
Lines 118-123
killchild(int signo)
Link Here
|
| 118 |
exit(1); |
118 |
exit(1); |
| 119 |
} |
119 |
} |
| 120 |
|
120 |
|
|
|
121 |
static int |
| 122 |
do_local_cmd(arglist *a) |
| 123 |
{ |
| 124 |
u_int i; |
| 125 |
int status; |
| 126 |
pid_t pid; |
| 127 |
|
| 128 |
if (a->num == 0) |
| 129 |
fatal("do_local_cmd: no arguments"); |
| 130 |
|
| 131 |
if (verbose_mode) { |
| 132 |
fprintf(stderr, "Executing:"); |
| 133 |
for (i = 0; i < a->num; i++) |
| 134 |
fprintf(stderr, " %s", a->list[i]); |
| 135 |
fprintf(stderr, "\n"); |
| 136 |
} |
| 137 |
if ((pid = fork()) == -1) |
| 138 |
fatal("do_local_cmd: fork: %s", strerror(errno)); |
| 139 |
|
| 140 |
if (pid == 0) { |
| 141 |
execvp(a->list[0], a->list); |
| 142 |
perror(a->list[0]); |
| 143 |
exit(1); |
| 144 |
} |
| 145 |
|
| 146 |
do_cmd_pid = pid; |
| 147 |
signal(SIGTERM, killchild); |
| 148 |
signal(SIGINT, killchild); |
| 149 |
signal(SIGHUP, killchild); |
| 150 |
|
| 151 |
while (waitpid(pid, &status, 0) == -1) |
| 152 |
if (errno != EINTR) |
| 153 |
fatal("do_local_cmd: waitpid: %s", strerror(errno)); |
| 154 |
|
| 155 |
do_cmd_pid = -1; |
| 156 |
|
| 157 |
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) |
| 158 |
return (-1); |
| 159 |
|
| 160 |
return (0); |
| 161 |
} |
| 162 |
|
| 121 |
/* |
163 |
/* |
| 122 |
* This function executes the given command as the specified user on the |
164 |
* This function executes the given command as the specified user on the |
| 123 |
* given host. This returns < 0 if execution fails, and >= 0 otherwise. This |
165 |
* given host. This returns < 0 if execution fails, and >= 0 otherwise. This |
|
Lines 162-168
do_cmd(char *host, char *remuser, char *
Link Here
|
| 162 |
close(pin[0]); |
204 |
close(pin[0]); |
| 163 |
close(pout[1]); |
205 |
close(pout[1]); |
| 164 |
|
206 |
|
| 165 |
args.list[0] = ssh_program; |
207 |
replacearg(&args, 0, "%s", ssh_program); |
| 166 |
if (remuser != NULL) |
208 |
if (remuser != NULL) |
| 167 |
addargs(&args, "-l%s", remuser); |
209 |
addargs(&args, "-l%s", remuser); |
| 168 |
addargs(&args, "%s", host); |
210 |
addargs(&args, "%s", host); |
|
Lines 225-232
main(int argc, char **argv)
Link Here
|
| 225 |
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
267 |
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
| 226 |
sanitise_stdfd(); |
268 |
sanitise_stdfd(); |
| 227 |
|
269 |
|
|
|
270 |
memset(&args, '\0', sizeof(args)); |
| 228 |
args.list = NULL; |
271 |
args.list = NULL; |
| 229 |
addargs(&args, "ssh"); /* overwritten with ssh_program */ |
272 |
addargs(&args, "%s", ssh_program); |
| 230 |
addargs(&args, "-x"); |
273 |
addargs(&args, "-x"); |
| 231 |
addargs(&args, "-oForwardAgent no"); |
274 |
addargs(&args, "-oForwardAgent no"); |
| 232 |
addargs(&args, "-oPermitLocalCommand no"); |
275 |
addargs(&args, "-oPermitLocalCommand no"); |
|
Lines 363-368
toremote(char *targ, int argc, char **ar
Link Here
|
| 363 |
{ |
406 |
{ |
| 364 |
int i, len; |
407 |
int i, len; |
| 365 |
char *bp, *host, *src, *suser, *thost, *tuser, *arg; |
408 |
char *bp, *host, *src, *suser, *thost, *tuser, *arg; |
|
|
409 |
arglist alist; |
| 410 |
|
| 411 |
memset(&alist, '\0', sizeof(alist)); |
| 412 |
alist.list = NULL; |
| 366 |
|
413 |
|
| 367 |
*targ++ = 0; |
414 |
*targ++ = 0; |
| 368 |
if (*targ == 0) |
415 |
if (*targ == 0) |
|
Lines 380-435
toremote(char *targ, int argc, char **ar
Link Here
|
| 380 |
tuser = NULL; |
427 |
tuser = NULL; |
| 381 |
} |
428 |
} |
| 382 |
|
429 |
|
|
|
430 |
if (tuser != NULL && !okname(tuser)) { |
| 431 |
xfree(arg); |
| 432 |
return; |
| 433 |
} |
| 434 |
|
| 383 |
for (i = 0; i < argc - 1; i++) { |
435 |
for (i = 0; i < argc - 1; i++) { |
| 384 |
src = colon(argv[i]); |
436 |
src = colon(argv[i]); |
| 385 |
if (src) { /* remote to remote */ |
437 |
if (src) { /* remote to remote */ |
| 386 |
static char *ssh_options = |
438 |
freeargs(&alist); |
| 387 |
"-x -o'ClearAllForwardings yes'"; |
439 |
addargs(&alist, "%s", ssh_program); |
|
|
440 |
if (verbose_mode) |
| 441 |
addargs(&alist, "-v"); |
| 442 |
addargs(&alist, "-x"); |
| 443 |
addargs(&alist, "-oClearAllForwardings yes"); |
| 444 |
addargs(&alist, "-n"); |
| 445 |
|
| 388 |
*src++ = 0; |
446 |
*src++ = 0; |
| 389 |
if (*src == 0) |
447 |
if (*src == 0) |
| 390 |
src = "."; |
448 |
src = "."; |
| 391 |
host = strrchr(argv[i], '@'); |
449 |
host = strrchr(argv[i], '@'); |
| 392 |
len = strlen(ssh_program) + strlen(argv[i]) + |
450 |
|
| 393 |
strlen(src) + (tuser ? strlen(tuser) : 0) + |
|
|
| 394 |
strlen(thost) + strlen(targ) + |
| 395 |
strlen(ssh_options) + CMDNEEDS + 20; |
| 396 |
bp = xmalloc(len); |
| 397 |
if (host) { |
451 |
if (host) { |
| 398 |
*host++ = 0; |
452 |
*host++ = 0; |
| 399 |
host = cleanhostname(host); |
453 |
host = cleanhostname(host); |
| 400 |
suser = argv[i]; |
454 |
suser = argv[i]; |
| 401 |
if (*suser == '\0') |
455 |
if (*suser == '\0') |
| 402 |
suser = pwd->pw_name; |
456 |
suser = pwd->pw_name; |
| 403 |
else if (!okname(suser)) { |
457 |
else if (!okname(suser)) |
| 404 |
xfree(bp); |
|
|
| 405 |
continue; |
| 406 |
} |
| 407 |
if (tuser && !okname(tuser)) { |
| 408 |
xfree(bp); |
| 409 |
continue; |
458 |
continue; |
| 410 |
} |
459 |
addargs(&alist, "-l"); |
| 411 |
snprintf(bp, len, |
460 |
addargs(&alist, "%s", suser); |
| 412 |
"%s%s %s -n " |
|
|
| 413 |
"-l %s %s %s %s '%s%s%s:%s'", |
| 414 |
ssh_program, verbose_mode ? " -v" : "", |
| 415 |
ssh_options, suser, host, cmd, src, |
| 416 |
tuser ? tuser : "", tuser ? "@" : "", |
| 417 |
thost, targ); |
| 418 |
} else { |
461 |
} else { |
| 419 |
host = cleanhostname(argv[i]); |
462 |
host = cleanhostname(argv[i]); |
| 420 |
snprintf(bp, len, |
|
|
| 421 |
"exec %s%s %s -n %s " |
| 422 |
"%s %s '%s%s%s:%s'", |
| 423 |
ssh_program, verbose_mode ? " -v" : "", |
| 424 |
ssh_options, host, cmd, src, |
| 425 |
tuser ? tuser : "", tuser ? "@" : "", |
| 426 |
thost, targ); |
| 427 |
} |
463 |
} |
| 428 |
if (verbose_mode) |
464 |
addargs(&alist, "%s", host); |
| 429 |
fprintf(stderr, "Executing: %s\n", bp); |
465 |
addargs(&alist, "%s", cmd); |
| 430 |
if (system(bp) != 0) |
466 |
addargs(&alist, "%s", src); |
|
|
467 |
addargs(&alist, "%s%s%s:%s", |
| 468 |
tuser ? tuser : "", tuser ? "@" : "", |
| 469 |
thost, targ); |
| 470 |
if (do_local_cmd(&alist) != 0) |
| 431 |
errs = 1; |
471 |
errs = 1; |
| 432 |
(void) xfree(bp); |
|
|
| 433 |
} else { /* local to remote */ |
472 |
} else { /* local to remote */ |
| 434 |
if (remin == -1) { |
473 |
if (remin == -1) { |
| 435 |
len = strlen(targ) + CMDNEEDS + 20; |
474 |
len = strlen(targ) + CMDNEEDS + 20; |
|
Lines 453-472
tolocal(int argc, char **argv)
Link Here
|
| 453 |
{ |
492 |
{ |
| 454 |
int i, len; |
493 |
int i, len; |
| 455 |
char *bp, *host, *src, *suser; |
494 |
char *bp, *host, *src, *suser; |
|
|
495 |
arglist alist; |
| 496 |
|
| 497 |
memset(&alist, '\0', sizeof(alist)); |
| 498 |
alist.list = NULL; |
| 456 |
|
499 |
|
| 457 |
for (i = 0; i < argc - 1; i++) { |
500 |
for (i = 0; i < argc - 1; i++) { |
| 458 |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
501 |
if (!(src = colon(argv[i]))) { /* Local to local. */ |
| 459 |
len = strlen(_PATH_CP) + strlen(argv[i]) + |
502 |
freeargs(&alist); |
| 460 |
strlen(argv[argc - 1]) + 20; |
503 |
addargs(&alist, "%s", _PATH_CP); |
| 461 |
bp = xmalloc(len); |
504 |
if (iamrecursive) |
| 462 |
(void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP, |
505 |
addargs(&alist, "-r"); |
| 463 |
iamrecursive ? " -r" : "", pflag ? " -p" : "", |
506 |
if (pflag) |
| 464 |
argv[i], argv[argc - 1]); |
507 |
addargs(&alist, "-p"); |
| 465 |
if (verbose_mode) |
508 |
addargs(&alist, "%s", argv[i]); |
| 466 |
fprintf(stderr, "Executing: %s\n", bp); |
509 |
addargs(&alist, "%s", argv[argc-1]); |
| 467 |
if (system(bp)) |
510 |
if (do_local_cmd(&alist)) |
| 468 |
++errs; |
511 |
++errs; |
| 469 |
(void) xfree(bp); |
|
|
| 470 |
continue; |
512 |
continue; |
| 471 |
} |
513 |
} |
| 472 |
*src++ = 0; |
514 |
*src++ = 0; |