NOMBRE¶
rcmd, rresvport, iruserok, ruserok - Funciones que devuelven un flujo (stream)
hacia una orden remota
SINOPSIS¶
#include <unistd.h>
int rcmd(char **ahost, int inport, const char
*locuser, const char *remuser, const char
*cmd, int *fd2p)
int rresvport(int *port)
int iruserok(u_int32_t raddr, int superuser,
const char *ruser, const char *luser)
int ruserok(const char *rhost, int superuser,
const char *ruser, const char *luser)
DESCRIPCIÓN¶
La función
rcmd es utilizada por el superusuario para ejecutar una
orden en una máquina remota usando un esquema de autenticación
basado en números de puertos reservados. La función
rresvport devuelve el descriptor de un enchufe (socket) cuya
dirección cae dentro del espacio de puertos privilegidados. Los
servidores utilizan las funciones
iruserok y
ruserok para
autenticar a los clientes que solicitan servicios mediante
rcmd. Estas
cuatro funciones se encuentran en el mismo fichero y son usadas por el
servidor
rshd(8) (entre otros).
La función
rcmd busca al anfitrión (host)
*ahost
usando
gethostbyname(3), devolviendo -1 si el anfitrión no
existe. En caso contrario, se asigna a
*ahost el nombre estándar
del anfitrión y se establece una conexión con el servidor que
reside en el, bien definido, puerto de Internet
inport.
Si la conexión tiene éxito, se devuelve al invocador un socket
dentro del dominio de Internet del tipo
SOCK_STREAM, y dicho socket se
convierte en la
entrada estándar (stdin) y la
salida
estándar (stdout) de la orden remota. Si
fd2p no es cero, se
creará un canal auxiliar hacia un proceso de control y en
*fd2p
se colocará un descriptor para dicho canal. El proceso de control
devolverá la salida de error (descriptor de fichero número 2) de
la orden remota sobre este canal, y también aceptará sobre este
canal el envío de bytes que se comportarán como números
de señal de
UNIX para ser enviados al grupo de procesos de la
orden. Si
fd2p es 0, entonces la
salida de error estándar
(stderr) (descriptor de fichero número 2 de la orden remota)
coincidirán con la
salida estándar (stdout) y no
habrá forma de enviar señales arbitrarias al proceso remoto,
aunque podrá llamar su atención usando datos "fuera de
orden" (out-of-band).
El protocolo se describe con detalle en
rshd(8).
La función
rresvport se utiliza para obtener un socket que tenga
una dirección privilegiada ligada a él. Este socket es adecuado
para ser usado por
rcmd y otras funciones diversas. Los puertos de
Internet privilegiados son aquellos que van de 0 a 1023. Sólo el
superusuario puede ligar una dirección de este tipo a un socket.
Las funciones
iruserok y
ruserok toman la dirección IP o el
nombre de un anfitrión remoto, respectivamente, dos nombres de usuario
y una bandera que indica si el nombre del usuario local es o no el del
superusuario. A continuación, si el usuario
NO es el
superusuario, comprueba el fichero
/etc/hosts.equiv. Si dicha
búsqueda no se realiza o no tiene éxito, se comprueba el fichero
.rhosts en el directorio raíz (home) del usuario local para ver
si se permite la petición de servicio.
Si el fichero no existe, no es un fichero regular, pertenece a alguien que no es
el usuario ni el superusuario, o puede ser escrito por alguien que no sea el
propietario, la comprobación fracasa automáticamente. Si el
nombre de la máquina aparece en el fichero
hosts.equiv o si el
anfitrión y el nombre del usuario remoto se encuentran en el fichero
.rhosts, se devuelve un 0; en caso contrario
iruserok y
ruserok devuelven -1. Si el dominio local (como se obtiene de
gethostname(2)) es el mismo que el dominio remoto, sólo se
necesita especificar el nombre de la máquina.
Si se conoce la dirección IP del anfitrión remoto, preferentemente
se debe usar
iruserok en lugar de
ruserok, ya que no necesita
consultar al servidor DNS para el dominio del anfitrión remoto.
ERRORES¶
La función
rcmd devuelve un descriptor válido de socket en
caso de éxito. Devuelve -1 en caso de error y muestra un mensaje de
error en la salida de error estándar.
La función
rresvport devuelve un descriptor de socket
válido, y ya ligado, en caso de éxito. Devuelve -1 en caso de
error y asigna a
errno un valor que indica la razón del fallo.
Se sobrecarga el significado del código de error
EAGAIN para
indicar que ``Todos los puertos de red están en uso.''
VÉASE TAMBIÉN¶
rlogin(1),
rsh(1),
intro(2),
rexec(3),
rexecd(8),
rlogind(8),
rshd(8)
HISTORIA¶
Estas funciones aparecieron en 4.2BSD.