diff options
Diffstat (limited to 'examples/rpcclient/ntsd.c')
-rw-r--r-- | examples/rpcclient/ntsd.c | 259 |
1 files changed, 0 insertions, 259 deletions
diff --git a/examples/rpcclient/ntsd.c b/examples/rpcclient/ntsd.c deleted file mode 100644 index 37976edaa5..0000000000 --- a/examples/rpcclient/ntsd.c +++ /dev/null @@ -1,259 +0,0 @@ -/* This is an experiemental programme to shutdown a group of NTws in a - Samba domain via rpcclient. - - Copyright (c) David Bannon 1999 - David Bannon, D.Bannon@latrobe.edu.au, 4th November, 1999 - - Full permission is granted to use this code (for what that is worth) in - any way you wish, strictly at your own risk. - - I use it from a cron a job to close a computer lab down at 5:00 pm. - - It has some serious security implications, make sure you understand - them before using this code ! - - If you find a way to make this 'power down' a machine that is set up to - do power down correctly please let me know !! - - Machines to be shutdown must be members of a samba (or NT) domain. - You are going to have to offer your domain admin user name/password - (see below). - - As you probably don't want your domain admin password appearing in the - crontab file or popping up in a 'ps' list, it can be encrypted and the - programme will tell you what it should look like. i.e : - - [root@bclab shutdown]# ./ntsd -e - Domain Admin User name :dbannon - Domain Admin Password - Use the string between [] after a -p : [1HCeTcXqOfo7R[hg] - [root@bclab shutdown]# - - Now a crontab entry would look like this : - - 00 17 * * 1-5 /usr/local/sbin/ntsd -p'1HCeTcXqOfo7R[hg' -a - - The -p indicates passwd (actually user name and password) and the - -a says shutdown all machines. Note that the password string must - have inverted commas around it so the shell does not try and expand - any special charachers that it is likely to contain. - - Security Alert !! - The encryption is pretty weak and its reversable ! Change the key - strings, compile and change the key strings again ! You don't need - to remember the key but if you leave the unchanged source around - someone may use it to reverse the encryption. The Keys are in lumps - to stop someone doing a 'cat ntsd' and seeing the key string. - (yeah, I know its not very clever, but they should not be able to - read the binary or your crontab anyway) - - Ping - I ping the target machines before trying to shut them down, you - dont't need to, just let rpcclient time out. If you want to ping - first (because its nicer !) you need : - 1. First element of IP name should be the netbios name. (makes sense) - 2. If the server you will run the cron job from does not have the - same default domain name as machines being shutdown then you will - need to define USE_DOMAIN and put in appropriate ip domain info. - This code does ping, get busy with vi if you don't want to. - - Machine Names - For this system to be practical, the machine names must be in some - sort of sequence, ie bclab1, bclab2, bclab3, not more creative like - grumpy, dopey, sneezy. See the code in main() to see how the names - are built. - - Configuration - - Machine Names - If you have used a naming scheme like mine then you may need to - change only LASTMACHINE and PREFIX, otherwise look at main(). - - Binary locations. - We need to find the rpcclient and ping binaries. The values below - are typical. Better check first. - - Compile - Known to compile cleanly on linux (RH5.0 - RH6.1) and DEC 4.0. Does - not do anything fancy so should compile on most systems easily - enough. - - Install - Rename the binary (ie ntsd) and put it somewhere safe. It should - be rwx root only. Comes up with basic help if run without command - line switch, prompts for admin user name and password if used - without the -p switch. - (Typically)Put entry in your crontab (crontab -e) and watch the - fun. Remember, it does not keep them shutdown, try an entry every - 5 minutes for a while (or until door is locked). -*/ - - -#include<stdio.h> -#include<stdlib.h> -#include<unistd.h> -#include<pwd.h> - -#define PING "/bin/ping" -#define RPCCLIENT "/usr/local/samba/bin/rpcclient" - - -#define LASTMACHINE 14 /* ie, scans bclab1 through to bclab14 */ -#define PREFIX "bclab" - -/* #define USE_DOMAIN Only if you need full ip name to ping machines */ - -#ifdef USE_DOMAIN -#define DOMAIN ".biochem.latrobe.edu.au" /* required by ping, possibly. - */ -#endif - -#define KEY1 "Please" -#define KEY2 "don't leave" -#define KEY3 "this" -#define KEY4 "as it is" -#define KEY5 "here" -#define KEY6 "silly." - - -int Shutdown(char *machine, char *PassWord) { - char Buff[128], *Ptr; - int Res; - /* printf("Shutting down %s\n", machine); */ - sprintf(Buff, "/bin/ping -c 1 -q %s > /dev/null", machine); - Res = system(Buff); - if (Res == 0) { /* its turned on */ - Ptr = machine; - /* first 'word' in ip name = netbios name, get rid of rest */ - while (*++Ptr != 0) if (*Ptr == '.') *Ptr = 0; - printf("Shutting down %s\n", machine); - sprintf(Buff, "%s -c shutdown -U%s -S %s", RPCCLIENT, PassWord, -machine); - system(Buff); - } -} - -int Usage(char *prog) { - printf("Programme to shutdown NTs in domain.\n"); - printf("Normally called from cron (using encrypted passwd, see -e and --p).\n"); - printf("Usage \n"); - printf(" -a shutdown all machines %s1 to %s%d. \n", - PREFIX, PREFIX, LASTMACHINE); - printf(" -m machine shutdown [machine] (might need full ip -name).\n"); - printf(" -e tell me my encrypted name and password to -use with -p.\n"); - printf(" -p'pw_string' use encrypted name & password as given by --e.\n"); - printf(" You must have single inverted commas around -the pw string !"); - printf(" -h help, give this message.\n"); - printf("Typical cron line : 00 17 * * 1-5 /usr/local/sbin/ntsd --p1HCeTcXqOfo7R[hg -a\n"); - printf(" David Bannon, -Nov 1999\n"); - exit(0); -} - -int GetPassWord(char *Passwd) { - char *ptr, *p; - char User[128]; - printf("Domain Admin User name :"); - fgets(User, 127, stdin); - if (strlen(User) < 3) { - printf("Short user name, exiting.\n"); - exit(1); - } - p = User; - while (*p != '\n') p++; /* get rid of newline */ - *p = 0; - ptr = getpass("Domain Admin Password "); - if (strlen(ptr) < 3) { - printf("Short password, exiting.\n"); - exit(1); - } - strcpy(Passwd, User); /* do this with sprintf */ - strcat(Passwd, "%"); - strcat(Passwd, ptr); - *ptr = 0; /* clean up system buffer */ - return 0; -} - -int Encrypt(char *InPass) { - char Pass[128], Enc[128]; - int Temp; - char *Hash; - int Offset = 0; - Hash = malloc(256); - /* so it a bit harder than just 'cat ntsd' */ - sprintf(Hash, "%s%s%s%s%s%s", KEY4, KEY3, KEY2, KEY5, KEY1, KEY6); - if (InPass == 0) { - GetPassWord(Pass); /* may not return */ - while (*(Pass + Offset) != 0) { - Temp = *(Pass + Offset) + *(Hash + Offset) - ' '; - if (Temp > '~') Temp = Temp - 95; - *(Pass+Offset++) = Temp; - } - printf("Use the string between [] after a -p : ['%s']\n", Pass); - exit(0); - } else { - while (*(InPass + Offset) != 0) { - Temp = *(InPass + Offset) - *(Hash + Offset) + ' '; - if (Temp < ' ') Temp = Temp + 95; - *(InPass+Offset++) = Temp; - } - } - free(Hash); - return 0; -} - -int main(int argc, char **argv) { - extern char *optarg; - extern int optind; - int Ch; - static char *prog_name; - int MachineNo = 0, AllMachines = 0; - char Machine[128], PassWord[128]; - uid_t UID = getuid(); - prog_name = argv[0]; - if (UID != 0) { - printf("Sorry, this programme can only be run as root.\n"); - exit(1); - } - *Machine = 0; - *PassWord = 0; - if (argc < 2) Usage(prog_name); - while ((Ch = getopt(argc, argv, "haem:p:")) != EOF) { - switch(Ch) { - case 'e': Encrypt(NULL); break; /* Does not return */ - case 'a': AllMachines = 1; break; - case 'm': strcpy(Machine, optarg); break; - case 'p': strcpy(PassWord, optarg); break; - case 'h': Usage(prog_name); - default: Usage(prog_name); - } - } - if (*PassWord == 0) GetPassWord(PassWord); /* may not return */ - else Encrypt(PassWord); - if (*Machine != 0) { - Shutdown(Machine, PassWord); - exit(0); - } - /* printf("exit for safety = %s.\n", PassWord); -exit(0); */ - while (++MachineNo < LASTMACHINE+1) { - pid_t Proc; -#ifdef USE_DOMAIN - sprintf(Machine, "%s%d%s", PREFIX, MachineNo, DOMAIN); -#else - sprintf(Machine, "%s%d", PREFIX, MachineNo); -#endif - Proc = fork(); - if (Proc == 0) { /* in child process */ - Shutdown(Machine, PassWord); - exit(0); - } - } - printf("Shutdowns initiated.\n"); -} |