2010-06-21 5 views
7

C++을 사용하여 Linux에 사용자/그룹을 추가하는 가장 좋은 방법은 내가 부를 수있는 라이브러리가 있습니까? 나는 다음과 같은 일을 시작하고 싶지 않다 :C++ linux 사용자 추가

fopen("/etc/passwd", "a"); 
fprintf(tmp, "%s:x:%d:1:%s:/%s/%s:/bin/ksh\n", username, usernumber, commentfield, userdir, username); 
fclose(tmp); 

fopen("/etc/shadow", "a"); 
fprintf(stmp, "%s:*LK*:::::::\n", username); 
fclose(stmp); 

고마워!

답변

5

나는 사용자를 추가하고 변경하는 대부분의 주요 유틸리티가 여러 가지 방법으로 직접 그렇게하는 것으로 나타났습니다. passwd 및 섀도 파일을 수정하는 데 사용할 수있는 함수는 <pwd.h><sys/types.h>they're part of glibc에 표시됩니다.

fgetpwent, getpwnam, getpw, getpwent_r, putpwent, 우리는 (TinyLogin 통해) 비지 박스는 예를 들어, 그것을 수행하는 방법으로 볼 수 setpwent

. busybox/loginutils/adduser.c에서 passwd 구조를 작성하고 putpwent을 호출하여 사용자를 passwd 파일에 넣습니다. 그림자 파일에 사용자의 암호를 추가하기 위해 그들은 단순히 fprintf을 호출하고 문자열을 직접 씁니다.

사용자를 현대적으로 인증하는 데는 Linux-PAM이 있습니다. 하지만 사용자를 추가하는 경우 에서 unix_update_db()을 호출합니다. libpwdb에서 다양한 기능을 호출합니다.이 기능을 사용하면 프로젝트에 종속성으로 추가해야합니다.

필자는 passwd 및 shadow 데이터베이스를 구문 분석하고 직접 수정하는 몇 가지 유틸리티를 작성한 것에 대해 유죄입니다. 괜찮 았지만, 이것은 모든 것을 단단히 제어 할 수있는 임베디드 시스템에있었습니다. passwd db를 수정하는 다른 프로그램과의 경쟁 조건에 대해서는 걱정할 필요가 없었습니다.

그룹을 추가해야하는 경우 group database도 마찬가지입니다.

3

사용자를 추가하는 것은 너무 높은 수준이어서 시스템 호출이 필요하지 않습니다. 내가 아는 한이 라이브러리에는 널리 사용되는 라이브러리가 없습니다. 최선의 방법은 system 호출을 사용하여 적절한 옵션을 사용하여 useradd 프로그램을 호출하는 것입니다.

+0

몇 가지 : * 패스 한 물건이 쉘에 의해 특수 문자로 해석되지 않는 한 system()을 사용하지 마십시오. * useradd는 특별히 이식성이 없습니다 (일부 시스템에서는 사용자가 LDAP/NIS/AD/등의 사용자와 같은 "일반"사용자를 만들지 못할 수도 있습니다.) 일반적으로 일회용 사용자 쉘 스크립트를 사용합니다. –

4

libuser 라이브러리를 사용해 볼 수도 있습니다.

libuser와 함께 배포되는 응용 프로그램 중 하나는 luseradd이며, 플랫폼 간 useradd 유틸리티 인 것으로 나타났습니다. 핵심 부분 인 luseradd은 libuser의 lu_user_add 함수를 사용하여 물리적으로 사용자를 생성합니다.

설명서의 소스 배포본에있는 docs/html 폴더를 참조하십시오.

관련 문제