Etc 모듈

Etc 모듈 (Etc)

Etc 모듈은 Unix 시스템에서 보통 /etc 디렉토리에 저장되어 있는 정보에 접근할 수 있게 해줘요. 접근 가능한 정보는 /etc/passwd/etc/group 파일에서 찾을 수 있는 정보와, 시스템의 임시 디렉토리(/tmp)와 설정 디렉토리(/etc)에 대한 정보예요.

$USER 같은 환경 변수보다 로그인한 사용자 정보를 더 확실하게 얻을 수 있는 방법을 제공하죠. 예를 들어 이렇게 써요.

require 'etc'
login = Etc.getlogin
info = Etc.getpwnam(login)
username = info.gecos.split(/,/).first
puts "Hello #{username}, I see your login name is #{login}"

한 가지 주의할 점이 있어요. 이 모듈이 제공하는 메서드들은 항상 안전한 건 아니에요. 정보 목적으로 쓰기 좋지, 보안 목적으로는 쓰면 안 됩니다. 그리고 이 모듈에 정의된 모든 연산은 클래스 메서드라서, 여러분의 클래스에 include Etc를 해서 쓸 수도 있어요.

출처: Ruby 4.0 API

본문

::confstr (Public Class Method)

confstr(name) → String — confstr() 함수로 시스템 설정 변수를 돌려줘요. nameEtc 아래에서 CS_로 시작하는 상수를 줘야 해요. 반환값은 문자열 또는 nil인데, nil은 설정된 값이 없다는 뜻이에요.

Etc.confstr(Etc::CS_PATH) #=> "/bin:/usr/bin"
# GNU/Linux
Etc.confstr(Etc::CS_GNU_LIBC_VERSION) #=> "glibc 2.18"
Etc.confstr(Etc::CS_GNU_LIBPTHREAD_VERSION) #=> "NPTL 2.18"

::endgrent (Public Class Method)

endgrent::getgrent이 시작한 /etc/group 파일 스캔 과정을 끝내고 파일을 닫아요.

::endpwent (Public Class Method)

endpwent::getpwent가 시작한 /etc/passwd 파일 스캔 과정을 끝내고 파일을 닫아요.

::getgrent (Public Class Method)

getgrentEtc::Group/etc/group 파일에서 항목 하나를 돌려줘요. 처음 호출하면 파일을 열고 첫 항목을 돌려주고, 이후 호출마다 다음 항목을 돌려주며 파일의 끝에 도달하면 nil을 돌려줘요. 처리를 마치면 ::endgrent로 파일을 닫아요. 각 항목은 Group 구조체로 반환돼요.

::getgrgid (Public Class Method)

getgrgid(group_id)Etc::Group — 정수 group_id를 가진 그룹에 대한 정보를 /etc/group에서 찾아 Group 구조체로 돌려줘요. 자세한 내용은 Unix manpage getgrgid(3)을 참고하세요.

Etc.getgrgid(100)
#=> #<struct Etc::Group name="users", passwd="x", gid=100, mem=["meta", "root"]>

::getgrnam (Public Class Method)

getgrnam(name)Etc::Group — 지정된 name을 가진 그룹에 대한 정보를 /etc/group에서 찾아 Group 구조체로 돌려줘요. getgrnam(3) 참고.

Etc.getgrnam('users')
#=> #<struct Etc::Group name="users", passwd="x", gid=100, mem=["meta", "root"]>

::getlogin (Public Class Method)

getlogin → String — 현재 로그인한 사용자의 짧은 사용자 이름을 돌려줘요. 다만 getlogin은 꽤 쉽게 속을 수 있어서, 보안 관련 용도로는 피하는 게 좋아요. 실패하면 ::getpwuid를 시도해 보세요. getpwuid(3) 참고.

Etc.getlogin -> 'guest'

::getpwent (Public Class Method)

getpwentEtc::Passwd/etc/passwd 파일에서 항목 하나를 돌려줘요. 첫 호출이 파일을 열고 첫 항목을 돌려주고, 이후엔 다음 항목, 끝에 도달하면 nil이에요. 처리가 끝나면 ::endpwent로 닫아요. 각 항목은 Passwd 구조체로 반환돼요.

::getpwnam (Public Class Method)

getpwnam(name)Etc::Passwd — 지정된 로그인 name에 대한 /etc/passwd 정보를 Passwd 구조체로 돌려줘요. getpwnam(3) 참고.

