Отправляет email-рассылки с помощью сервиса Sendsay

програмисты помогите

Здравствуйте товарищи.
Пишу я на Си++. Хочу научить прогу проверять существование заданой пары
логин:пароль в Linux. Я уже обращялся на многие форумы, писал многим людям,
но кроме того, что нужно использовать pam библиотеку мне нечего не сказали.
Очень надеюсь, что хоть тут мне помогут. Я ж думаю что это не тяжело т.к.
нечего не требуеться лишнего делать! Только проверить и сказать "OK" или
"неOK" и все. Надеюсь что хоть тут мне помогут

+++++++++++++++++++++
ICQ: 171499
home: www.InAttack.ru

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9187; Возраст листа: 346; Участников: 1205
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/185039



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Russian Mon, 5 Jul 2004 18:10:21 +0300 (#185039)

 

Ответы:

On Mon, 5 Jul 2004 18:10:21 +0300
Russian <lin***@i*****.ru> wrote:

в общем случае - сюда:
http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam_appl.html

а вот и пример (причем, очень похож на задачу):
http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam_appl-8.html

WBR,
Antony Dovgal aka tony2001
tony20***@p*****.net || anto***@d*****.com

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9189; Возраст листа: 346; Участников: 1205
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/185049



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Antony Dovgal Tue, 6 Jul 2004 11:39:01 +0400 (#185049)

 

On Tue, Jul 06, 2004 at 11:39:01AM +0400, Antony Dovgal wrote:

И да и нет. PAM это все еще не стандарт POSIX/SVID (насколько мне
известно) и в некоторых дистрибутивах оно отсутствует.

Так вот. В случаях, когда Вам нужно работать с shadow, то нужно
делать так, как написано в shadow(3) и crypt(3). Вот тут я с
нетерпением жду поправки от пользователей Openwall и Alt Linux,
у которых TCB. К сожалению у меня под рукой не нашлось машины с
Owl, дабы проверить это :(.

Далее. Если у Вас используются экзотические медоты аутентификации
(напр. LDAP, DB и проч.), то тут без PAM не обойтись.

И последнее замечание. Все это жутко не переносимо и к каждой системе
придется писать свой код (если Вы конечно хотите переносимости). Но
пример успешного решения можно подсмотреть в исходниках sudo.

Ответить   Tue, 6 Jul 2004 18:45:23 +0400 (#185357)

 

http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam_appl-8.html
Очень хороший пример, сразу все понял (даже удивился) ;)
Но проблемка появилась! Листинг примера:
/*
This program was contributed by Shane Watts
[modifications by AGM]
You need to add the following (or equivalent) to the /etc/pam.conf file.
# check authorization
check_user auth required /usr/lib/security/pam_unix_auth.so
check_user account required /usr/lib/security/pam_unix_acct.so
*/
#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 */
}
Компилирую:
[root@localhost InAttack]# gcc pam1.c
/tmp/ccb2CrKE.o(.text+0x67): In function `main':
: undefined reference to `pam_start'
/tmp/ccb2CrKE.o(.text+0x80): In function `main':
: undefined reference to `pam_authenticate'
/tmp/ccb2CrKE.o(.text+0x99): In function `main':
: undefined reference to `pam_acct_mgmt'
/tmp/ccb2CrKE.o(.text+0xe1): In function `main':
: undefined reference to `pam_end'
/tmp/ccb2CrKE.o(.data+0x0): undefined reference to `misc_conv'
collect2: ld returned 1 exit status

Это в RH9. В Knoppix LiveCD примерно также (((

[root@localhost InAttack]# gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit
--host=i386-redhat-linux
Thread model: posix
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

Это версия gcc. В чем проблема?

В сообщении от Вторник 06 Июль 2004 10:39 Antony Dovgal написал(a):

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9237; Возраст листа: 347; Участников: 1211
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/185853



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Russian Wed, 7 Jul 2004 13:40:20 +0300 (#185853)

 

On Wed, 7 Jul 2004 13:40:20 +0300
Russian <lin***@i*****.ru> wrote:

нужно еще и линковать с libpam:
gcc pam1.c -o pam1 -lpam

ключ "-o pam1" что в результате вместо "a.out" получится бинарник "pam1"

WBR,
Antony Dovgal aka tony2001
tony20***@p*****.net || anto***@d*****.com

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9238; Возраст листа: 347; Участников: 1211
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/185857



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Antony Dovgal Wed, 7 Jul 2004 14:51:27 +0400 (#185857)

 

Hello Antony,

Wednesday, July 7, 2004, 1:51:27 PM, you wrote:

а также с libpam_misc
gcc -lpam -lpam_misc pam1.c -o pam1

Ответить   vasile Wed, 7 Jul 2004 14:13:00 +0300 (#185874)

 

Win32)

Warning! New message from Russian <lin***@i*****.ru> was detected:

...поскипано...

Надо подключить библиотеку pam, или кк она там называется. Для этого, при компиляции
примера надо указать:

gcc -lpam pam1.c

или

gcc -lpam_misc pam1.c

Ответить   Alexander Artemenko Wed, 7 Jul 2004 14:50:16 +0400 (#185864)

 

Russian wrote:

ну если не устраивает уже что-то имеющееся - то самому реализовать - не
судьба?

thanks,
alteest

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9194; Возраст листа: 346; Участников: 1205
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/185087



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "Alexander A. Danilov" Tue, 06 Jul 2004 03:36:02 -0500 (#185087)

 

Hello Russian,

Monday, July 5, 2004, 6:10:21 PM, you wrote:

можно и без PAM (каждое решение имеет свои "+" и "-").
Данное решение проверенно на Linux и OpenBSD.
Если предполагается использование на системе с shadow password file то
нужно определить GNULINUX_TARGET (проще из Makefile передавать по
условию gcc -D GNULINUX_TARGET=1)

#ifdef GNULINUX_TARGET
#define _GNU_SOURCE
#define _XOPEN_SOURCE 4
#define _XOPEN_SOURCE_EXTENDED
#define _XOPEN_VERSION 4
#define _XPG4_2
#endif
#include <unistd.h>
#include <pwd.h>
#ifdef GNULINUX_TARGET
#include <shadow.h>
#endif

//0 - no such user
//1 - Auth ok
//-1 - no password, disabled, misc err
//-2 - Bad password
int sys_auth(const char *user, const char *pass, uid_t *uid)
{
struct passwd *pwe;
#ifdef GNULINUX_TARGET
struct spwd *spwe;
#endif
int result;

if ( (pwe = getpwnam(user)) )
{
if (uid)
*uid = pwe->pw_uid;
#ifdef GNULINUX_TARGET
memset(pwe->pw_passwd, 0, strlen(pwe->pw_passwd));
#endif
}
else
{
if (uid)
*uid = -1;
return 0;
}

result = 0;

#ifdef GNULINUX_TARGET
if ((spwe = getspnam(user)) && (pwe) && (spwe->sp_pwdp[0]) &&
(spwe->sp_pwdp[0] != '*') && (spwe->sp_pwdp[0] != '!'))
{
if (!strcmp(crypt(pass, spwe->sp_pwdp), spwe->sp_pwdp))
#else
if ((pwe) && (pwe->pw_passwd[0]) &&
(pwe->pw_passwd[0] != '*') && (pwe->pw_passwd[0] != '!'))
{
if (!strcmp(crypt(pass, pwe->pw_passwd), pwe->pw_passwd))
#endif
result = 1;
else
result = -2;
}
else
result = -1;

#ifdef GNULINUX_TARGET
memset(spwe, 0, sizeof(struct spwd));
#endif
memset(pwe, 0, sizeof(struct passwd));
return result;
}

Ответить   vasile Wed, 7 Jul 2004 14:26:27 +0300 (#185880)

 

Все большое спасибо! Теперь буду только сюда обращаться т.к. на форумы нет
смысла ;)

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9318; Возраст листа: 349; Участников: 1207
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/187447



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Russian Fri, 9 Jul 2004 15:59:30 +0300 (#187447)

 

Решил разобрать этот пример.
Значит если система использует shadow password file то нужно написать
#ifdef GNULINUX_TARGET 1, или я ошибся? Далее, функции sys_auth передаються
парамерты login, pass и uid! А где узнать uid?

В сообщении от Среда 07 Июль 2004 14:26 vasile написал(a):

Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9467; Возраст листа: 353; Участников: 1208
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/189706



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Russian Tue, 13 Jul 2004 10:38:35 +0300 (#189706)

 

On Tue, Jul 13, 2004 at 10:38:35AM +0300, Russian wrote:

Нет. vasile написал как правильно:

gcc -DGNULINUX_TARGET=1

man getuid.

Ответить   Tue, 13 Jul 2004 12:46:29 +0400 (#189787)

 

Hello Russian,

Tuesday, July 13, 2004, 10:38:35 AM, you wrote:

Надо в начале файла написать
#define GNULINUX_TARGET 1
или

вообще-то надо передать не uid, а адрес переменной куда sys_auth
сохранит uid. Можно передать NULL, и забыть о этой возможности.

Ответить   vasile Tue, 13 Jul 2004 18:37:00 +0259 (#190057)

 

Еще такой вопрос:
Листинг примера:
/*
This program was contributed by Shane Watts
[modifications by AGM]
You need to add the following (or equivalent) to the /etc/pam.conf file.
# check authorization
check_user auth required /usr/lib/security/pam_unix_auth.so
check_user account required /usr/lib/security/pam_unix_acct.so
*/
#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 */
}
Я его уже скомпилировал, но он как-то не коректно работает. Все время я
получаю "Not Authenticated" хотя даные ввожу правильно! Чего я еще не понял?

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9643; Возраст листа: 356; Участников: 1228
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/192339



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Russian Fri, 16 Jul 2004 17:57:38 +0300 (#192339)