Функция
rcmd ();
ищет хост
Fa *ahost ,
используя
gethostbyname(3)
и возвращая -1, если хост не существует. Иначе
Fa *ahost
устанавливается равным стандартному имени хоста, при этом
создается соединение с сервером на хорошо известном порту Интернет
Fa inport .
Если соединение успешно установлено, то сокет в Интернет-домене типа SOCK_STREAM возвращается вызывающей программе и передается удаленной команде как stdin и stdout Если Fa fd2p не равно нулю, то установится вспомогательный канал управления процессами, а описатель его будет помещен в Fa *fd2p . Управление процессами возвратит диагностический выход из команды (устройства #2) в этом канале, а также примет байты в этот канал как номера сигналов UNIX для пересылки их группе процессов команды. Если Fa fd2p равно 0, то stderr (устройство #2 удаленного управления) будет работать аналогично stdout и для пересылки произвольных сигналов в удаленный процесс не будет создано никаких привилегий, хотя Вы сможете привлечь к себе внимание, используя данные "out-of-band".
Протокол подробно описан в rshd(8).
Функция
rresvport ();
используется для получения сокета с привилегированным адресом,
"привязанным" к нему. Этот сокет подходит для его использования функцией
rcmd ();
и некоторыми другими. Привилегированные порты Интернет -
это порты с номерами от нуля до 1023-х. Только суперпользователь может
"привязать" адрес с таким номером к сокету.
Функции
iruserok ();
и
ruserok ();
берут соответственно IP-адрес или имя удаленного хоста,
два имени пользователя и флаг, указывающий, является ли имя локального
пользователя именем суперпользователя.
Далее, если пользователь
НЕ
является суперпользователем, они проверяют файл
/etc/hosts.equiv
Если этот поиск не выполняется или выполнен неудачно, то проверяется
.rhosts
в домашнем каталоге пользователя (для получения информации о том,
разрешен ли данный сервис пользователю или нет).
Если этот файл не существует, не является простым файлом, если его владельцем
является не текущий пользователь или не суперпользователь
или если он недоступен для записи текущему пользователю,
проверка завершается появлением ошибки.
Если имя машины указано в файле
``hosts.equiv
''
или если хост и имя пользователя для удаленного доступа найдены в файле
``.rhosts
''
то возвращается 0; иначе
iruserok ();
и
ruserok ();
возвращают -1.
Если имя локального домена (полученное от
gethostname(2))
является именем удаленного домена, то может указываться только имя машины.
Если IP-адрес удаленного хоста известен, то должно использоваться
iruserok ();
вместо
ruserok (,);
так как последнее не требует проверки DNS-сервера для домена удаленного хоста.
Функция
rresvport ();
возвращает правильный связанный описатель сокета при успешном завершении работы.
При ошибках возвращается -1 и в глобальную переменную
errno
записывается код ошибки.
Код ошибки
EAGAIN:
при "переполнении" она означает: "Все сетевые порты заняты".
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |