POSIX определяетgetpwuid
как стандартную функцию C для поиска в пользовательской базе данных идентификатора пользователя, позволяющего преобразовывать идентификатор в имя пользователя. Я скачал исходный код для GNU coreutils и вижу, что эта функция используется в их реализации таких утилит, как id
и ls
.
В качестве обучающего упражнения я написал эту быструю -и -грязную программу на языке C, чтобы она просто выполняла роль оболочки для этой функции. Имейте в виду, что я не программировал на C со времен колледжа (много лет назад )и я не собираюсь использовать это в производстве, но я решил опубликовать это здесь в качестве доказательства концепции (если кто-то хочет отредактировать, не стесняйтесь):
#include
#include /* atoi */
#include
int main( int argc, char *argv[] ) {
uid_t uid;
if ( argc >= 2 ) {
/* NB: atoi returns 0 (super-user ID) if argument is not a number) */
uid = atoi(argv[1]);
}
/* Ignore any other arguments after the first one. */
else {
fprintf(stderr, "One numeric argument must be supplied.\n");
return 1;
}
struct passwd *pwd;
pwd = getpwuid(uid);
if (pwd) {
printf("The login name for %d is: %s\n", uid, pwd->pw_name);
return 0;
}
else {
fprintf(stderr, "Invalid user ID: %d\n", uid);
return 1;
}
}
У меня не было возможности протестировать его с помощью NIS/LDAP, но я заметил, что если в /etc/passwd
есть несколько записей для одного и того же пользователя, он игнорирует все, кроме первого.
Пример использования:
$./get_user ""
The login name for 0 is: root
$./get_user 99
Invalid user ID: 99
На самом деле я только что сам столкнулся с этой проблемой. Надеюсь, причина вашей ошибки была такой же, как у меня:
Я был на 100% уверен, что секреты главы были точными в /etc/iscsi/iscsid.conf
, но проверил еще раз, чтобы убедиться, что я не ввел ошибку копирования -n -вставки. Секреты главы были одинаковыми на сервере хранения и клиенте, но, тем не менее, продолжали выдавать ошибку.
Я использую open-iscsi
на хостах Linux для подключения кхранилищу Synologyс доступом к LUN.
После долгих раздумий мне пришло в голову уменьшить сложность секретов CHAP :Убрать -специальные символы
В /etc/iscsi/iscsid.conf
удалите все специальные символы. Скопируйте этот обновленный пароль.
Обновление кэшированных копий пароля в/etc/iscsi/nodes
sudo systemctl restart iscsid.service
Вставьте обновленный пароль в хост хранилища, открывающий LUN в вашей сети.
Теперь попробуйте переподключиться к LUN (с ); теперь все должно подключаться, если проблема связана со специальными символами.
Сначала ошибка казалась отвлекающим маневром, но она была на 100 % верна. Действительно, аутентификация WAS не удалась, но не потому, что секреты CHAP отличались между хостом хранилища и клиентом. Это не удавалось из-за того, что аутентификация прерывалась специальными символами.
Так или иначе,проблема не была сложной, но немного -пустой тратой времени...