EN JA
RCMD(3)
RCMD(3) FreeBSD Library Functions Manual RCMD(3)

名称

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

ライブラリ

Standard C Library (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() 関数は、セキュリティ上の理由で強く推奨されます。この関数は、せいぜいローカル DNS を信頼することを必要としますが、一方、 ruserok() 関数は、全体の 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 も許可されます。

環境変数

RSH
rcmd() 関数を使用するとき、この変数は、 rsh(1) の代わりに実行するプログラムとして使用されます。

診断

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

rresvport() 関数は、成功した場合、有効で結合した (バインドした) ソケット記述子を返します。エラーの場合は、-1 を返し、失敗の理由に従ってグローバル変数 errno が設定されます。エラーコード EAGAIN は、``すべてのネットワークポートが使用されている'' ことを意味するようにオーバロードされます。

関連項目

rlogin(1), rsh(1), intro(2), 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 for IPv6, RFC3542.

歴史

ほとんどのこれらの関数は、 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 で実装されました。
March 3, 2000 FreeBSD