问题陈述:测试 Cygwinmintty
bash
会话是否“以管理员身份运行”的最优雅和最强大的方法是什么?
具体来说,为什么呢?mintty
使用 Windows 时,我通常会打开多个终端(mintty
没有选项卡)。最尴尬的是,当我需要找到一个终端窗口时,我通过右键单击“以管理员身份运行”来启动它,例如,当我想运行ping
或其他一次性程序时。我想直观地指示终端会话的“以管理员身份运行”性质(通过更改启动文件中的bash
shell 提示符变量)。PS1
~/.bashrc
一些快速的潜在解决方案:
- 我可以比较一些环境变量的值。快速查看
env
输出,可以发现很多差异。但是,很难说哪个在移植到另一台 Windows 机器(可能运行不同版本的 Windows)方面最可靠。 id
,更具体地说,id -Gn
如果以管理员身份运行,则会显示不同的组。在我的 Windows 7 机器中,我已将Administrators
组root
添加到列表中。同样,我不确定这是否可移植。- 我可以尝试将文件写入普通用户无法执行的位置。但我不想将任何文件写入陌生的地方——在某些想象的情况下,这可能会造成破坏(例如,存储介质故障),而且这在我看来非常不雅观。
- 运行一些 Windows 程序,这些程序将通过返回状态或输出指示命令是否以“管理员身份”运行。最好是一些具有与 UNIX 类似目的的程序
id(1)
命令(但原生存在于 Windows 或 Cygwin 中,但没有将 Windows 系统概念过于牵强地翻译为 POSIX 模拟概念)。
有什么更好或更优雅的建议吗?也许 cygwin 提供了专用于此目的的命令实用程序?
更新:97% 重复https://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/- 不同之处在于这里使用bash
而不是 (在我看来很奇怪和过时的) Windows cmd.exe
。请检查那里的答案和评论。
答案1
我刚刚出于同样的原因编写了这个函数。我从来不知道哪个 shell 具有管理员权限。
function isadmin()
{
net session > /dev/null 2>&1
if [ $? -eq 0 ]; then echo "admin"
else echo "user"; fi
}
它改编自这个答案https://stackoverflow.com/a/11995662/307968对于 Windows cmd shell。如果您是管理员,Net Session 将返回 0 状态。
现在我只需要改变我的提示,或者可能是标题栏颜色......
答案2
这个问题的明确答案来自Cygwin 邮件列表。如果启动进程的用户属于组 544(管理员),则该进程以管理员权限运行。此外,从 Cromax 下面的注释中可以看出,组 114(本地帐户和管理员组成员)有时也存在。这两个组的测试是
id -G | grep -qE '\<(114|544)\>'
或者在没有外部调用的情况下在 bash 中,
[[ "${GROUPS[@]}" =~ (^| )(114|544)( |$) ]]
例如,
id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
过去,您还需要检查 /etc/group 中的组 0(根组)。但 Cygwin 中不再安装 /etc/group,如果存在,通常应将其删除,因此不再推荐也检查第 0 组。
答案3
我使用了 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 "
答案4
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\] '