Vì vậy, tôi đang cố gắng thêm dịch vụ vào NSS (Chuyển đổi dịch vụ tên). Xin lưu ý hướng dẫn GNU về cách thực hiện nó here. Tôi đã làm theo hướng dẫn đó. Tôi cần phải thực hiện một dịch vụ làm việc với cơ sở dữ liệu passwd.Thêm dịch vụ vào dịch vụ chuyển tên dịch vụ
Sự cố tôi gặp phải là mô-đun của tôi không được gọi cho một số chức năng nhất định. Hãy để tôi tái tạo một số mã của tôi ở đây ...
enum nss_status
_nss_myservice_setpwent (void) {
printf("@ %s\n", __FUNCTION__) ;
return NSS_STATUS_SUCCESS ;
} ;
enum nss_status
_nss_myservice_endpwent (void) {
printf("@ %s\n", __FUNCTION__) ;
return NSS_STATUS_SUCCESS ;
} ;
enum nss_status
_nss_myservice_getpwent_r (struct passwd *result, char *buffer,
size_t buflen, int *errnop) {
static int i = 0 ;
if(i++ == 0) {
printf("@ %s\n", __FUNCTION__) ;
return init_result(result, buffer, buflen, errnop) ;
} else {
i = 0 ;
return NSS_STATUS_NOTFOUND ;
}
} ;
enum nss_status
_nss_myservice_getpwbynam (const char *nam, struct passwd *result, char *buffer,
size_t buflen, int *errnop) {
printf("@ %s with name %s\n", __FUNCTION__, nam) ;
return init_result(result, buffer, buflen, errnop) ;
} ;
enum nss_status
_nss_myservice_getpwbynam_r (const char *nam, struct passwd *result, char *buffer,
size_t buflen, int *errnop) {
printf("@ %s with name_r %s\n", __FUNCTION__, nam) ;
return init_result(result, buffer, buflen, errnop) ;
} ;
Init_result là một hàm nội tuyến chỉ đơn giản điền vào kết quả với người dùng giả cho dù PARAMS là gì.
Bây giờ tôi đã thiết lập /etc/nsswitch.conf của tôi như sau:
passwd: myservice compat
Và cho đầy đủ ở đây là Makefile của tôi.
all:
gcc -fPIC -shared -o libnss_myservice.so.2 -Wl,-soname,libnss_myservice.so.2 myservice.c
install:
sudo install -m 0644 libnss_myservice.so.2 /lib
sudo /sbin/ldconfig -n /lib /usr/lib
clean:
/bin/rf -rf libnss_myservice.so.2
Bây giờ sau khi cài đặt mô-đun NSS này tôi chạy getent trên dòng lệnh và đây là kết quả của tôi:
[email protected]:~/nss$ getent passwd
@ _nss_myservice_setpwent
@ _nss_myservice_getpwent_r
myuser:mypass:1:1:realname::
root:x:0:0:root:/root:/bin/bash
...
@ _nss_myservice_endpwent
Như bạn có thể thấy rằng đang làm việc như tôi mong đợi. Cuộc gọi lặp lại được thực hiện để trả về người dùng và sau đó dịch vụ compat được gọi là trả về tất cả người dùng từ/etc/passwd.
Vấn đề là khi tôi thực hiện cuộc gọi này, "getent passwd myuser", tôi nhận được giá trị trả lại là 2, "Khóa không tìm thấy trong cơ sở dữ liệu". Điều này cho thấy hàm _nss_myservice_getpwbynam_r của tôi không được gọi. Bất kỳ ý tưởng tại sao? Tôi có thể cung cấp mã hoàn chỉnh nếu điều đó có thể hữu ích.
gì nếu bạn gọi nó '_nss_myservice_getpwnam_r' để thay thế? Chỉ cần đoán, nhưng tôi thấy có một hàm 'pwd.h' được gọi là' getpwnam_r' –