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