2010-10-25 84 views
2

我正在開發一個Perl腳本,它在執行開始時檢查root訪問權限。

if ($< != 0) { 
    print "You need to be root"; 
    die " "; 
} 

$<在Windows中如何評估?我搜索谷歌和這裏,但無法找到答案。

我得到的最接近的是perlvar。它在Windows中有特殊變量處理的一些描述,但不適用於這種情況。

$ <

這一進程的實際uid。 (助記符:如果你運行的是setuid,它就是你來自的uid)。你可以通過使用POSIX :: setuid()來同時改變實際的uid和有效的uid。由於更改$ <需要系統調用,請檢查$!在更改後嘗試檢測任何可能的錯誤。

+3

你試過了嗎?這可能是瞭解'$ <'在Windows中的作用的最佳方式。 – 2010-10-25 00:41:15

+0

[我如何以便攜方式在Perl中獲取當前用戶?](http://stackoverflow.com/questions/3526420/how-do-i-get-the-current-user-in-perl -in-a-portable-way) - 假設您需要驗證用戶正在運行腳本。 – Ether 2010-10-25 01:58:08

+0

Opps。是的,忘了說,它似乎總是匹配運行「Strawberry」PERL的Windows XP SP3上的零。 – benc 2010-10-25 02:14:20

回答

10

在我的Win7中,$<$>總是返回0,不管我是否以管理員身份運行,提高管理員或普通用戶的。我認爲Perl就是因爲這一點,因爲Windows上的用戶ID不能簡單地表達爲整數,所以它甚至不嘗試。

事實上,這裏的source code(行1073):

/* Ownership 
* 
* Just pretend that everyone is a superuser. NT will let us know if 
* we don\'t really have permission to do something. 
*/ 

#define ROOT_UID ((uid_t)0) 
#define ROOT_GID ((gid_t)0) 

uid_t 
getuid(void) 
{ 
    return ROOT_UID; 
} 

uid_t 
geteuid(void) 
{ 
    return ROOT_UID; 
} 

gid_t 
getgid(void) 
{ 
    return ROOT_GID; 
} 

gid_t 
getegid(void) 
{ 
    return ROOT_GID; 
} 

int 
setuid(uid_t auid) 
{ 
    return (auid == ROOT_UID ? 0 : -1); 
} 

int 
setgid(gid_t agid) 
{ 
    return (agid == ROOT_GID ? 0 : -1); 
}