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

Foo*_*ooF 18 windows terminal cygwin bash

问题陈述:测试 Cygwinmintty bash会话是否为“以管理员身份运行”的最优雅和健壮的方法是什么?

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

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

  1. 我可以比较一些环境变量的值。通过快速查看env输出,有很多不同之处。然而,很难说哪个在可移植到另一台 Windows 机器(可能运行不同版本的 Windows)方面最可靠。
  2. idid -Gn如果以管理员身份运行,则更具体地显示不同的组。在我的Windows 7机器,我必须Administratorsroot添加到列表中的组。同样,我不确定这是否可移植。
  3. 我可以尝试将文件写入普通用户会失败的位置。但我不想将任何文件写入陌生的地方——这在某些想象的场景中可能具有潜在的破坏性(例如,存储介质出现故障),这似乎完全不符合我的口味。
  4. 运行一些 Windows 程序,如果命令以“管理员身份”运行,将通过返回状态或输出指示。最好是一些与 UNIXid(1)命令具有类似目的的命令(但本机存在于 Windows - 或 Cygwin 中,但没有将 Windows 系统概念转换为 POSIX 模拟概念的过分牵强)。

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

更新:https : //stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/ 的 97% 重复- 区别只是在这里使用bash而不是(恕我直言奇怪和古老的)Windows cmd.exe. 请务必检查那里的答案和评论。

And*_*man 19

这个问题的最终答案来自Cygwin 邮件列表。如果启动进程的用户是组 544(管理员)的一部分,则进程以管理员权限运行。同样从 Cromax 下面的评论中,似乎有时也存在组 114(本地帐户和管理员组的成员)。这两组的测试是

id -G | grep -qE '\<(114|544)\>'
Run Code Online (Sandbox Code Playgroud)

或在没有外部调用的 bash 中,

[[ "${GROUPS[@]}" =~ (^| )(114|544)( |$) ]]
Run Code Online (Sandbox Code Playgroud)

例如,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Run Code Online (Sandbox Code Playgroud)

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


小智 10

出于同样的原因,我刚刚编写了这个函数。我永远不知道哪个 shell 具有管理员权限。

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

它改编自这个答案/sf/answers/839696371/ for windows cmd shell。如果您是管理员,网络会话将返回 0 状态。

现在我只需要更改我的提示,或者可能是标题栏颜色....


Ste*_*ven 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 "
Run Code Online (Sandbox Code Playgroud)

例子

  • id 返回相同的值,不推荐使用 schtasks.exe 代替,但这无论是否管理员都有效 (4认同)