Etc 모듈

Etc 모듈 (Etc)

Unix 시스템에서 보통 /etc 디렉토리에 저장돼 있는 정보에 접근하는 기능을 제공하는 모듈이에요.

접근할 수 있는 정보는 /etc/passwd/etc/group 파일에 담긴 정보와, 시스템의 임시 디렉토리(/tmp)와 설정 디렉토리(/etc)에 관한 정보예요.

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}"

이 모듈이 제공하는 메서드들이 항상 안전한 것은 아니라는 점을 유의하세요. 정보 제공 목적으로 쓰고, 보안 판단에는 사용하지 마세요. 이 모듈의 모든 연산은 클래스 메서드라서, Etc 모듈을 자신의 클래스에 include 할 수 있어요.

출처: Ruby 3.3 API

본문

상수 (Constants)

  • VERSION — 모듈 버전

::confstr

confstr(p1)confstr()을 사용해 시스템 설정 변수를 돌려줘요. nameEtc 아래 CS_로 시작하는 상수여야 해요. 반환값은 문자열 또는 nil이에요. nil은 설정값이 없다는 뜻이에요(confstr()이 0을 반환하되 errno는 설정되지 않아요).

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

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

::endpwent

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

::getgrent

getgrent()/etc/group 파일에서 항목 하나를 돌려줘요. 처음 호출하면 파일을 열고 첫 항목을, 이후 호출은 다음 항목을 돌려줘요. 파일 끝에 도달하면 nil. 처리가 끝나면 ::endgrent를 호출해서 파일을 닫아요. 각 항목은 Group 구조체로 돌려줘요.

::getgrgid

getgrgid(group_id)Group/etc/group에서 지정한 정수 group_id의 그룹 정보를 돌려줘요. Group 구조체로 반환돼요. 자세한 내용은 getgrgid(3) manpage를 참고해요.

Etc.getgrgid(100)
#=> #<struct Etc::Group name="users", ...>

::getgrnam

getgrnam(name)Group/etc/group에서 지정한 이름의 그룹 정보를 Group 구조체로 돌려줘요. 자세한 내용은 getgrnam(3) manpage를 참고해요.

Etc.getgrnam('users')
#=> #<struct Etc::Group name="users", ...>

::getlogin

getloginString — 현재 로그인한 사용자의 짧은 사용자 이름을 돌려줘요. 아쉽게도 ::getlogin은 쉽게 속을 수 있는 경우가 많아요. 보안 관련 목적으로는 ::getlogin을 피하세요. 실패하면 ::getpwuid를 시도해요. getpwuid(3) manpage 참고.

Etc.getlogin -> 'guest'

::getpwent

getpwent()/etc/passwd 파일에서 항목 하나를 돌려줘요. ::getgrent과 같은 방식으로 동작해요. 처리가 끝나면 ::endpwent를 호출해요. 각 항목은 Passwd 구조체로 돌려줘요.

::getpwnam

getpwnam(name)Passwd — 지정한 로그인 이름의 사용자에 대한 /etc/passwd 정보를 Passwd 구조체로 돌려줘요. getpwnam(3) manpage 참고.

Etc.getpwnam('root')
#=> #<struct Etc::Passwd name="root", ...>

::getpwuid

getpwuid(uid)Passwd — 주어진 정수 uid의 사용자에 대한 /etc/passwd 정보를 Passwd 구조체로 돌려줘요. uid를 생략하면 Passwd[:uid]의 값이 대신 사용돼요. getpwuid(3) manpage 참고.

Etc.getpwuid(0)
#=> #<struct Etc::Passwd name="root", ...>

::group

group()/etc/group 파일의 각 항목에 대해 블록을 실행하는 편리한 Ruby 반복자예요. 블록에는 Group 구조체가 전달돼요. (위 ::getgrent 참고)

require 'etc'

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

::nprocessors

nprocessors() — 온라인 프로세서의 개수를 돌려줘요. 가용 프로세서를 모두 사용할 프로세스 개수로 쓰기 위한 값이에요. 구현은 sched_getaffinity()(Linux) 또는 sysconf(_SC_NPROCESSORS_ONLN)(GNU/Linux, NetBSD, FreeBSD, OpenBSD, DragonFly BSD, OpenIndiana, Mac OS X, AIX)를 사용해요.

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

특히 ruby 프로세스가 특정 cpu에 묶여 있으면 결과가 물리 cpu보다 작을 수 있어요. 더 나은 병렬 처리를 위해 의도된 동작이에요.

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

::passwd

passwd { |struct| block }Passwd, passwdPasswd/etc/passwd 파일의 각 항목에 대해 블록을 실행하는 편리한 반복자예요. 블록에는 Passwd 구조체가 전달돼요. (위 ::getpwent 참고)

require 'etc'

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

::setgrent

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

::setpwent

setpwent()/etc/passwd 파일 읽기 과정을 리셋해요. ::setgrent과 같은 방식이에요.

::sysconf

sysconf(p1)sysconf()를 사용해 시스템 설정 변수를 돌려줘요. nameEtc 아래 SC_로 시작하는 상수여야 해요. 반환값은 정수 또는 nil이에요. nil은 무한 한계(limit)를 뜻해요(sysconf()가 -1을 반환하되 errno는 설정되지 않아요).

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

::sysconfdir

sysconfdir() — 시스템 설정 디렉토리를 돌려줘요. 보통 "/etc"인데, Ruby를 컴파일할 때 사용한 prefix에 따라 달라져요. 예를 들어 /usr/local에 빌드·설치했다면 Windows 외 플랫폼에서는 "/usr/local/etc"를 돌려줘요. Windows에서는 항상 시스템이 제공한 디렉토리를 돌려줘요.

::systmpdir

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

::uname

uname()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"}