EN JA
RCMD(3)
RCMD(3) Linux Programmer's Manual RCMD(3)

名前

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 , int 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 , int 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(uint32_t 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_INETAF_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.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2012-04-23 Linux