2010-10-25 73 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); 
}