⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsh.c

📁 inetutils 1.5的rsh源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    error (1, 0, "shell/tcp: unknown service");#if defined (KERBEROS) || defined(SHISHI) try_connect:  if (use_kerberos)    {      struct hostent *hp;      /* fully qualify hostname (needed for krb_realmofhost) */      hp = gethostbyname(host);      if (hp != NULL && !(host = strdup (hp->h_name)))	error (1, errno, "strdup");#if defined (KERBEROS)       rem = KSUCCESS;      errno = 0;      if (dest_realm == NULL)	dest_realm = krb_realmofhost (host);#elif defined (SHISHI)      rem = SHISHI_OK;      errno = 0;#endif#ifdef ENCRYPTION      if (doencrypt)#if defined(SHISHI)	{	  int i;	  char * term;	  	  term = (char *)xmalloc (strlen(args)+4);	  strcpy (term, "-x ");	  strcat (term, args);	  	  rem = krcmd_mutual (&h, &host, sp->s_port, &user, term, &rfd2,			      dest_realm, &enckey);	  if (rem > 0)	    {	      keytype = shishi_key_type (enckey);	      keylen = shishi_cipher_blocksize (keytype);		      	      ivtab[0] = &iv1;	      ivtab[1] = &iv2;	      ivtab[2] = &iv3;	      ivtab[3] = &iv4;	      for (i=0; i<4; i++)		{		  ivtab[i]->ivlen = keylen;	     		  switch (keytype)		    {		    case SHISHI_DES_CBC_CRC:		    case SHISHI_DES_CBC_MD4:		    case SHISHI_DES_CBC_MD5:		    case SHISHI_DES_CBC_NONE:		    case SHISHI_DES3_CBC_HMAC_SHA1_KD:		      ivtab[i]->keyusage = SHISHI_KEYUSAGE_KCMD_DES;		      ivtab[i]->iv = malloc (ivtab[i]->ivlen);		      memset (ivtab[i]->iv, 2*i + 1*(i<2) - 4*(i>=2), ivtab[i]->ivlen);		      ivtab[i]->ctx = shishi_crypto (h, enckey, ivtab[i]->keyusage, shishi_key_type (enckey),						     ivtab[i]->iv, ivtab[i]->ivlen);		      break;		    case SHISHI_ARCFOUR_HMAC:		    case SHISHI_ARCFOUR_HMAC_EXP:		      ivtab[i]->keyusage = SHISHI_KEYUSAGE_KCMD_DES + 2 + 4*i;		      ivtab[i]->ctx = shishi_crypto (h, enckey, ivtab[i]->keyusage, shishi_key_type (enckey),						     NULL, 0);		      break;		    default :  		      ivtab[i]->keyusage = SHISHI_KEYUSAGE_KCMD_DES + 2 + 4*i;		      ivtab[i]->iv = malloc (ivtab[i]->ivlen);		      memset (ivtab[i]->iv, 0, ivtab[i]->ivlen);		      ivtab[i]->ctx = shishi_crypto (h, enckey, ivtab[i]->keyusage, shishi_key_type (enckey),						     ivtab[i]->iv, ivtab[i]->ivlen);		    }		}	    }	  free (term);	}      else#else	rem = krcmd_mutual (&host, sp->s_port, user, args, &rfd2,			    dest_realm, &cred, schedule);      else#endif#endif	rem = krcmd (#if defined (SHISHI)		     &h, &host, sp->s_port, &user, args, &rfd2, dest_realm);#else	             &host, sp->s_port, user, args, &rfd2, dest_realm);#endif      if (rem < 0)	{	  use_kerberos = 0;	  sp = getservbyname ("shell", "tcp");	  if (sp == NULL)	    error (1, 0, "shell/tcp: unknown service");	  if (errno == ECONNREFUSED)	    warning ("remote host doesn't support Kerberos");	  if (errno == ENOENT)	    warning ("can't provide Kerberos auth data");	  goto try_connect;	}    }  else    {      if (!user)	  user = pw->pw_name;      if (doencrypt)	error (1, 0, "the -x flag requires Kerberos authentication");      rem = rcmd (&host, sp->s_port, pw->pw_name, user, args, &rfd2);    }#else  if (!user)     user = pw->pw_name;  rem = rcmd (&host, sp->s_port, pw->pw_name, user, args, &rfd2);#endif  if (rem < 0)    exit (1);  if (rfd2 < 0)    error (1, 0, "can't establish stderr");  if (dflag)    {      int one = 1;      if (setsockopt (rem, SOL_SOCKET, SO_DEBUG, (char *) &one,		      sizeof one) < 0)	error (0, errno, "setsockopt");      if (setsockopt (rfd2, SOL_SOCKET, SO_DEBUG, (char *) &one,		      sizeof one) < 0)	error (0, errno, "setsockopt");    }  seteuid (uid);  setuid (uid);#ifdef HAVE_SIGACTION  sigemptyset (&sigs);  sigaddset (&sigs, SIGINT);  sigaddset (&sigs, SIGQUIT);  sigaddset (&sigs, SIGTERM);  sigprocmask (SIG_BLOCK, &sigs, &osigs);#else  sigs = sigmask (SIGINT) | sigmask (SIGQUIT) | sigmask (SIGTERM);  osigs = sigblock (sigs);#endif  if (signal (SIGINT, SIG_IGN) != SIG_IGN)    signal (SIGINT, sendsig);  if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)    signal (SIGQUIT, sendsig);  if (signal (SIGTERM, SIG_IGN) != SIG_IGN)    signal (SIGTERM, sendsig);  if (!nflag)    {      pid = fork ();      if (pid < 0)	error (1, errno, "fork");    }#if defined(KERBEROS) || defined(SHISHI)#ifdef ENCRYPTION  if (!doencrypt)#endif#endif    {      int one = 1;      ioctl (rfd2, FIONBIO, &one);      ioctl (rem, FIONBIO, &one);    }  talk (nflag, &osigs, pid, rem);#ifdef SHISHI  if (use_kerberos)    {      int i;            shishi_done (h);#ifdef ENCRYPTION      if (doencrypt)	{	  shishi_key_done (enckey);	  for (i = 0; i < 4; i++)	    {	      shishi_crypto_close (ivtab[i]->ctx);	      free (ivtab[i]->iv);	    }	  	}#endif    }#endif  if (!nflag)    kill (pid, SIGKILL);  return 0;}voidtalk (int nflag, sigset_t *osigs, pid_t pid, int rem){  int cc, wc;  fd_set readfrom, ready, rembits;  char *bp, buf[BUFSIZ];  if (!nflag && pid == 0)    {      close (rfd2);    reread:      errno = 0;      if ((cc = read (STDIN_FILENO, buf, sizeof buf)) <= 0)	goto done;      bp = buf;    rewrite:      FD_ZERO (&rembits);      FD_SET (rem, &rembits);      if (select (rem + 1, 0, &rembits, 0, 0) < 0)	{	  if (errno != EINTR)	    error (1, errno, "select");	  goto rewrite;	}      if (!FD_ISSET (rem, &rembits))	goto rewrite;#ifdef ENCRYPTION#ifdef KERBEROS      if (doencrypt)	wc = des_write (rem, bp, cc);      else#elif defined(SHISHI)	if (doencrypt)     writeenc (h, rem, bp, cc, &wc, &iv3, enckey, 2);     else#endif#endif	wc = write (rem, bp, cc);      if (wc < 0)	{	  if (errno == EWOULDBLOCK)	    goto rewrite;	  goto done;	}      bp += wc;      cc -= wc;      if (cc == 0)	goto reread;      goto rewrite;    done:      shutdown (rem, 1);      exit (0);    }#ifdef HAVE_SIGACTION  sigprocmask (SIG_SETMASK, osigs, NULL);#else  sigsetmask (*osigs);#endif  FD_ZERO (&readfrom);  FD_SET (rfd2, &readfrom);  FD_SET (rem, &readfrom);  do    {      int maxfd = rem;      if (rfd2 > maxfd)	maxfd = rfd2;      ready = readfrom;      if (select (maxfd + 1, &ready, 0, 0, 0) < 0)	{	  if (errno != EINTR)	    error (1, errno, "select");	  continue;	}      if (FD_ISSET (rfd2, &ready))	{	  errno = 0;#ifdef KERBEROS#ifdef CRYPT	  if (doenencryption)	    cc = des_read (rfd2, buf, sizeof buf);	  else#endif#elif defined(SHISHI) && defined(ENCRYPTION)	    if (doencrypt)	      readenc (h, rfd2, buf, &cc, &iv2, enckey, 2);	  else#endif	    cc = read (rfd2, buf, sizeof buf);	  if (cc <= 0)	    {	      if (errno != EWOULDBLOCK)		FD_CLR (rfd2, &readfrom);	    }	  else	    write (2, buf, cc);	}      if (FD_ISSET (rem, &ready))	{	  errno = 0;#ifdef KERBEROS#ifdef ENCRYPTION	  if (doencrypt)	    cc = des_read (rem, buf, sizeof buf);	  else#endif#elif defined(SHISHI) && defined(ENCRYPTION)	    if (doencrypt)	      readenc (h, rem, buf, &cc, &iv1, enckey, 2);	  else#endif	    cc = read (rem, buf, sizeof buf);	  if (cc <= 0)	    {	      if (errno != EWOULDBLOCK)		FD_CLR (rem, &readfrom);	    }	  else	    write (1, buf, cc);	}    } while (FD_ISSET (rfd2, &readfrom) || FD_ISSET (rem, &readfrom));}voidsendsig (int sig){  char signo;  int n;  signo = sig;#ifdef KERBEROS#ifdef ENCRYPTION  if (doencrypt)    des_write (rfd2, &signo, 1);  else#endif#elif defined(SHISHI) && defined (ENCRYPTION)	if (doencrypt)     writeenc (h, rfd2, &signo, 1, &n, &iv4, enckey, 2);     else#endif    write (rfd2, &signo, 1);}#if defined(KERBEROS) || defined(SHISHI)/* VARARGS */voidwarning (const char * fmt, ...){  va_list ap;  fprintf (stderr, "%s: warning, using standard rsh: ", program_name);  va_start (ap, fmt);  fmt = va_arg (ap, char *);  vfprintf (stderr, fmt, ap);  va_end (ap);  fprintf (stderr, ".\n");}#endifchar *copyargs (char **argv){  int cc;  char **ap, *args, *p;  cc = 0;  for (ap = argv; *ap; ++ap)    cc += strlen (*ap) + 1;  if (!(args = malloc ((u_int)cc)))    error (1, errno, "copyargs");  for (p = args, ap = argv; *ap; ++ap)    {      strcpy (p, *ap);      for (p = strcpy (p, *ap); *p; ++p);      if (ap[1])	*p++ = ' ';    }  return args;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -