2013년 9월 11일 수요일

Perl 제대로배우기 - 16장(System Database Access)

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 필드 목록을 얻는다.
    • setpwent :: getpwent에 사용시 초기화 한다.
    • endpwent :: getpwent에 사용후 자원 해지한다.


예)
($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";

댓글 없음: