2010-02-06 94 views
3

我有一個應用程序,可以在用戶被分享到共享用戶帳戶時運行,也可以不運行。我想要可靠地確定誰是真正的用戶對於某種「榮譽系統」ACL。我認爲通過跟蹤父/組/會話進程id,pstree命令可以實現某種方式,但我不確定如何做到最好,或者是否有更好的替代方法。我最初試過getlogin()。如果使用./myapp,則該方法有效,但會失敗,並顯示'cat input | 。/ myapp`(因爲「控制終端」是共享帳戶擁有的管道)。通過sudo識別當前用戶的最可靠方法

我寧可不相信環境變量,因爲我不希望我的「榮譽系統」完全受到unset的阻礙,當時信息在別處仍然可用。

我還想避免強制在密碼數據庫中查找,因爲這是遠程RPC(NIS或LDAP),我很確定wtmp已經包含我需要的信息。

回答

1

sudo設置環境變量SUDO_USER,SUDO_UIDSUDO_GID

你可以測試:

$ sudo env 
[sudo] password for shteef: 
TERM=xterm 
# [...snip...] 
SHELL=/bin/bash 
LOGNAME=root 
USER=root 
USERNAME=root 
SUDO_COMMAND=/usr/bin/env 
SUDO_USER=shteef 
SUDO_UID=1000 
SUDO_GID=1000 

但是,如果你的用戶對共享帳戶shell訪問,那麼我想你不能盲目信任任何此。

2

對於一個shell腳本,你可以用這個來獲得sudo'ing用戶:

WHO=$(who am i | sed -e 's/ .*//'`) 

,並使用提取的登錄的ID:

ID_WHO=$(id -u $WHO) 

我會揪出C庫相當於稍後。

1

如何:

#!/usr/bin/ksh 
username=`id | cut -d"=" -f2 | cut -d" " -f1` 

if [ $username == "0(root)" ] 
then 
    print "Yes, the user is root" 
else 
print "Sorry! the user $username, is not a root" 
fi