如何检查cygwin mintty / bash是否以管理员身份运行?


15

问题陈述:测试Cygwin mintty bash会话是否为“以管理员身份运行” 的最优雅,最可靠的方法是什么?

为什么呢?mintty使用Windows时,我通常会打开几个终端(mintty没有选项卡)。最尴尬的是,当我需要找到一个通过右键单击“以管理员身份运行”而启动的终端窗口时,例如,当我想运行ping或执行其他一次性过程时。我想直观地指出终端会话的“以管理员身份运行”(通过更改启动文件中的bashshell提示变量)。PS1~/.bashrc

一些快速的潜在解决方案:

  1. 我可以比较一些环境变量的值。通过快速查看env输出,可以发现很多差异。但是,就移植到另一台Windows机器(也许运行不同版本的Windows)而言,很难确定哪个最可靠。
  2. id,更具体地说,id -Gn如果以管理员身份运行,则显示不同的组。在我的Windows 7计算机中,我Administratorsroot组已添加到列表中。同样,我不确定这是否可移植。
  3. 我可以尝试将文件写入到普通用户失败的位置。但是我不想将任何文件写到陌生的地方-在某些想像的情况下这可能会造成破坏性的破坏(例如存储介质故障),这似乎完全不符合我的口味。
  4. 运行一些Windows程序,如果该命令是以“管理员身份”运行的,则将通过返回状态或输出来指示。最好的用途与UNIX id(1)命令的用途类似(但本机存在于Windows-或Cygwin中,但没有将Windows系统概念转换为POSIX仿真概念)。

还有更好或更优雅的建议吗?也许cygwin提供了专用于此目的的命令实用程序?

更新: 97%重复/programming/4051883/batch-script-how-to-check-for-admin-rights/-区别只是在这里使用bash而不是(恕我直言,怪异而古怪的)Windows cmd.exe。请在此处检查答案和评论。


使用“以管理员身份运行”,除非您这样做,否则即使管理员帐户启动了该过程,该过程也不会提升为管理员权限。 只需创建一个快捷方式,即可始终完成。
Ramhound

1
我建议尝试使用ConEmu。它具有选项卡,可以由管理员以选项卡栏中不同图标指示的方式运行选项卡,并且最重要的是在后台使用控制台,因此本机Windows应用程序可以正常工作,而无需薄荷。
Jan Hudec

2
@Ramhound您是对的,我已经缩小为这个问题的原始问题(区分管理员终端窗口)可以通过以下方式解决mintty:1.以管理员身份运行,2.使用具有不同颜色的不同配置文件设置3.使用替代图标。如果您向公众描述如何创建它,我将给您投票(除非您在回答中说不能在脚本中完成它:-)。
FooF 2013年

1
@FooF-仅仅因为您与管理员级别的用户一起运行进程并不意味着该进程本身已经升级。默认情况下,Windows仅在用户批准此类操作后才取消该进程,因此Windows中的“以管理员身份运行”功能。您还可以向所需的任何组甚至Foo用户组提供ALL权限。
Ramhound

1
@FooF- sudo即使您以root用户身份运行,也可以认为这是必需的。
Ramhound

Answers:


9

出于相同的原因,我只是编写了此函数。我不知道哪个外壳具有管理员权限。

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

它针对Windows cmd shell 从此答案/programming//a/11995662/307968改编而来。如果您是管理员,则网络会话将返回0状态。

现在,我只需要更改提示或标题栏颜色即可。


好发现。尽管似乎在某些极端情况下这也可能失败,但是如果您检查stackoverflow注释。
FooF,2016年

尽管如此,我还是接受了这个答案,因为它指向了一个非常全面的讨论(stackoverflow问题和那里公认的答案目前的得分分别为147和255)。
FooF,2016年

谢谢!我用它来有选择地为用户名上色。如果卖出量增加,我将其涂成红色,否则涂成绿色。如果您打开了许多终端窗口,则有助于跟踪升高的外壳。
HelloGoodbye

16

这个问题的明确答案来自Cygwin邮件列表。如果启动进程的用户属于544组(管理员),则该进程将以管理员权限运行。同样从Cromax的以下评论来看,似乎有时还会出现组114(本地帐户和管理员组成员)。这两组的测试是

id -G | grep -qE '\<(114|544)\>'

例如,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

过去,您还需要检查组0,即/ etc / group中的根组。但是/ etc / group不再安装在Cygwin中,如果存在,通常应将其删除,因此不再建议也检查组0。只是组544。


1
感谢您在Cygwin邮件列表中询问。:-)很高兴知道(模拟/翻译的)组ID在系统之间保持不变。
FooF,2015年

当然...我想了解自己,那里的人也知道
安德鲁·舒尔曼

1
不幸的是,这在Mingw / Msys中不起作用。尽管只有在Windows 7上,史蒂文的答案还是有的
。–麻雀

1
我刚刚尝试过(在W7上),但没有成功,但是我注意到,如果以Window的用户身份也以管理员身份登录,则当Cygwin以管理员身份运行时,会有另一个组弹出id的输出,即114(本地帐户和Administrator组的成员)。因此,regexp应该更新为:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax '18

谢谢。我自己还没有看到,但是我看到114组似乎是一个Administrators组,因此检查它似乎也很合理。我修改了答案。
Andrew Schulman

7

我使用Windows程序的返回值at。我还重新创建了PROMPTING特殊字符的功能\$

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

例子


假设idWindows中没有等效的UNIX 命令,我将其作为正确答案。至少运行at不带任何参数的命令似乎没有任何副作用。.bashrc从现在开始,我将在文件中使用此方法!感谢您的攻击。
FooF 2014年

1
似乎在
Windows8.1

1
@zzapper请更具体。会/不会发生什么?错误讯息?
2014年

4
id返回相同的值,不建议使用schtasks.exe,但无论是否通过admin都可以使用
zzapper 2014年

2

id -G | grep -qE '\<(544|0)\>'似乎对我没有用,因为即使输出升高,我的输出也没有<>或544。但是,由于写入时需要高程%WINDIR%\system32,因此我使用shell函数测试了高程:

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

当应用于史蒂文关于红色哈希字符的出色构想时:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '

1

做只有管理员才能做的事情,并测试成功或失败:-

if touch c:/Users/.x ; then  echo 'ok'  ; fi

要么

touch c:/Users/.x && echo ok

要么

touch c:/Users/.x && \rm c:/Users/.x && echo ok

要么

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin

1

在Windows上的Msys中尝试此操作(我发现接受的答案在Msys中不起作用)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

这依赖于at仅以admin身份运行时返回代码为零。


1
这似乎与@Steven在早期答案中给出的方法相同(根据注释,它似乎在Windows 8.1上不起作用-除非MSYS“ at”是某种方式)。虽然问题是关于Cygwin的,但与类似的MSYS进行比较很有趣。感谢您的贡献。
FooF 2015年

非常相似。但是,我最终遇到了这个问题,试图用它来签入脚本(Win7,Msys)而不是设置bash提示样式,所以我认为这可能对其他这样做的人
有用

我同意有用。
FooF,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.