rcmd, rresvport, iruserok, ruserok, rcmd_af, rresvport_af, iruserok_af, ruserok_af — routines for returning a stream to a remote command
#include <netdb.h> /* Or <unistd.h> on some systems */
int
rcmd( |
char **ahost, |
unsigned short inport, | |
const char *locuser, | |
const char *remuser, | |
const char *cmd, | |
int *fd2p) ; |
int
rresvport( |
int *port) ; |
int
iruserok( |
uint32_t raddr, |
int superuser, | |
const char *ruser, | |
const char *luser) ; |
int
ruserok( |
const char *rhost, |
int superuser, | |
const char *ruser, | |
const char *luser) ; |
int
rcmd_af( |
char **ahost, |
unsigned short inport, | |
const char *locuser, | |
const char *remuser, | |
const char *cmd, | |
int *fd2p, | |
sa_family_t af) ; |
int
rresvport_af( |
int *port, |
sa_family_t af) ; |
int
iruserok_af( |
const void *raddr, |
int superuser, | |
const char *ruser, | |
const char *luser, | |
sa_family_t af) ; |
int
ruserok_af( |
const char *rhost, |
int superuser, | |
const char *ruser, | |
const char *luser, | |
sa_family_t af) ; |
Note | |||||
---|---|---|---|---|---|
|
The rcmd
() function is used
by the superuser to execute a command on a remote machine
using an authentication scheme based on privileged port
numbers. The rresvport
()
function returns a file descriptor to a socket with an
address in the privileged port space. The iruserok
() and ruserok
() functions are used by servers to
authenticate clients requesting service with rcmd
(). All four functions are used by the
rshd(8) server (among
others).
The rcmd
() function looks
up the host *ahost
using gethostbyname(3),
returning −1 if the host does not exist. Otherwise,
*ahost
is set to
the standard name of the host and a connection is
established to a server residing at the well-known Internet
port inport
.
If the connection succeeds, a socket in the Internet
domain of type SOCK_STREAM
is
returned to the caller, and given to the remote command as
stdin
and stdout
. If fd2p
is nonzero, then an
auxiliary channel to a control process will be set up, and
a file descriptor for it will be placed in *fd2p
. The control process
will return diagnostic output from the command (unit 2) on
this channel, and will also accept bytes on this channel as
being UNIX signal numbers, to be forwarded to the process
group of the command. If fd2p
is 0, then the
stderr
(unit 2 of the remote
command) will be made the same as the stdout
and no provision is made for
sending arbitrary signals to the remote process, although
you may be able to get its attention by using out-of-band
data.
The protocol is described in detail in rshd(8).
The rresvport
() function
is used to obtain a socket with a privileged port bound to
it. This socket is suitable for use by rcmd
() and several other functions.
Privileged ports are those in the range 0 to 1023. Only a
privileged process (CAP_NET_BIND_SERVICE
) is allowed to bind
to a privileged port. In the glibc implementation, this
function restricts its search to the ports from 512 to
1023. The port
argument is value-result: the value it supplies to the call
is used as the starting point for a circular search of the
port range; on (successful) return, it contains the port
number that was bound to.
The iruserok
() and
ruserok
() functions take a
remote host's IP address or name, respectively, two
usernames and a flag indicating whether the local user's
name is that of the superuser. Then, if the user is
not the superuser,
it checks the /etc/hosts.equiv
file. If that lookup is
not done, or is unsuccessful, the .rhosts
in the local user's
home directory is checked to see if the request for service
is allowed.
If this file does not exist, is not a regular file, is
owned by anyone other than the user or the superuser, is
writable by anyone other than the owner, or is hardlinked
anywhere, the check automatically fails. Zero is returned
if the machine name is listed in the hosts.equiv
file, or the
host and remote username are found in the .rhosts
file; otherwise
iruserok
() and ruserok
() return −1. If the local
domain (as obtained from gethostname(2)) is the
same as the remote domain, only the machine name need be
specified.
If the IP address of the remote host is known,
iruserok
() should be used in
preference to ruserok
(), as
it does not require trusting the DNS server for the remote
host's domain.
All of the functions described above work with IPv4
(AF_INET
) sockets. The "_af"
variants take an extra argument that allows the socket
address family to be specified. For these functions, the
af
argument can be
specified as AF_INET
or
AF_INET6
. In addition,
rcmd_af
() supports the use of
AF_UNSPEC
.
The rcmd
() function returns
a valid socket descriptor on success. It returns −1 on
error and prints a diagnostic message on the standard
error.
The rresvport
() function
returns a valid, bound socket descriptor on success. It
returns −1 on error with the global value errno
set according to the reason for
failure. The error code EAGAIN
is overloaded to mean "All network ports in use."
For information on the return from ruserok
() and iruserok
(), see above.
The functions iruserok_af
(),
rcmd_af
(), rresvport_af
(), and ruserok_af
() functions are provide in glibc
since version 2.2.
For an explanation of the terms used in this section, see attributes(7).
Interface | Attribute | Value |
rcmd (), rcmd_af () |
Thread safety | MT-Unsafe |
rresvport (), rresvport_af () |
Thread safety | MT-Safe |
|
Thread safety | MT-Safe locale |
Not in POSIX.1. Present on the BSDs, Solaris, and many other systems. These functions appeared in 4.2BSD. The "_af" variants are more recent additions, and are not present on as wide a range of systems.
This page is part of release 4.07 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
$NetBSD: rcmd.3,v 1.9 1996/05/28 02:07:39 mrg Exp $ Copyright (c) 1983, 1991, 1993 The Regents of the University of California. All rights reserved. %%%LICENSE_START(BSD_4_CLAUSE_UCB) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the University of California, Berkeley and its contributors. 4. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. %%%LICENSE_END (#)rcmd.3 8.1 (Berkeley) 6/4/93 Contributed as Linux man page by David A. Holland, 970908 I have not checked whether the Linux situation is exactly the same. 2007-12-08, mtk, Converted from mdoc to man macros |