수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1621038
  • Today | 418
  • Yesterday | 482

1 Articles, Search for '사용자 로그인 정보'

  1. 2007/05/14 utmp 를 이용한 사용자 로그인정보 관리
Programming/UNIX/Linux C2007/05/14 17:37

utmp 를 이용한 사용자 로그인정보 관리

utmp 는 커널에서 관리하는 로그인테이블 관리 시스템으로, 주로 현재 시스템을 누구 사용하는지, 언제 로그인을 했으며, 어떤 tty 를 사용하고 있는지 어떤 IP에서 접근했는지 등에 사용자 로그인에 대한 정보를 알려준다.
이러한 특성으로 시스템 사용자 모니터를 위한 도구로 많이 활용된다.
Unix 시스템에서는 utmp 데이내용을 확인하기 위해서 "w" 도구를 주로 사용 하게 되는데, 이번에는 이 "w" 를 직접 제작해 봄으로써, utmp의 개념과 활용방법등에 대해서 알아보도록 하겠다.

utmp에 대한 내용은 각 Unix 마다 다를수 있는데, 이 기사는 Linux readhat 7.x 을 기준으로 작성하도록 하겠다.

여러분이 시스템 관리자라면, 현재 시스템에 누가 작업을 하고 있는지, 어떤 작업을하는지 등에 대한 정보를 알아야될 때가 있을것이다.
이럴경우 시스템 관리자는 "w" 를 사용해서 현재 접근한 사용자의 정보를 알아보려고 시도할 것이다.

[root@localhost test]$ w
11:43am  up 270 days,  9:25,  3 users,  load average: 3.12, 3.22, 3.24
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
mercy4u  pts/1    s210-205-210-195 11:25am 41.00s  0.09s  0.06s  -bash
root     pts/2    s210-205-210-195 11:43am 18.00s  0.05s  0.05s  -bash
mercy4u  pts/4    s210-205-210-195 11:43am  0.00s  0.06s  0.02s  w


위의 결과에서 보듯이 "w" 명령을 이용해서 우리는 시스템에 접근한 사용자에 대한 다양한 정보를 얻을수 있을것이다.

예제 : myutmp.c


위 프로그램을 설명하기 전에 utmp(5) 구조체에 대해서 알아보도록 하자.
utmp 구조체는 아래와 같은 내용을 가진다.


ut_type 은 로그인 타입으로 미리 디파인된 값들을 가지고 있다. 이에 대한 내용은 utmp 의 맨 페이지를 참고하기 바란다.
우리가 보고자 하는 로그인 타입의 유저는, 일반 유저 레벨에서 접근한 경우에 한하므로 ut_type 이 "USER_PROCESS"인 utmp 정보만 가져오도록 하겠다.
shell 명령어로 사용하는 "w" 역시 ut_type 이 "USER_PROCESS" 인경우만 가져오는데, 이러한 ut_type 의 값은 USER_PROCESS 로 7로 디파인되어 있으며,

이 쏘쓰의 첫부분에서는 getutent(3) 함수를 이용하여 utmp파일의 가장최근의 파일 위치에서 부터 utmp 정보를 읽어들이게 는데, setutent(3)을 통하여 utmp파일 의 위치를 가장처음으로 돌렸음으로, utmp의 처음정보부터 읽어오게 될것이다. (굳이 stutent 를 사용할필요는 없지만 안전한 프로그래밍 습관을 위해서..) 이정보는 utmpfp 구조체에 저장이되고, 더이상 utmp 정보가 나오지 않을때까지 - NULL 을 만나기 전까지 - 반복실행되게 된다.
while 루프문 안에서는 getutent 를 통해서 가져온 정보를 이용해서 사용자가 보기편한 형태로 돌려주게 된다.
이 프로그램에서 사용자에게 돌려주는 정보는, 로그인시간, 사용터미널이름, 호스트 아이피, 그리고 현재 진행중인 process 의 이름을 돌려주게 된다.
대부분의 정보들은 단순히 utmp 구조체의 멤버들을 출력시킨것인데, 다만 현재 진행중인 process 가 무엇인지를 확인하기 위하여서, 별도의 함수를 작성하였다.

get_current_pid 는 현재 사용자가 실행중인 프로그램(프로세스)의 pid 를 가져오고, get_current_procname 는 get_current_pid 를 통해서 현재 실행중인 프로세스의 pid 를 넘겨받아서, pid 에 맞는 명령어의 이름을 돌려준다.
이에 대한 자세한 내용을 알고 싶다면 proc 파일시스템에 대한 이해가 필요한데, 상당히 방대한 내용이므로, 여기에서는 개념만 설명하고 넘어가도록 하겠다.

