rcmd, rresvport, iruserok, ruserok, rcmd_af, rresvport_af, iruserok_af,
ruserok_af - Routines renvoyant un flux de données pour une commande
invoquée à distance
Bibliothèque C standard (
libc,
-lc)
#include <netdb.h> /* Ou <unistd.h> sur certains systèmes */
int rcmd(char **restrict ahost, unsigned short inport,
const char *restrict locuser,
const char *restrict remuser,
const char *restrict cmd, int *restrict 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,
int rcmd_af(char **restrict ahost, unsigned short inport,
const char *restrict locuser,
const char *restrict remuser,
const char *restrict cmd, int *restrict fd2p,
sa_family_t af);
int rresvport_af(int *port, sa_family_t af);
int iruserok_af(const void *restrict raddr, int superuser,
const char *restrict ruser, const char *restrict luser,
sa_family_t af);
int ruserok_af(const char *rhost, int superuser,
const char *ruser, const char *luser,
sa_family_t af);
rcmd(),
rcmd_af(),
rresvport(),
rresvport_af(),
iruserok(),
iruserok_af(),
ruserok(),
ruserok_af() :
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
glibc 2.19 et antérieures :
_BSD_SOURCE
La fonction
rcmd() est utilisée par le superutilisateur pour
exécuter une commande sur une machine distante, en utilisant un
schéma d'identification basé sur des numéros de ports
privilégiés. La fonction
rresvport() renvoie un
descripteur de fichier sur un socket se trouvant dans l'espace des
numéros de ports privilégiés. Les fonctions
iruserok() et
ruserok() sont utilisées par les serveurs
pour authentifier les clients demandant un service avec
rcmd(). Les
quatre fonctions sont utilisées (entre autres) par le serveur
rshd(8).
La fonction
rcmd() recherche l'hôte
*ahost en utilisant
gethostbyname(3), puis renvoie
-1 si cet hôte n'existe
pas. Sinon,
*ahost est rempli avec le nom standard de cet hôte
et une connexion est établie avec un serveur se trouvant sur l'un des
ports bien connus
inport.
Si la connexion réussit, un socket dans le domaine Internet de type
SOCK_STREAM est renvoyé à l'appelant et est fourni
à la commande distante en guise de
stdin et
stdout. Si
fd2p est non nul, un canal auxiliaire est créé pour un
processus de contrôle, et son descripteur sera placé dans
*fd2p. Le processus de contrôle renverra les sorties de
diagnostic (numéro 2) sur ce canal, et acceptera également des
octets qu'il considérera comme des numéros de signal UNIX
à envoyer au groupe de processus de la commande. Si
fd2p est
nul, alors
stderr (sortie numéro 2 de la commande
distante) sera renvoyée sur
stdout et rien n'est prévu
pour l'envoi de signaux arbitraires au processus distant, bien que vous
puissiez y parvenir en utilisant des données hors-bande.
Le protocole est décrit en détail dans
rshd(8).
La fonction
rresvport() est utilisée pour obtenir un socket
attaché à un port privilégié. Ce socket est
utilisable ensuite pour
rcmd() et plusieurs autres fonctions. Les
numéros de ports privilégiés se trouvent dans
l'intervalle 0 à 1023. Seul un processus
privilégié (
CAP_NET_BIND_SERVICE) a le droit de
s'associer à un port privilégié. Dans
l'implémentation de la glibc, cette fonction restreint sa recherche du
port 512 au port 1023. L'argument
port est
valeur-résultat : la valeur qu'il fournit à l'appel est
utilisée comme point de départ pour une recherche circulaire de
l'intervalle de port ; au retour (en cas de réussite), il
contient le numéro de port avec lequel il a été
associé.
Les fonctions
iruserok() et
ruserok() prennent respectivement en
argument un nom ou une adresse IP d'hôte distant, deux noms
d'utilisateurs et un drapeau indiquant si l'utilisateur local est le
superutilisateur «
superuser ». Ainsi, si
l'utilisateur n'est
pas le superutilisateur, elles vérifient le
fichier
/etc/hosts.equiv. Si cela échoue, le fichier
.rhosts est recherché dans le répertoire personnel de
l'utilisateur local, afin de voir si la requête est autorisée.
Si ce fichier n'existe pas, s'il ne s'agit pas d'un fichier ordinaire, s'il
appartient à quelqu'un d'autre que l'utilisateur local ou le
superutilisateur, ou encore s'il est accessible en écriture par
quelqu'un d'autre que son propriétaire, le test échoue
automatiquement. Si la machine est listée dans le fichier
hosts.equiv, ou si les noms d'hôte et d'utilisateur distants
sont trouvés dans le fichier
.rhosts,
iruserok() et
ruserok() renvoient zéro. Sinon elles renvoient
-1. Si le
domaine local (obtenu par l'intermédiaire de
gethostname(2)) est
le même que le domaine distant, seul le nom de machine a besoin
d'être indiqué.
Si l'adresse IP de l'hôte distant est connue,
iruserok() sera
préférée à
ruserok(), car elle ne
nécessite pas d'avoir un serveur DNS digne de confiance pour le domaine
distant.
Toutes les fonctions décrites ci-dessus fonctionnent avec des sockets
IPv4 (
AF_INET). Les variantes « _af »
prennent un argument supplémentaire qui permet d'indiquer la famille
d'adresse de socket. Pour ces fonctions, l'argument
af peut être
indiqué comme
AF_INET ou
AF_INET6. De plus,
rcmd_af() permet d'utiliser
AF_UNSPEC.
La fonction
rcmd() renvoie un descripteur de socket valable si elle
réussit, sinon elle renvoie
-1 et affiche un message de
diagnostic sur sa sortie d'erreur standard.
La fonction
rresvport() renvoie un descripteur de socket valable,
attaché à une adresse privilégiée si elle
réussit. Elle renvoie
-1 sinon, et
errno contient le code
d'erreur. Le code d'erreur
EAGAIN signifie en réalité
« Tous les ports réseau sont déjà
utilisés ».
Voir ci-dessus pour des renseignements sur les valeurs renvoyées par
ruserok() et
iruserok().
Les fonctions
iruserok_af(),
rcmd_af(),
rresvport_af() et
ruserok_af() sont fournies depuis la glibc 2.2.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
rcmd(), rcmd_af() |
Sécurité des threads |
MT-Unsafe |
rresvport(), rresvport_af() |
Sécurité des threads |
MT-Safe |
iruserok(), ruserok(), iruserok_af(),
ruserok_af() |
Sécurité des threads |
MT-Safe locale |
Pas dans POSIX.1-2001. Présentes sur les BSD, Solaris et beaucoup
d'autres systèmes. Ces fonctions sont apparues dans BSD 4.2. Les
variantes « _af » sont des ajouts plus
récents, et ne sont pas présentes sur de nombreux
systèmes.
iruserok() et
iruserok_af() ne sont déclarées dans
les fichiers d'en-tête de la glibc que depuis la glibc 2.12.
rlogin(1),
rsh(1),
rexec(3),
rexecd(8),
rlogind(8),
rshd(8)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
bubu <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]