16. System Database Access
패스워드와 그룹 정보를 알아내기
/etc/passwd 파일 구조
account:password:UID:GID:GECOS:directory:shell
예)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
각 필드 설명
필드
|
실제 값
|
설명
|
account
|
shutdown
root
|
해당 로그인 계정 명
|
passwd
|
x
|
암호된 패스워드
|
UID
|
6
|
사용자 ID (User ID)
root - 0, 기타 사용자 - 0 이 아닌 정수
|
GID
|
0
|
로그인 Group (Group ID)
|
GECOS
|
/sbin
|
선택적인 필드, 추가 정보를 위한 목적으로 사용된다.
GECOS = General Electric Comprehensive Operating System
주석
|
directory
|
/sbin
|
사용자 홈 디렉토리 ($HOME)
|
shell
|
/sbin/shutdown
|
로그인 쉘 (만약 빈칸이면 /bin/sh)
|
정보를 읽은 함수들
getpwuid :: UID를 사용하여 passwd 필드 정보를 얻는 함수
getpwnam :: 사용자명을 사용하여 passwd 필드 정보를 얻음.
getpwent :: 순차적으로 passwd 필드 목록을 얻는다.
예)
($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwnam or getpwuid ,getpwent
passwd 파일 필드보다 많다.
^^ 리눅스에서
setpwent();
while(@list = getpwent()){
($login,$home) = @list[0,7];
}
endpwent();
/etc/group 파일 관련 정보
정보 구조 :: group_name:passwd:GID:user_list
예)
root:x:0:root
sys:x:3:root,bin,adm
각 필드 설명
필드
|
실제 값
|
설명
|
group_name
|
sys
|
the name of the group
|
passwd
|
x
|
group passwd, 만약 빈란이며 passwd는 필요하지 않는다.
|
GID
|
3
|
group ID
|
user_list
|
root,bin,adm
|
group에 포함된 사용자명
|
정보 읽는 함수
getgrgid :: GID를 사용하여 group 정보를 읽는다.
getgrnam :: 그룹명을 사용하여 group 정보를 얻는다.
getgrent :: 그룹정보를 순차적으로 얻는다.
setgrent :: 초기화
endgrent :: 자원해제
이진테이터를 묶거나 풀기
pack 함수 :: 일반값을 --> 이진테이터 형태로 변환
unpack 함수 :: pack의 반대 함수
포맷 문자열에 대한 설명은 TEMPLATE를 참고 하라
예제)
#!/usr/bin/perl
use strict; use warnings;
####################################################
## 문자열을 배열로 변환
#
my $s = "MP3 Player"; # 문자열 정의
# 문자열을 1글자씩 분해하여 배열로 만들기
my @array = unpack "C*", $s;
# 배열 내용 출력 (1글자씩 나옴)
print chr($_), "-" foreach (@array);
# 화면 출력 결과: M-P-3- -P-l-a-y-e-r-
print "\n\n"; # 편의상 줄바꿈
####################################################
## 배열을 문자열로 변환
#
my $result = pack "C*", @array;
# 문자열 출력
print $result, "\n";
# 화면 출력 결과: MP3 Player
# 다시 복원되었습니다.
네트워크 정보 얻어내기
gethostbyname :: 네트워크 이름을 통해서 ip 주소를 변환 한다.
리턴형 :: 스칼라 변수를 형이 아닐때
($name,$aliaes,$addrtype,$length,@addrs) = gethostbyname($name); #일반적인 형태
변수 설명 (man gethostbyname 함수에서 hostent 참고)
$name :: official name of host
$aliaes :: 별칭
$addrtype :: host address type (AF_INT 혹은 AF_INET6)
$legth :: addrs의 bytes 길이
@addrs :: network address , 4개 문자 혹은 6개 문자로 되어 있다.
#!/usr/bin/perl -w
$hostname = "issacnet.cafe24.com";
($name,$alias,$addrtype,$length,@addrs) = gethostbyname($hostname);
$ipaddr = join(".",unpack("C4",$addrs[0]));
print <<END_OF;
\$name =$name
\$alias =$alias
\$addrtype=$addrtype
\$length =$length
\@addrs =$ipaddr
END_OF
스칼라 변수 일때는 첫번째 주소만을 리턴한다.
$ipaddr = gethostbyname($hostname);
$ipstr = join(".",unpack("C4",$ipaddr));
print "$hostname is $ipstr\n";