我使用这个编译标志的接口(interface)编译 pam 钩子(Hook):
gcc -O0 -g -m32 -I/ext -I/inc -MD -MP -c -DARCH=x86 -o my_pam.o my_pam.c
cat /etc/pam.d/sshd
account optional /root/my_pam.so
session optional /root/my_pam.so
auth optional /root/my_pam.so
password optional /root/my_pam.so
代码my_pam.c:
#define _GNU_SOURCE
#define PAM_OK 0
#define PAM_ERROR -1
/*PAM defintion */
#define PAM_SM_AUTH
#define PAM_SM_ACCOUNT
#define PAM_SM_SESSION
#define PAM_SM_PASSWORD
/*PAM includes */
#include <security/pam_modules.h>
#include <security/pam_modutil.h>
#include <security/pam_ext.h>
/* The actual pam functions are merely wrappers around succeed_if */
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return (PAM_SUCCESS);
}
PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh,const int flags,int argc,const char **argv)
{
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return PAM_SUCCESS;
}
当我尝试通过 ssh 登录时,我无法登录并且日志文件/var/log/auth.log 那个错误是我的电话: PAM 无法 dlopen/root/my_pam.so 错误的 ELF 类:ELFCLASS32 我想这是因为我在 64 位 ubuntu 上并使用 32 位标志编译(这是我想要的),我确实安装了 sudo apt-get install libpam0g-dev:i386 为了也有 32 位的 pam 库,但似乎 pam 仍在寻找它的 64 位版本。我该如何解决这个问题并让 ubuntu 使用我的 32 位 pam?
最佳答案
你不能,我在这里找到了这个答案 Use 32bit shared library from 64bit application? 经过几次尝试并解决了其他几个问题后,您无法编译它并同时使用 32 位代码和 64 位代码。
关于ubuntu - 在 64 位系统上运行使用 32 位标志编译的分片对象时出错 :PAM unable to dlopen my_pam. 所以错误的 ELF 类:ELFCLASS32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49727062/