rsh: introduce new option -N disabling shutdown of socket sending path.

This prevents premature disconnection of rsh session with protocol
implementation confused by "end-of-file" condition for standard
input stream. For example, modern Cisco IOS (15.x) versions
can be managed with "rsh -N" cron jobs having /dev/null as stdin.

PR:		205144
Approved by:	avg (mentor)
MFC after:	1 week
This commit is contained in:
Eugene Grosbein 2017-10-02 16:33:04 +00:00
parent d8ffc6fb25
commit 8942852cbc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=324212
2 changed files with 26 additions and 11 deletions

View File

@ -36,7 +36,7 @@
.Nd remote shell
.Sh SYNOPSIS
.Nm
.Op Fl 46dn
.Op Fl 46dnN
.Op Fl l Ar username
.Op Fl t Ar timeout
.Ar host
@ -87,12 +87,22 @@ By default, the remote username is the same as the local username.
Authorization is determined
as in
.Xr rlogin 1 .
.It Fl N
Opposite to
.Fl n
option: do not send the "end of file" (EOF) indication for input stream
to the remote host. This option makes the
.Nm
utility compatible with protocol implementations confused by receiving
EOF, like some Cisco IOS versions. Disables
.Fl n .
.It Fl n
Redirect input from the special device
.Pa /dev/null
(see the
.Sx BUGS
section of this manual page).
section of this manual page). Disables
.Fl N .
.It Fl t Ar timeout
Allow a
.Ar timeout

View File

@ -85,7 +85,7 @@ static char rlogin[] = "rlogin";
void connect_timeout(int);
char *copyargs(char * const *);
void sendsig(int);
void talk(int, long, pid_t, int, int);
void talk(int, int, long, pid_t, int, int);
void usage(void);
int
@ -94,13 +94,13 @@ main(int argc, char *argv[])
struct passwd const *pw;
struct servent const *sp;
long omask;
int argoff, asrsh, ch, dflag, nflag, one, rem;
int argoff, asrsh, ch, dflag, nflag, Nflag, one, rem;
pid_t pid = 0;
uid_t uid;
char *args, *host, *p, *user;
int timeout = 0;
argoff = asrsh = dflag = nflag = 0;
argoff = asrsh = dflag = nflag = Nflag = 0;
one = 1;
host = user = NULL;
@ -120,7 +120,7 @@ main(int argc, char *argv[])
argoff = 1;
}
#define OPTIONS "468Lde:l:nt:w"
#define OPTIONS "468LNde:l:nt:w"
while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != -1)
switch(ch) {
case '4':
@ -131,6 +131,10 @@ main(int argc, char *argv[])
family = PF_INET6;
break;
case 'N':
Nflag = 1;
nflag = 0;
break;
case 'L': /* -8Lew are ignored to allow rlogin aliases */
case 'e':
case 'w':
@ -144,6 +148,7 @@ main(int argc, char *argv[])
break;
case 'n':
nflag = 1;
Nflag = 0;
break;
case 't':
timeout = atoi(optarg);
@ -227,7 +232,7 @@ main(int argc, char *argv[])
(void)ioctl(rfd2, FIONBIO, &one);
(void)ioctl(rem, FIONBIO, &one);
talk(nflag, omask, pid, rem, timeout);
talk(nflag, Nflag, omask, pid, rem, timeout);
if (!nflag)
(void)kill(pid, SIGKILL);
@ -235,7 +240,7 @@ main(int argc, char *argv[])
}
void
talk(int nflag, long omask, pid_t pid, int rem, int timeout)
talk(int nflag, int Nflag, long omask, pid_t pid, int rem, int timeout)
{
int cc, wc;
fd_set readfrom, ready, rembits;
@ -276,8 +281,8 @@ reread: errno = 0;
if (cc == 0)
goto reread;
goto rewrite;
done:
(void)shutdown(rem, SHUT_WR);
done: if (!Nflag)
(void)shutdown(rem, SHUT_WR);
exit(0);
}
@ -371,6 +376,6 @@ usage(void)
{
(void)fprintf(stderr,
"usage: rsh [-46dn] [-l username] [-t timeout] host [command]\n");
"usage: rsh [-46Ndn] [-l username] [-t timeout] host [command]\n");
exit(1);
}