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:
parent
d8ffc6fb25
commit
8942852cbc
@ -36,7 +36,7 @@
|
|||||||
.Nd remote shell
|
.Nd remote shell
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl 46dn
|
.Op Fl 46dnN
|
||||||
.Op Fl l Ar username
|
.Op Fl l Ar username
|
||||||
.Op Fl t Ar timeout
|
.Op Fl t Ar timeout
|
||||||
.Ar host
|
.Ar host
|
||||||
@ -87,12 +87,22 @@ By default, the remote username is the same as the local username.
|
|||||||
Authorization is determined
|
Authorization is determined
|
||||||
as in
|
as in
|
||||||
.Xr rlogin 1 .
|
.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
|
.It Fl n
|
||||||
Redirect input from the special device
|
Redirect input from the special device
|
||||||
.Pa /dev/null
|
.Pa /dev/null
|
||||||
(see the
|
(see the
|
||||||
.Sx BUGS
|
.Sx BUGS
|
||||||
section of this manual page).
|
section of this manual page). Disables
|
||||||
|
.Fl N .
|
||||||
.It Fl t Ar timeout
|
.It Fl t Ar timeout
|
||||||
Allow a
|
Allow a
|
||||||
.Ar timeout
|
.Ar timeout
|
||||||
|
@ -85,7 +85,7 @@ static char rlogin[] = "rlogin";
|
|||||||
void connect_timeout(int);
|
void connect_timeout(int);
|
||||||
char *copyargs(char * const *);
|
char *copyargs(char * const *);
|
||||||
void sendsig(int);
|
void sendsig(int);
|
||||||
void talk(int, long, pid_t, int, int);
|
void talk(int, int, long, pid_t, int, int);
|
||||||
void usage(void);
|
void usage(void);
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -94,13 +94,13 @@ main(int argc, char *argv[])
|
|||||||
struct passwd const *pw;
|
struct passwd const *pw;
|
||||||
struct servent const *sp;
|
struct servent const *sp;
|
||||||
long omask;
|
long omask;
|
||||||
int argoff, asrsh, ch, dflag, nflag, one, rem;
|
int argoff, asrsh, ch, dflag, nflag, Nflag, one, rem;
|
||||||
pid_t pid = 0;
|
pid_t pid = 0;
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
char *args, *host, *p, *user;
|
char *args, *host, *p, *user;
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
|
|
||||||
argoff = asrsh = dflag = nflag = 0;
|
argoff = asrsh = dflag = nflag = Nflag = 0;
|
||||||
one = 1;
|
one = 1;
|
||||||
host = user = NULL;
|
host = user = NULL;
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ main(int argc, char *argv[])
|
|||||||
argoff = 1;
|
argoff = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPTIONS "468Lde:l:nt:w"
|
#define OPTIONS "468LNde:l:nt:w"
|
||||||
while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != -1)
|
while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != -1)
|
||||||
switch(ch) {
|
switch(ch) {
|
||||||
case '4':
|
case '4':
|
||||||
@ -131,6 +131,10 @@ main(int argc, char *argv[])
|
|||||||
family = PF_INET6;
|
family = PF_INET6;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'N':
|
||||||
|
Nflag = 1;
|
||||||
|
nflag = 0;
|
||||||
|
break;
|
||||||
case 'L': /* -8Lew are ignored to allow rlogin aliases */
|
case 'L': /* -8Lew are ignored to allow rlogin aliases */
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'w':
|
case 'w':
|
||||||
@ -144,6 +148,7 @@ main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
nflag = 1;
|
nflag = 1;
|
||||||
|
Nflag = 0;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
timeout = atoi(optarg);
|
timeout = atoi(optarg);
|
||||||
@ -227,7 +232,7 @@ main(int argc, char *argv[])
|
|||||||
(void)ioctl(rfd2, FIONBIO, &one);
|
(void)ioctl(rfd2, FIONBIO, &one);
|
||||||
(void)ioctl(rem, FIONBIO, &one);
|
(void)ioctl(rem, FIONBIO, &one);
|
||||||
|
|
||||||
talk(nflag, omask, pid, rem, timeout);
|
talk(nflag, Nflag, omask, pid, rem, timeout);
|
||||||
|
|
||||||
if (!nflag)
|
if (!nflag)
|
||||||
(void)kill(pid, SIGKILL);
|
(void)kill(pid, SIGKILL);
|
||||||
@ -235,7 +240,7 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
int cc, wc;
|
||||||
fd_set readfrom, ready, rembits;
|
fd_set readfrom, ready, rembits;
|
||||||
@ -276,8 +281,8 @@ reread: errno = 0;
|
|||||||
if (cc == 0)
|
if (cc == 0)
|
||||||
goto reread;
|
goto reread;
|
||||||
goto rewrite;
|
goto rewrite;
|
||||||
done:
|
done: if (!Nflag)
|
||||||
(void)shutdown(rem, SHUT_WR);
|
(void)shutdown(rem, SHUT_WR);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,6 +376,6 @@ usage(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
(void)fprintf(stderr,
|
(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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user