スポンサーリンク

RCMD(3) FreeBSD ライブラリ関数マニュアル RCMD(3)

名称

rcmd, rresvport, iruserok, ruserok, rcmd_af, rresvport_af, iruserok_sa − リモートコマンドにストリームを返すルーチン

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#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_long 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, int inport, const char *locuser, const char *remuser, const char *cmd, int *fd2p, int af);

int

rresvport_af(int *port, int af);

int

iruserok_sa(const void *addr, int addrlen, int superuser, const char *ruser, const char *luser);

解説

rcmd() 関数はスーパユーザが使用するもので、予約されたポート番号に基づいた 認証スキームを使用してコマンドをリモートマシンで実行します。 rresvport() 関数は、権限があるポート空間のアドレスとともにソケットの記述子を返しま す。 ruserok() 関数はサーバが使用するもので、 rcmd() を使用してサービスを 要求するクライアントを認証します。 3 つのすべての関数は同じファイルに存在 し、 rshd(8) サーバによって使用されます。

rcmd() 関数は gethostbyname(3) を使用してホスト *ahost を調べ、ホストが存 在しない場合は -1 を返します。ホストが存在する場合は、ホストの標準名に *ahost を設定し、よく知られているインターネットポート inport に存在する サーバとの接続を確立します。

接続が確立されると、タイプ SOCK_STREAM のインターネットドメインのソケット が呼び出し側に返され、また stdinstdout としてリモートコマンドに渡され ます。 fd2p が 0 以外である場合は、制御プロセスへ追加のチャンネルが設定さ れ、その記述子が *fd2p に収められます。制御プロセスは、このチャンネルでコ マンド (ユニット 2) からの診断出力を返し、また UNIX シグナル番号としてこ のチャンネルのバイトを受け取って、コマンドのプロセスグループに転送しま す。 fd2p が 0 である場合は、 stderr (リモートコマンドのユニット 2) が stdout と同じように作成されます。任意のシグナルをリモートプロセスに送信す る準備はされませんが、バンド外のデータを使用することでリモートプロセスの 注目を得ることはできます。

プロトコルの詳細については、 rshd(8) を参照してください。

rresvport() 関数は、特権インターネットポートを持つアドレスに結び付いたソ ケットを入手するのに使います。このソケットは、 rcmd() やその他いくつかの 関数での使用に適しています。特権インターネットポートは、 0 から 1023 の範 囲にあるものです。この種のアドレスをソケットに結合できるのはスーパユーザ のみです。

iruserok() 関数と ruserok() 関数は、 gethostbyname(3) ルーチンが返すリ モートホストの IP アドレスか名前、2 つのユーザ名、そしてローカルユーザの 名前がスーパユーザの名前であるかどうかを示すフラグを引数にとります。ユー ザがスーパユーザ でない場合は、 /etc/hosts.equiv ファイルをチェックしま す。この検索が実行されなかった場合、またはこの検索が成功しなかった場合 は、ローカルユーザのホームディレクトリの .rhosts をチェックし、サービスへ の要求が許可されているかどうかを確認します。

このファイルが存在しない場合や通常のファイルでない場合、またはユーザや スーパユーザ以外がこのファイルの所有者である場合、あるいは所有者以外がこ のファイルに書き込める場合、チェックは自動的にエラーとなります。マシン名 が ‘‘hosts.equiv’’ ファイルにリストされている場合、またはホストとリモート ユーザ名が ‘‘.rhosts’’ ファイルに存在する場合は 0 が返されます。その他の 場合、 iruserok() と ruserok() は -1 を返します。 gethostname(3) で入手し たローカルドメインがリモートドメインと同じである場合は、マシン名のみを指 定する必要があります。

iruserok() 関数は、セキュリティ上の理由で強く推奨されます。 ruserok() 関 数は DNS 全体を信用する必要があり、侵害される可能性がありますが、 iruserok() はせいぜいローカル DNS を信頼する必要しかありません。

‘‘_af’’ や ‘‘_sa’’ といった接尾辞のついた関数、たとえば rcmd_af(), rresvport_af() や iruserok_sa() などは、IPv6 と IPv4 ポートを扱えることを 除いて、対応する接尾辞のない関数と同じ動作をします。

‘‘_af’’ 接尾辞は、アドレスファミリ (下記参照) を指定するために使われる af 引数が加わっていることを意味しています。 af 引数の拡張は、バイナリアドレ ス引数を持たない関数に対して実装されています。バイナリアドレスの代わりに af 引数はどのアドレスファミリが必要かを指定します。

‘‘_sa’’ 接尾辞は、関数が汎用ソケットアドレスと長さを引数に持っていること を意味しています。ソケットアドレスはプロトコルに依存しないデータ構造なの で、必要に応じて IPv4 と IPv6 のソケットアドレスを渡すことができます。 sa 引数の拡張は、プロトコルに依存したバイナリアドレス引数を渡す関数に対して 実装されています。引数は、汎用的な方法でいくつものアドレスファミリをサ ポートするように、更に汎用的なアドレス構造に置き換えられる必要がありま す。

‘‘_af’’ 接尾辞も ‘‘_sa’’ 接尾辞もついていない関数は、IPv6 と IPv4 の両方 とも扱える ruserok() 関数を除いて、IPv4 のみで動作します。アドレスファミ リを切替えるには、 af 引数に AF_INET もしくは AF_INET6 を設定しなければな りません。 rcmd_af() に対しては、 PF_UNSPEC も許されます。

診断

成功した場合、 rcmd() 関数は有効なソケット記述子を返します。エラーが発生 した場合は -1 を返し、診断メッセージを標準エラーに出力します。

成功した場合、 rresvport() 関数は有効で結合したソケット記述子を返します。 エラーが発生した場合は -1 を返し、エラーの原因に従ってグローバル変数 errno が設定されます。「すべてのネットワークポートが使用されている」こと を示す場合は、エラーコード EAGAIN がオーバロードされます。

関連項目

rlogin(1), rsh(1), intro(2), rexec(3), rexecd(8), rlogind(8), rshd(8)

       W. Stevens and                        M. Thomas,                                     Advanced Socket API for IPv6,                                                                     RFC2292.
       W. Stevens,                     M. Thomas, and                                      E. Nordmark,                                                     Advanced Socket API forIPv6,             draft-ietf-ipngwg-rfc2292bis-01.txt.

歴史

これらのほとんどの関数は、 4.2BSD で登場しました。 rresvport_af() は RFC2292 で登場し、 Hydrangea IPv6 プロトコルスタックキットのために WIDE プロジェクトによって実装されました。 rcmd_af() は draft-ietf-ipngwg-rfc2292bis-01.txt で登場し、 WIDE/KAME IPv6 プロトコル スタックキットで実装されました。 iruserok_sa() は IETF の ipngwg メーリン グリストの議論で登場し、 FreeBSD 4.0 で実装されました。

FreeBSD 10.0 March 3, 2000 FreeBSD 10.0

スポンサーリンク