version 1.59, 2001/03/04 01:46:30 |
version 1.60, 2001/03/15 22:07:08 |
|
|
void do_exec_pty(Session *s, const char *command, struct passwd * pw); |
void do_exec_pty(Session *s, const char *command, struct passwd * pw); |
void do_exec_no_pty(Session *s, const char *command, struct passwd * pw); |
void do_exec_no_pty(Session *s, const char *command, struct passwd * pw); |
void do_login(Session *s, const char *command); |
void do_login(Session *s, const char *command); |
|
void do_child(Session *s, const char *command); |
|
|
void |
|
do_child(const char *command, struct passwd * pw, const char *term, |
|
const char *display, const char *auth_proto, |
|
const char *auth_data, const char *ttyname); |
|
|
|
/* import */ |
/* import */ |
extern ServerOptions options; |
extern ServerOptions options; |
extern char *__progname; |
extern char *__progname; |
|
|
#endif /* USE_PIPES */ |
#endif /* USE_PIPES */ |
|
|
/* Do processing for the child (exec command etc). */ |
/* Do processing for the child (exec command etc). */ |
do_child(command, pw, NULL, s->display, s->auth_proto, s->auth_data, NULL); |
do_child(s, command); |
/* NOTREACHED */ |
/* NOTREACHED */ |
} |
} |
if (pid < 0) |
if (pid < 0) |
|
|
do_login(s, command); |
do_login(s, command); |
|
|
/* Do common processing for the child, such as execing the command. */ |
/* Do common processing for the child, such as execing the command. */ |
do_child(command, pw, s->term, s->display, s->auth_proto, |
do_child(s, command); |
s->auth_data, s->tty); |
|
/* NOTREACHED */ |
/* NOTREACHED */ |
} |
} |
if (pid < 0) |
if (pid < 0) |
|
|
* ids, and executing the command or shell. |
* ids, and executing the command or shell. |
*/ |
*/ |
void |
void |
do_child(const char *command, struct passwd * pw, const char *term, |
do_child(Session *s, const char *command) |
const char *display, const char *auth_proto, |
|
const char *auth_data, const char *ttyname) |
|
{ |
{ |
const char *shell, *hostname = NULL, *cp = NULL; |
const char *shell, *hostname = NULL, *cp = NULL; |
|
struct passwd * pw = s->pw; |
char buf[256]; |
char buf[256]; |
char cmd[1024]; |
char cmd[1024]; |
FILE *f = NULL; |
FILE *f = NULL; |
|
|
extern char **environ; |
extern char **environ; |
struct stat st; |
struct stat st; |
char *argv[10]; |
char *argv[10]; |
|
int do_xauth = s->auth_proto != NULL && s->auth_data != NULL; |
|
|
/* login(1) is only called if we execute the login shell */ |
/* login(1) is only called if we execute the login shell */ |
if (options.use_login && command != NULL) |
if (options.use_login && command != NULL) |
|
|
get_remote_ipaddr(), get_remote_port(), get_local_port()); |
get_remote_ipaddr(), get_remote_port(), get_local_port()); |
child_set_env(&env, &envsize, "SSH_CLIENT", buf); |
child_set_env(&env, &envsize, "SSH_CLIENT", buf); |
|
|
if (ttyname) |
if (s->ttyfd != -1) |
child_set_env(&env, &envsize, "SSH_TTY", ttyname); |
child_set_env(&env, &envsize, "SSH_TTY", s->tty); |
if (term) |
if (s->term) |
child_set_env(&env, &envsize, "TERM", term); |
child_set_env(&env, &envsize, "TERM", s->term); |
if (display) |
if (s->display) |
child_set_env(&env, &envsize, "DISPLAY", display); |
child_set_env(&env, &envsize, "DISPLAY", s->display); |
if (original_command) |
if (original_command) |
child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND", |
child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND", |
original_command); |
original_command); |
|
|
if (!options.use_login) { |
if (!options.use_login) { |
if (stat(_PATH_SSH_USER_RC, &st) >= 0) { |
if (stat(_PATH_SSH_USER_RC, &st) >= 0) { |
if (debug_flag) |
if (debug_flag) |
fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, _PATH_SSH_USER_RC); |
fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, |
|
_PATH_SSH_USER_RC); |
f = popen(_PATH_BSHELL " " _PATH_SSH_USER_RC, "w"); |
f = popen(_PATH_BSHELL " " _PATH_SSH_USER_RC, "w"); |
if (f) { |
if (f) { |
if (auth_proto != NULL && auth_data != NULL) |
if (do_xauth) |
fprintf(f, "%s %s\n", auth_proto, auth_data); |
fprintf(f, "%s %s\n", s->auth_proto, |
|
s->auth_data); |
pclose(f); |
pclose(f); |
} else |
} else |
fprintf(stderr, "Could not run %s\n", _PATH_SSH_USER_RC); |
fprintf(stderr, "Could not run %s\n", |
|
_PATH_SSH_USER_RC); |
} else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) { |
} else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) { |
if (debug_flag) |
if (debug_flag) |
fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, _PATH_SSH_SYSTEM_RC); |
fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, |
|
_PATH_SSH_SYSTEM_RC); |
f = popen(_PATH_BSHELL " " _PATH_SSH_SYSTEM_RC, "w"); |
f = popen(_PATH_BSHELL " " _PATH_SSH_SYSTEM_RC, "w"); |
if (f) { |
if (f) { |
if (auth_proto != NULL && auth_data != NULL) |
if (do_xauth) |
fprintf(f, "%s %s\n", auth_proto, auth_data); |
fprintf(f, "%s %s\n", s->auth_proto, |
|
s->auth_data); |
pclose(f); |
pclose(f); |
} else |
} else |
fprintf(stderr, "Could not run %s\n", _PATH_SSH_SYSTEM_RC); |
fprintf(stderr, "Could not run %s\n", |
} else if (options.xauth_location != NULL) { |
_PATH_SSH_SYSTEM_RC); |
|
} else if (do_xauth && options.xauth_location != NULL) { |
/* Add authority data to .Xauthority if appropriate. */ |
/* Add authority data to .Xauthority if appropriate. */ |
if (auth_proto != NULL && auth_data != NULL) { |
char *screen = strchr(s->display, ':'); |
char *screen = strchr(display, ':'); |
|
if (debug_flag) { |
if (debug_flag) { |
|
fprintf(stderr, |
|
"Running %.100s add " |
|
"%.100s %.100s %.100s\n", |
|
options.xauth_location, s->display, |
|
s->auth_proto, s->auth_data); |
|
if (screen != NULL) |
fprintf(stderr, |
fprintf(stderr, |
"Running %.100s add %.100s %.100s %.100s\n", |
"Adding %.*s/unix%s %s %s\n", |
options.xauth_location, display, |
(int)(screen - s->display), |
auth_proto, auth_data); |
s->display, screen, |
if (screen != NULL) |
s->auth_proto, s->auth_data); |
fprintf(stderr, |
|
"Adding %.*s/unix%s %s %s\n", |
|
(int)(screen-display), display, |
|
screen, auth_proto, auth_data); |
|
} |
|
snprintf(cmd, sizeof cmd, "%s -q -", |
|
options.xauth_location); |
|
f = popen(cmd, "w"); |
|
if (f) { |
|
fprintf(f, "add %s %s %s\n", display, |
|
auth_proto, auth_data); |
|
if (screen != NULL) |
|
fprintf(f, "add %.*s/unix%s %s %s\n", |
|
(int)(screen-display), display, |
|
screen, auth_proto, auth_data); |
|
pclose(f); |
|
} else { |
|
fprintf(stderr, "Could not run %s\n", |
|
cmd); |
|
} |
|
} |
} |
|
snprintf(cmd, sizeof cmd, "%s -q -", |
|
options.xauth_location); |
|
f = popen(cmd, "w"); |
|
if (f) { |
|
fprintf(f, "add %s %s %s\n", s->display, |
|
s->auth_proto, s->auth_data); |
|
if (screen != NULL) |
|
fprintf(f, "add %.*s/unix%s %s %s\n", |
|
(int)(screen - s->display), |
|
s->display, screen, |
|
s->auth_proto, |
|
s->auth_data); |
|
pclose(f); |
|
} else { |
|
fprintf(stderr, "Could not run %s\n", |
|
cmd); |
|
} |
} |
} |
/* Get the last component of the shell name. */ |
/* Get the last component of the shell name. */ |
cp = strrchr(shell, '/'); |
cp = strrchr(shell, '/'); |
|
|
* Check for mail if we have a tty and it was enabled |
* Check for mail if we have a tty and it was enabled |
* in server options. |
* in server options. |
*/ |
*/ |
if (ttyname && options.check_mail) { |
if (s->ttyfd != -1 && options.check_mail) { |
char *mailbox; |
char *mailbox; |
struct stat mailstat; |
struct stat mailstat; |
|
|
mailbox = getenv("MAIL"); |
mailbox = getenv("MAIL"); |
if (mailbox != NULL) { |
if (mailbox != NULL) { |
if (stat(mailbox, &mailstat) != 0 || |
if (stat(mailbox, &mailstat) != 0 || |