62 lines
1.5 KiB
Plaintext
62 lines
1.5 KiB
Plaintext
--:Minify:--
|
|
local targetUser = ({ ... })[1]
|
|
local currentUid = syscall.getuid()
|
|
local targetUid
|
|
if targetUser then
|
|
targetUid = syscall.getuidbyname(targetUser)
|
|
else
|
|
targetUid = 0
|
|
end
|
|
|
|
if not targetUid then
|
|
print("su: user '" .. targetUser .. "' does not exist")
|
|
syscall.exit(1)
|
|
return
|
|
end
|
|
|
|
if currentUid ~= 0 then
|
|
printInline("Password: ")
|
|
local pw = ""
|
|
while true do
|
|
local ch = syscall.read(0)
|
|
if not ch or ch == "" then
|
|
elseif ch == "\n" then
|
|
syscall.write(1, "\n")
|
|
break
|
|
elseif ch == "\b" then
|
|
if #pw > 0 then pw = pw:sub(1, -2); syscall.write(1, "\b \b") end
|
|
else
|
|
pw = pw .. ch; syscall.write(1, "*")
|
|
end
|
|
end
|
|
|
|
local ok, err = syscall.login(targetUid, pw)
|
|
if not ok then
|
|
sleep(1)
|
|
print("su: Authentication failure")
|
|
syscall.exit(1)
|
|
return
|
|
end
|
|
else
|
|
syscall.setuid(targetUid)
|
|
end
|
|
|
|
local pwent = syscall.getpasswd(targetUid)
|
|
local shell = (pwent and pwent.shell) or "/bin/hysh"
|
|
local homedir = (pwent and pwent.homedir) or "/"
|
|
local username= (pwent and pwent.username)or "Unknown"
|
|
|
|
local ok_cd, err_cd = pcall(syscall.chdir, homedir)
|
|
if not ok_cd then
|
|
homedir = "/"
|
|
syscall.chdir(homedir)
|
|
end
|
|
syscall.setEnviron("HOME", homedir)
|
|
syscall.setEnviron("USER", username)
|
|
syscall.setEnviron("SHELL", shell)
|
|
|
|
local ok, err = pcall(syscall.exec, shell)
|
|
if not ok then
|
|
print("su: cannot exec shell '" .. shell .. "': " .. tostring(err))
|
|
syscall.exit(1)
|
|
end |