Etc.getpwnam('root')
#=> #<struct Etc::Passwd name="root", passwd="x", uid=0, gid=0, gecos="root",dir="/root", shell="/bin/bash">

::getpwuid (Public Class Method)

getpwuid(uid)Etc::Passwd — 주어진 정수 uid에 대한 /etc/passwd 정보를 Passwd 구조체로 돌려줘요. uid를 생략하면 현재 사용자(getuid())의 정보를 돌려줘요. getpwuid(3) 참고.

Etc.getpwuid(0)
#=> #<struct Etc::Passwd name="root", passwd="x", uid=0, gid=0, gecos="root",dir="/root", shell="/bin/bash">

::group (Public Class Method)

group { |struct| block } 또는 groupEtc::Group/etc/group 파일의 각 항목마다 블록을 실행하는 편리한 Ruby 이터레이터예요. 블록에는 Group 구조체가 전달돼요. 블록 없이 호출하면 한 항목을 Group 구조체로 돌려줘요.

require 'etc'
Etc.group {|g|
  puts g.name + ": " + g.mem.join(', ')
}

::nprocessors (Public Class Method)

nprocessors → Integer — 온라인 프로세서의 수를 돌려줘요. 결과는 "사용 가능한 모든 프로세서를 쓰기 위한 프로세스 수"로 쓰는 걸 의도해요. 구현은 플랫폼별로 달라요: Linux는 sched_getaffinity(), 그 외(GNU/Linux, NetBSD, FreeBSD, OpenBSD, DragonFly BSD, OpenIndiana, Mac OS X, AIX)는 sysconf(_SC_NPROCESSORS_ONLN)을 써요.

require 'etc'
p Etc.nprocessors #=> 4

결과가 물리 CPU 수보다 작을 수 있어요. 특히 ruby 프로세스가 특정 CPU에 바인딩돼 있을 때 그런데, 이는 더 나은 병렬 처리를 의도한 결과예요.

linux$ taskset 0x3 ./ruby -retc -e "p Etc.nprocessors"  #=> 2

::passwd (Public Class Method)

passwd { |struct| block } 또는 passwdEtc::Passwd/etc/passwd 파일의 각 항목마다 블록을 실행하는 편리한 이터레이터예요. 블록에는 Passwd 구조체가 전달돼요.

require 'etc'
Etc.passwd {|u|
  puts u.name + " = " + u.gecos
}

::setgrent (Public Class Method)

setgrent/etc/group 파일 읽기 과정을 리셋해서, 다음 ::getgrent 호출이 다시 첫 항목을 돌려주게 해요.

::setpwent (Public Class Method)

setpwent/etc/passwd 파일 읽기 과정을 리셋해서, 다음 ::getpwent 호출이 다시 첫 항목을 돌려주게 해요.

::sysconf (Public Class Method)

sysconf(name) → Integer — sysconf() 함수로 시스템 설정 변수를 돌려줘요. nameEtc 아래에서 SC_로 시작하는 상수를 줘야 해요. 반환값은 정수 또는 nil인데 nil은 무한한(정해지지 않은) 제한을 뜻해요.

Etc.sysconf(Etc::SC_ARG_MAX) #=> 2097152
Etc.sysconf(Etc::SC_LOGIN_NAME_MAX) #=> 256

::sysconfdir (Public Class Method)

sysconfdir → String — 시스템 설정 디렉토리를 돌려줘요. 보통 /etc인데, Ruby가 컴파일될 때 사용된 prefix에 따라 바뀌어요. 예를 들어 Ruby가 /usr/local에 빌드·설치됐다면 Windows 외 플랫폼에서는 /usr/local/etc를 돌려줘요. Windows에서는 항상 시스템이 제공하는 디렉토리를 돌려줘요.

::systmpdir (Public Class Method)

systmpdir → String — 시스템 임시 디렉토리를 돌려줘요. 보통 /tmp예요.

::uname (Public Class Method)

uname → hash — uname 시스템 콜로 얻은 시스템 정보를 돌려줘요. 반환값은 최소한 5개의 키를 가진 해시예요: :sysname, :nodename, :release, :version, :machine.

require 'etc'
require 'pp'
pp Etc.uname
#=> {:sysname=>"Linux",
#    :nodename=>"boron",
#    :release=>"2.6.18-6-xen-686",
#    :version=>"#1 SMP Thu Nov 5 19:54:42 UTC 2009",
#    :machine=>"i686"}