lib LibC struct Passwd pw_name : Char* pw_passwd : Char* pw_uid : UInt pw_gid : UInt pw_gecos : Char* pw_dir : UInt pw_shell : Char* end fun setuid(Int32) : Int32 fun setgid(Int32) : Int32 fun getpwnam(Char*) : Passwd* end module System def self.become_user(user_name : String) pointer = LibC.getpwnam user_name.to_unsafe if pointer.null? return nil end passwd = pointer.value become_user passwd.pw_uid, passwd.pw_uid end def self.become_user(uid, gid) r = LibC.setgid gid raise Errno.new "setgid" if r != 0 r = LibC.setuid uid raise Errno.new "setuid" if r != 0 end end #def get_uid_gid(user_name : String) # pointer = LibC.getpwnam user_name.to_unsafe # # if pointer.null? # return nil # end # # passwd = pointer.value # # {passwd.pw_uid, passwd.pw_gid} #end #uid, gid = get_uid_gid("http").not_nil! #LibC.setuid uid #LibC.setgid gid #puts Process.run "whoami", output: Process::Redirect::Inherit