RCMD(3)

명칭
rcmd, rresvport, iruserok, ruserok, rcmd_af, rresvport_af, iruserok_sa - 리모트 명령에 스트림을 돌려주는 routine

프로그램 라이브러리
libc

서식
<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 의 인터넷 도메인의 소켓이 호출해 측에 돌려주어져 또 stdin (와)과 stdout (으)로서 리모트 명령에게 건네집니다. fd2p 하지만 0 이외인 경우는, 제어 프로세스에 추가의 채널이 설정되어 그 기술자가 *fd2p 에 거둘 수 있습니다. 제어 프로세스는, 이 채널로 명령 (유니트 2)로부터의 진단 출력을 돌려주어, 또 UNIX 시그널 번호로서 이 채널의 바이트를 받아, 명령의 프로세스 그룹에 전송 합니다. fd2p 하지만 0 인 경우는, stderr (리모트 명령의 유니트 2)(이)가 stdout (와)과 같이 작성됩니다. 임의의 시그널을 리모트 프로세스에 송신할 준비는 되지 않습니다만, 밴드외의 데이터를 사용하는 것으로 리모트 프로세스의 주목을 얻을 수 있습니다.

프로토콜의 상세한 것에 대하여는, rshd(8) (을)를 참조해 주세요.

rresvport() 함수는, 특권 인터넷 포트를 가지는 주소에 결부된 소켓을 입수하는데 사용합니다. 이 소켓은, rcmd() (이)나 그 외 몇개의 함수에서의 사용에 적절하고 있습니다. 특권 인터넷 포트는, 0 에서 1023 의 범위에 있는 것입니다. 이런 종류의 주소를 소켓에 결합할 수 있는 것은 슈퍼 유저만입니다.

iruserok() 함수와 ruserok() 함수는, gethostbyname(3) routine가 돌려주는 리모트 호스트의 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, M. Thomas, Advanced Socket API for IPv6, RFC2292. W. Stevens, M. Thomas, E. Nordmark, Advanced Socket API for IPv6, 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 그리고 실장되었습니다.