REXEC.C
上传用户:better800
上传日期:2022-06-13
资源大小:1853k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

DOS

  1. /******************************************************************************
  2.     REXEC - remotely execute a UNIX command
  3.     Copyright (C) 1991 Erick Engelke
  4.     This program is free software; you can redistribute it and/or modify
  5.     it, but you may not sell it.
  6.     This program is distributed in the hope that it will be useful,
  7.     but without any warranty; without even the implied warranty of
  8.     merchantability or fitness for a particular purpose.
  9.         Erick Engelke                   or via E-Mail
  10.         Faculty of Engineering
  11.         University of Waterloo          Erick@development.watstar.uwaterloo.ca
  12.         200 University Ave.,
  13.         Waterloo, Ont., Canada
  14.         N2L 3G1
  15. ******************************************************************************/
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <time.h> /* for randomize */
  19. #include <stdlib.h>
  20. #include <conio.h> /* for getpass */
  21. #include <tcp.h>
  22. #define RSH_PORT 512
  23. char cmdbuf[ 2048 ];
  24. word cmdbuflen;
  25. char lname[ 64 ]; /* local copies if none supplied */
  26. char lpass[ 64 ];
  27. char lcmd[ 255 ];
  28. void makecmdbuf( void *err, char *name, char *pass, char *cmd )
  29. {
  30.     char *p;
  31. err = err;  /* not used */
  32.     p = cmdbuf;
  33.     *p++ = 0;
  34.     strcpy( p, name );
  35.     p = strchr( p, 0 );
  36.     strcpy( ++p, pass );
  37.     p = strchr( p, 0 );
  38.     strcpy( ++p, cmd );
  39.     p = strchr( p, 0 );
  40.     cmdbuflen = (word)(p - cmdbuf) + 1;
  41. }
  42. int rsh( char *hostname, word port, char *name, char *pass, char *cmd )
  43. {
  44.     word lport, jqpublic, count;
  45.     int status;
  46.     longword host;
  47.     char buffer[ 1024 ];
  48.     static tcp_Socket rsh_sock;
  49.     randomize();
  50.     lport = (rand() & 512) + 512; /* return 511 < port < 1024 */
  51.     if (!(host = resolve( hostname ))) {
  52. printf("Unable to resolve '%s'nabortingn", hostname );
  53. return( 2 );
  54.     }
  55.     jqpublic = 0;
  56.     if ( !name ) {
  57.         printf(" Userid   : ");
  58. gets( name = lname );
  59. if ( !*name ) {
  60.     printf( name = "JQPUBLIC");
  61.     jqpublic = 1;
  62. }
  63.     }
  64.     if ( !pass ) {
  65. if (jqpublic) pass = "";
  66. else
  67.     strcpy( pass = lpass, getpass(" Password : "));
  68.      /* copy for neatness since getpass overwrites */
  69.     }
  70.     if (!cmd) {
  71.         printf(" Command  : ");
  72.         gets( cmd = lcmd );
  73.         if ( !*cmd ) {
  74.             puts("No command givenn");
  75.             exit( 2 );
  76.         }
  77.     }
  78.     makecmdbuf( NULL, name, pass, cmd);
  79.     if (! tcp_open( &rsh_sock, lport, host, port, NULL )) {
  80. printf("Remote host unaccessible");
  81. return( 1 );
  82.     }
  83.     fprintf(stderr, "waiting for remote host to connect...r");
  84.     sock_wait_established( &rsh_sock, sock_delay, NULL, &status );
  85.     fprintf(stderr, "remote host connected, waiting verification...r");
  86.     sock_write( &rsh_sock, cmdbuf, cmdbuflen );
  87.     while (1) {
  88. sock_tick( &rsh_sock, &status );
  89. if (!sock_dataready(&rsh_sock))
  90.     continue;
  91. sock_fastread( &rsh_sock, buffer, 1 );
  92. fprintf(stderr, "                                              r");
  93. if ( *buffer == 1 )
  94.     fprintf(stdout, "RSH failed...nr");
  95. break;
  96.     }
  97.     while (1) {
  98. if (kbhit())
  99.     sock_putc( &rsh_sock, getch());
  100. sock_tick( &rsh_sock, &status );
  101. if (sock_dataready( &rsh_sock )) {
  102.     count = sock_fastread( &rsh_sock, buffer, sizeof( buffer ));
  103.     fwrite( buffer , count, 1, stdout );
  104. }
  105.     }
  106. sock_err:
  107.     switch (status) {
  108. case 1 : puts("nConnection closed");
  109.  break;
  110.         case-1 : printf("ERROR: %sn", sockerr( &rsh_sock ));
  111.  break;
  112.     }
  113.     return( (status == 1) ? 0 : 1 );
  114. }
  115. void help( void )
  116. {
  117.     puts("RSH host [username [password]] cmdstring");
  118.     puts("The values for cmdstring should be placed inside quotes");
  119.     exit( 3 );
  120. }
  121. int main( int argc, char **argv )
  122. {
  123.     char *hostname, *name, *pass, *cmd;
  124.     hostname = name = pass = cmd = NULL;
  125.     sock_init();
  126.     hostname = argv[ 1 ];
  127.     switch ( argc ) {
  128. case  5 : pass = argv[3];
  129. case  4 : name = argv[2];
  130.         case  3 : cmd = argv[ argc - 1 ];
  131.                   break;
  132.         case  2 : break;
  133. default : help();
  134.     }
  135.     exit( rsh( hostname, RSH_PORT, name, pass, cmd ));
  136.     return (0);  /* not reached */
  137. }