Foo*_*ooF 18 windows terminal cygwin bash
问题陈述:测试 Cygwinmintty
bash
会话是否为“以管理员身份运行”的最优雅和健壮的方法是什么?
为什么,具体的?mintty
使用 Windows 时,我通常会打开几个终端(mintty
没有选项卡)。最尴尬的是当我需要找到一个终端窗口时,例如我想运行ping
或其他一次性程序时,我通过右键单击“以管理员身份运行”启动了该窗口。我想以视觉方式指示终端会话的“以管理员身份运行”(通过更改我的启动文件中的bash
shell 提示变量)。PS1
~/.bashrc
一些快速的潜在解决方案:
env
输出,有很多不同之处。然而,很难说哪个在可移植到另一台 Windows 机器(可能运行不同版本的 Windows)方面最可靠。id
,id -Gn
如果以管理员身份运行,则更具体地显示不同的组。在我的Windows 7机器,我必须Administrators
和root
添加到列表中的组。同样,我不确定这是否可移植。id(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 状态。
现在我只需要更改我的提示,或者可能是标题栏颜色....
我使用 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)
归档时间: |
|
查看次数: |
8911 次 |
最近记录: |