Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all
名前
rcmd, rresvport, iruserok, ruserok, rcmd_af, rresvport_af, iruserok_af, ruserok_af - リ モートコマンドにストリームを返す関数群
書式
#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); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): rcmd(), rcmd_af(), rresvport(), rresvport_af(), iruserok(), iruserok_af(), ruserok(), ruserok_af(): _BSD_SOURCE
説明
rcmd() 関数は、スーパーユーザーがリモートマシンでコマンドを実行する ために 用いられる。こ のとき特権ポート番号をもとにした認証スキームが 用 いられる。 rresvport() 関数は、特権ポー ト空間のアドレスを持つソケッ トの ディスクリプターを返す。 iruserok() 関数と ruserok() 関 数は、 rcmd() でサービス要求を行ったクライアントの認証を行うために サーバー が用いる関数で ある。 以上の 4 つの関数は、 rshd(8) サーバーによって (他の関数とともに) 利用される。 rcmd() rcmd() 関数は gethostbyname(3) を用いて *ahost の参照を行う。ホストが存在しない場合は -1 を返す。 見つかった場合は *ahost にホストの標準名 (standard name) をセットして、 予約され ているインターネットポート inport 経由でサーバーへの接続を確立する。 接続に成功したら、インターネットドメインに存在するタイプ SOCK_STREAM のソケットが呼び出し もとに返される。 このソケットの相手側はリモートコマンドの stdin および stdout に接続され る。 fd2p がゼロでない場合は、制御プロセスへの接続がもう一つ用意され、 そのディスクリプ ターが *fd2p にセットされる。 制御プロセスはリモートコマンドからの標準エラー出力 (unit 2) を このチャンネルに返す。 また制御プロセスはこの接続から受け取ったバイトデータを UNIX シグ ナルの番号として扱い、リモートコマンドのプロセス グループへとシグナルを送る。 fd2p がゼロ の場合は、 stderr (リモートコマンドの unit 2) は stdout と一緒にまとめられる。またこの場合 はリモートプロセスへ 任意のシグナルを送ることはできなくなる。 ただし帯域外 (out-of-band) データを用いれば、 リモートプロセスの注意を引くことはできるかもしれない。 プロトコルの詳細は rshd(8) に記述されている。 rresvport() rresvport() 関数は特権ポートにバインドされたソケットを取得するために 用いられる。 このソ ケットは rcmd() などの関数での利用に適している。 インターネットポートの特権ポートは、 0 か ら 1023 の範囲である。特権プロ セス (CAP_NET_BIND_SERVICE) だけが特権ポートをバインドする ことができ る。 glibc の実装では、この関数は特権ポートの検索範囲を 512 から 1023 までの範 囲に制限している。 port 引き数は入出力両用で使用される。呼び 出し時にこの引き数で渡された 値は特権ポートを巡回検索する際の開始ポイン トとして使用され、(成功で) 返る際にはこの引き数 にバインドされたポート 番号が格納される。 iruserok() と ruserok() iruserok() と ruserok() 関数は、まず以下の引数を取る: リモートホスト (iruserok() は IP アドレスで、 ruserok() はホスト名で指定)、 2 つのユーザー名、ローカルユーザーの名前が スーパーユーザーのものであるかどうかを示すフラグ、である。 もしユーザーがスーパーユーザー ではない場合は、これらの関数は /etc/hosts.equiv ファイルをチェックする。ファイルが見つから なかったり、 内容のチェックに失敗した場合には、 ローカルユーザーのホームディレクトリにある .rhosts ファイルをチェックして、サービス要求が許可されているかどうか調べる。 このファイルが存在しなかったり、 通常ファイル (regular file) ではなかったり、 指定ユーザー またはスーパーユーザー以外の所有だったり、 所有者以外から書き込み可能だったりした場合に は、 このチェックは自動的に失敗する。 マシンの名前が hosts.equiv にリストされていたり、 ホ ストとリモートユーザーの名前が .rhosts ファイルに書かれていた場合には 0 が返される。 それ 以外の場合には、 iruserok() と ruserok() は -1 を返す。 (gethostname(2) によって取得さ れる) ローカルドメインがリモートのドメインと同じ場合は、 マシンの名前だけを指定すればよ い。 リモートホストの IP アドレスがわかっている場合は、 ruserok() よりも iruserok()を用いる方 が良いだろう。 ruserok() はリモートホストの所属するドメインの DNS サーバーが信頼できなく ても 使用できるからである。 *_af() 版 上記で述べた関数は全て IPv4 (AF_INET) ソケットで動作する。 "_af" 版では追加の引き数があ り、この引き数でソケットアドレス ファミリーを指定できる。これらの関数では、 af 引き数には AF_INET か AF_INET6 が指定できる。 rcmd_af() では追加で AF_UNSPEC も指定できる。
返り値
rcmd() 関数は成功すると有効なソケットディスクリプターを返す。 失敗すると -1 を返し、標準 エラー出力に診断メッセージを 表示する。 rresvport() 関数は、成功するとバインドされた有効なソケットディスクリプターを返す。 失敗す ると -1 を返し、グローバル変数 errno をエラーの原因に対応する値にセットする。 エラーコード EAGAIN は、この関数においては「すべてのネットワークポートが使用中」 という意味を表す。 ruserok() と iruserok() の返り値については、上述の説明を参照。
バージョン
関数 iruserok_af(), rcmd_af(), rresvport_af(), ruserok_af() は glibc バージョン 2.2 以降で 提供されている。
準拠
POSIX.1-2001 にはない。 BSD 系、Solaris や他の多くのシステムに存在する。 これらの関数は 4.2BSD で登場した。 "_af" が付くバージョンはより最近に 追加されたもので、あまり多くのシス テムには存在しない。
バグ
iruserok() と iruserok_af() は glibc バージョン 2.12 以降のヘッダー でのみ宣言されている。
関連項目
rlogin(1), rsh(1), intro(2), rexec(3), rexecd(8), rlogind(8), rshd(8)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。