Возможно ли сделать неинтерактивный login в систему через PAM. То есть по сути говоря ./test user pass, чтобы система говорила верный пасс или нет.
Это код с kernel.org работает только для юсера из под которого запускается + пароль спрашивается в интерактивном режиме Код (Text): #include <security/pam_appl.h> #include <security/pam_misc.h> #include <stdio.h> static struct pam_conv conv = { misc_conv, NULL }; int main(int argc, char *argv[]) { pam_handle_t *pamh=NULL; int retval; const char *user="nobody"; if(argc == 2) { user = argv[1]; } if(argc > 2) { fprintf(stderr, "Usage: check_user [username]\n"); exit(1); } retval = pam_start("check_user", user, &conv, &pamh); if (retval == PAM_SUCCESS) retval = pam_authenticate(pamh, 0); /* is user really user? */ if (retval == PAM_SUCCESS) retval = pam_acct_mgmt(pamh, 0); /* permitted access? */ /* This is where we have been authorized or not. */ if (retval == PAM_SUCCESS) { fprintf(stdout, "Authenticated\n"); } else { fprintf(stdout, "Not Authenticated\n"); } if (pam_end(pamh,retval) != PAM_SUCCESS) { /* close Linux-PAM */ pamh = NULL; fprintf(stderr, "check_user: failed to release authenticator\n"); exit(1); } return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */ } Можно ли написать для всех юсеров и без интерактива?
Я так понимаю при старте /bin/login запущен от рута и он даст залогиниться любому ( через PAM ), а уже залогиневшись, такое ( проверить валидность пароля произвольного юсера ) можно только через суидный /bin/su. Получается такое можно реализовать только через каналы общения с su ? Или есть иные пути решения? Есть у кого-нить наработки по взаимодействию с интерактивнымы каналами общения?
gongfu Нет. Так или иначе придётся задействовать рутовские права. Если ruid процесса не 0, то есть процесс запущен не рутом, то этот процесс не может изменить свой euid, за исключением той ситуации, когда процесс suid'ный. Если же процесс suid'ный, то он может изменить euid на uid владельца файла. Рутовский суидный файл, таким образом, позволяет не-руту запустить процесс, который сменит euid на 0, после чего сможет использовать seteuid/setruid произвольным образом. Я где-то что-то слышал про linux без suid'а, но слышал лишь краем уха и не вникал как такое может быть. И я не уверен что донёсшиеся до меня отголоски я понял правильно. Если делать через su, то скорее всего втупую через пайпы не выйдет. Я вроде пробовал недавно из скрипта, и по-моему su отказался работать не на терминале. Это можно обойти, и в общем-то несложно. Псевдотерминалы должны помочь.
act И что мне с этим делать? Перевод этих слов на русский мне ни о чём не говорит. Если их забить в гугл, то я думаю тоже не узнаю ничего нового по теме.