1 static char sccsid[] = "@(#)nsh.c 4.3 (Berkeley) 05/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 } 114