|
|
1.1 root 1: static char sccsid[] = "@(#)nsh.c 4.3 (Berkeley) 5/20/83";
2:
3: # include "defs.h"
4: /*
5: nsh -c "comand to be executed"
6:
7: This pseudo-shell is executed over the network
8: as the login shell of an acount "network", no passwd.
9: It will only execute certain allowed commands.
10:
11: has these exit codes:
12: EX_USAGE = wrong # arguments to nsh
13: 9 = command you execute may not take arguments
14: 10= the execl failed
15: EX_UNAVAILABLE= could not find full path name for the command
16:
17: count is the # of arguments (= argc) allowed.
18: a count of 0 turns off the command
19: */
20:
21: struct {
22: char *app;
23: char count;
24: char *full;
25: char *full1;
26: } st[] = {
27: /* I assume these are the same for RAND */
28: "mmail", 20, "/usr/net/bin/mmail", "/usr/net/bin/mmail",
29: "mwrite", 20, "/usr/net/bin/mwrite", "/usr/net/bin/mwrite",
30: "prmail", 20, "/usr/net/bin/prmail", "/usr/net/bin/prmail",
31: # ifndef NFREECMD
32: "finger", 20, "/usr/ucb/finger", "/usr/bin/finger",
33: "lpq", 20, "/usr/ucb/lpq", "/usr/bin/lpq",
34: # ifdef FREELPR
35: "lpr", 20, "/usr/ucb/lpr", "/usr/bin/lpr",
36: # endif
37: "netlog", 20, "/usr/bin/netlog", "/usr/ucb/netlog",
38: "netq", 20, "/usr/bin/netq", "/usr/ucb/netq",
39: "ps", 20, "/bin/ps", "/usr/bin/ps",
40: "pstat", 20, "/etc/pstat", "/usr/bin/pstat",
41: "vpq", 20, "/usr/ucb/vpq", "/usr/bin/vpq",
42: "w", 20, "/usr/ucb/w", "/usr/bin/w",
43: "wc", 20, "/usr/bin/wc", "/bin/wc",
44: "who", 20, "/bin/who", "/usr/bin/who",
45: "whom", 20, "/usr/ucb/whom", "/usr/bin/whom",
46: "yank", 20, "/usr/ucb/yank", "/usr/bin/yank",
47: # endif
48: 0, 0, 0, 0
49: };
50: /* nsh -c cmd */
51: main(argc,argv)
52: char **argv; {
53: char *s, buf[500];
54: int i, flg = 0;
55: if(argc != 3){
56: fprintf(stderr,"Wrong number of arguments to nsh.\n");
57: exit(EX_USAGE);
58: }
59: s = argv[2];
60: while (*s)
61: if (*s == ';'
62: || *s == '|'
63: || *s == '&'
64: || *s == '?'
65: || *s == '*'
66: || *s == '['
67: || *s == '~'
68: || *s == '{'
69: || *s == '<'
70: || *s == '>'
71: || *s == '$'
72: || *s == '`') {
73: fprintf(stderr, "Illegal shell metacharacter in command.\n");
74: exit(9);
75: } else
76: ++s;
77: s = argv[2];
78: while(*s && *s != ' ')s++;
79: if(*s == ' ')flg++;
80: *s = 0;
81: if((i = mlookup(argv[2])) < 0){
82: fprintf(stderr,
83: "Command '%s' is not allowed if logged in as 'network'.\n",
84: argv[2]);
85: exit(11);
86: }
87: if(st[i].count == 0){
88: fprintf(stderr,
89: "The command '%s' is not allowed to have arguments.\n",argv[2]);
90: exit(9);
91: }
92: if(stat(st[i].full,buf) >= 0)
93: strcpy(buf,st[i].full);
94: else strcpy(buf,st[i].full1);
95: if(flg && st[i].count > 1){ /* some cmds don't allow parms */
96: *s = ' ';
97: strcat(buf,s);
98: }
99: /*
100: fprintf(stderr,"%s\n",buf);
101: */
102: execl(Bsh,"sh","-c",buf,0);
103: fprintf(stderr,"Execute of shell failed.\n");
104: exit(EX_UNAVAILABLE);
105: }
106: mlookup(s)
107: char *s; {
108: int i;
109: for(i = 0; st[i].app; i++)
110: if(strcmp(st[i].app,s) == 0 || strcmp(st[i].full,s) == 0
111: || strcmp(st[i].full1,s) == 0)return(i);
112: return(-1);
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.