Commit | Line | Data |
---|---|---|
ec0ada2d | 1 | static char sccsid[] = "@(#)nsh.c 4.3 (Berkeley) %G%"; |
b61bafb6 KM |
2 | |
3 | # include "defs.h" | |
b61bafb6 KM |
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 | |
b61bafb6 | 32 | "finger", 20, "/usr/ucb/finger", "/usr/bin/finger", |
ec0ada2d | 33 | "lpq", 20, "/usr/ucb/lpq", "/usr/bin/lpq", |
b61bafb6 | 34 | # ifdef FREELPR |
ec0ada2d | 35 | "lpr", 20, "/usr/ucb/lpr", "/usr/bin/lpr", |
b61bafb6 KM |
36 | # endif |
37 | "netlog", 20, "/usr/bin/netlog", "/usr/ucb/netlog", | |
b61bafb6 | 38 | "netq", 20, "/usr/bin/netq", "/usr/ucb/netq", |
b61bafb6 | 39 | "ps", 20, "/bin/ps", "/usr/bin/ps", |
ec0ada2d | 40 | "pstat", 20, "/etc/pstat", "/usr/bin/pstat", |
b61bafb6 KM |
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", | |
b61bafb6 KM |
44 | "who", 20, "/bin/who", "/usr/bin/who", |
45 | "whom", 20, "/usr/ucb/whom", "/usr/bin/whom", | |
b61bafb6 KM |
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]; | |
ec0ada2d DC |
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]; | |
b61bafb6 KM |
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 | */ | |
e4bc2f9c | 102 | execl(Bsh,"sh","-c",buf,0); |
b61bafb6 KM |
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 | } |