📄 rsh.c
字号:
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 + -