리눅스는 모든 프로세스의 정보를 /proc 밑에 자신의 pid 이름의 디렉토리에 저장을하게 된다. 즉 내가 현재 vi 를 실행시켰는데, 이 vi 에 대한 자세한 프로세스 정보를 알기를 원한다면 ps 등을 이용해서 vi 의 pid 를 알아내고, /proc/pid 으로 이동하면 프로세스의 상세한 정보를 기록한 파일들을 열람함으로써 프로세스의 정보를 알아낼수 있다.
/proc/pid 로 이동하면 이중 stat 라는 파일이 보일것이다. stat에는 프로세스의 pid, 명령어, ppid(부모프로세스의 pid) 등 프로세스의 전반적인 정보를 알아낼수 있는데, 8번째 필드값을 이용해서 가장최근에 실행된 프로세스의 pid 값을 알아낼수 있다.(정확하게는 gid 이지만 우리가 알아내고자 하는 pid 와 동일한 값을 보여주므로 넘어가도록 하겠다. 여기에 대한내용은 유닉스 프로세스에 대한 메뉴얼을 참조하기 바란다.)
그리고 /proc/pid 를 살표보면 exe 라는 심볼링 링크된 파일을 볼수 있을것인데, 이것은 현재 프로세스를 실행시킨 명령어에 대한 심볼릭링크이다.
결론적으로 우리는 /proc/pid/stat 를 이용해서 현재 실행중인 프로세스의 pid를 알수 있음으로 해당 프로세스 pid 의 proc 디렉토리로 이동해서 exe파일이 어떤 명령어에 심볼릭링크 되어있는지를 확인해서, 사용자가 지금 실행중인 프로그램이 어떤것인지를 알수 있게 된다. 심볼릭링크의 원본파일이름은 readlink(2) 를 이용해서 가져올수 있다.

다시한번 정리해 보자면 get_current_pid 를 이용 /proc/pid/stat 파일을 분석해서 현재 실행중인 프로세스의 pid(current_pid) 를 가져오고, get_current_procname 을 이용해서 /proc/current_pid/exe 의 심볼링크된 원본의 파일이름을 읽어 옴으로써 사용자의 현재진행중인 프로그램명을 얻어오게 되는것이다.

프로그램의 마지막에서는 getutline(3)함수를 이용해서 자기자신의 utmp 정보를 출력하도록 만들었다. getutline 는 tty 번호를 이용해서 utmp 정보를 가져온다. tty의 이름은 ttyname(3) 을 이용해서 얻어올수 있다.

아래는 프로그램을 실행시킨 결과이다
[root@localhost test]# ./myutmp
root         tty1     -            2002/09/16 22:12  
root         pts/0    -            2002/09/17 01:34  
root         pts/1    -            2002/09/16 22:13  
root         pts/2    -            2002/09/16 22:13  
root         pts/3    -            2002/09/20 11:53  
root         pts/4    -            2002/09/21 01:51  
root         pts/5    -            2002/09/21 02:03  
root         pts/6    -            2002/09/21 02:28  
root         pts/7    -            2002/09/21 03:07  
root         pts/8    -            2002/09/17 00:43  
root         pts/9    -            2002/09/18 00:13  
root         pts/10   -            2002/09/21 03:08  
root         pts/11   -            2002/09/21 03:11  
root         pts/12   -            2002/09/18 00:52  
root         pts/13   -            2002/09/22 11:14  
root         pts/14   -            2002/09/22 11:15  
root         pts/15   -            2002/09/22 11:16  
root         pts/16   -            2002/09/19 23:37  
root         pts/17   -            2002/09/22 11:32  

my utmp info is ---
root         pts/14   -            2002/09/22 11:15
"UNIX/Linux C" 카테고리의 다른 글
  • Unix 시간 조작하기 (0)2007/05/14
  • file 정보(stat) 와 종류 알아내기 (0)2007/05/14
  • utmp 를 이용한 사용자 로그인정보 관리 (0)2007/05/14
  • library 의 사용 (0)2007/05/14
  • PIPE 응용 (0)2007/05/14
2007/05/14 17:37 2007/05/14 17:37
Posted by webdizen
Tags UTMP, 사용자 로그인 정보
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2947

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • php.MVC
  • .NET Framework
  • 스탠포드
  • 대한민국
  • 발렌타인
  • 화장품
  • CView
  • Wikia Search
  • 에너지 버스
  • 연결프로그램
  • Backlink
  • Framework
  • 까벨렐로 리앙트
  • 가우디
  • 유닉스
  • Calculator
  • 공유 라이브러리
  • 리디렉션
  • Programming Optimization
  • multi tasking

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.