Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
/*
* shell-on -- 指定したttyでシェルを起動する
*
* 0.0: May 5, 2014 by Dai ISHIJIMA
*
* usage:
* shell-on tty [command [args]...]
*
* see also:
* /usr/src/usr.sbin/sysinstall/system.c
*/
#include
#include
#include
#include
#include
#include /* login_tty(3), -lutil */
#include
#include
int main(int argc, char *argv[])
{
int pid;
char *tty;
int fd;
int i;
char *prog;
char *shell;
char **args;
prog = argv[0];
if (argc <= 1) {
fprintf(stderr, "Usage: %s tty [command [arg]...]\n", prog);
exit(1);
}
tty = argv[1];
if ((fd = open(tty, O_RDWR)) < 0) {
fprintf(stderr, "%s: can't open %s\n", prog, tty);
exit(1);
}
close(fd);
args = (char **)calloc(argc, sizeof(char *));
if (argc <= 2) { /* オプションなし→シェル */
shell = "sh";
args[0] = "-sh";
args[1] = NULL;
}
else {
shell = argv[2];
for (i = 0; i < argc - 2; i++) {
args[i] = argv[2 + i];
}
args[i] = NULL;
}
#ifdef EBUG
fprintf(stderr, "%s: tty = %s, shell = %s\n", prog, tty, shell);
i = 0;
while (args[i] != NULL) {
fprintf(stderr, "%s\n", args[i]);
++i;
}
#endif
if ((pid = fork()) == 0) { /* 子供 */
int cfd;
int fd;
struct termios t;
ioctl(0, TIOCNOTTY, NULL);
for (cfd = 0; cfd < getdtablesize(); cfd++) {
close(cfd);
}
if ((fd = open(tty, O_RDWR)) < 0) {
exit(1);
}
ioctl(0, TIOCSCTTY, &fd);
dup2(0, 1);
dup2(0, 2);
if (login_tty(fd) < 0) {
exit(1);
}
signal(SIGTTOU, SIG_IGN);
if (tcgetattr(fd, &t) < 0) {
fprintf(stderr, "unable to get terminal attributes\n");
}
else {
t.c_cc[VERASE] = '\010';
if (tcsetattr(fd, TCSANOW, &t) < 0) {
fprintf(stderr, "unable to set terminal attributes\n");
}
}
execvp(shell, args);
fprintf(stderr, "unable to execute sh\n");
exit(1);
}
exit(0);
}
/* Local Variables: */
/* compile-command:"cc -Wall -o shell-on shell-on.c -lutil" */
/* End: */