Cygwin中的root用户/ sudo等效者?


156

我正在尝试在Cygwin中运行bash脚本。

我得到Must run as root, i.e. sudo ./scriptname错误。

chmod 777 scriptname 没有任何帮助。

我一直在寻找在Cygwin上模仿sudo的方法,以添加root用户,因为调用“ su”会导致错误su: user root does not exist,任何有用的东西,却一无所获。

有人有什么建议吗?


您好,KenB,您能为我们提供有关what您要运行的脚本的更多详细信息吗?在cygwin shell中没有等效于'sudo'的权限-权限是启动cygwin shell的win用户的权限,因此KyleWpppd链接可以避免诸如“ sudo unknown command”之类的错误。就您而言,这似乎是您要执行的脚本的特定问题。
Stefano

1
老实说,这是一个很久以前的问题,我实际上不记得该脚本是什么。不过,感谢您的关注。
肯·贝罗斯

Answers:


225

我在SuperUser上回答了这个问题,但仅在OP忽略了当时唯一的问题无用答案之后。

这是在Cygwin中提升权限的正确方法,该方法是从我自己在SuperUser上的答案复制而来的:

在Cygwin邮件列表中找到了答案。要command在Cygwin中以提升的特权运行,请在命令之前添加如下命令cygstart --action=runas

$ cygstart --action=runas command

如果输入了正确的密码,这将打开一个Windows对话框,询问管理员密码并运行命令。

只要~/bin在您的路径中,这很容易编写脚本。创建一个~/bin/sudo具有以下内容的文件:

#!/usr/bin/bash
cygstart --action=runas "$@"

现在使文件可执行:

$ chmod +x ~/bin/sudo

现在,您可以运行具有真正提升权限的命令:

$ sudo elevatedCommand

您可能需要添加~/bin到您的路径。您可以在Cygwin CLI上运行以下命令,或将其添加到~/.bashrc

$ PATH=$HOME/bin:$PATH

在64位Windows 8上进行了测试。

您也可以代替上述步骤,为此命令添加别名~/.bashrc

# alias to simulate sudo
alias sudo='cygstart --action=runas'

12
极好的答案。通过对bash代码进行一些调整(如下所示),我能够从命令行运行提升权限的命令。这是使您的代码正常工作所需的更改:( cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF 我不知道如何在此注释中插入换行符,因此我在代码中添加了“ \ n”)PATH = ...之后的其余部分都很好。
josmith42 2014年

3
哦,我明白了!如果我没记错的话,那是您将文件写入磁盘的方法,而不是打开文本编辑器。好的谢谢!我不知道如何在Bash中使用heredocs!
dotancohen 2014年

8
问题在于它创建了一个全新的终端窗口(通常是主机)。输出未内联到当前端子中。
CMCDragonkai '16

1
运行类似的东西的唯一方法ls是将它包装在一个长运行的进程中,例如薄荷,bash或zsh。但这一切都出现在单独的终端中。在这一点上,我可以使用ConEMU通过GUI打开它。
CMCDragonkai '16

1
没有引号,即使引号引起来的参数也再次在空格中分隔,@ katriel。随着报价,"$@"扩展到像"$1" "$2" "$3" ...和无,$@膨胀到$1 $2 $3...
Palec

51

您可能需要以管理员身份运行cygwin Shell。您可以右键单击该快捷方式,然后单击以管理员身份运行,或者进入快捷方式的属性,然后在“兼容性”部分中对其进行检查。提防.... root权限可能很危险。


1
自从提出此问题以来,没有一个好的答案(相对于此解决方法)三年以来,我在下面的答案中的现有Cygwin窗口找到了提高单个命令权限的正确方法。因此,它的功能与sudoLinux中的功能完全相同。
dotancohen 2014年

在Win10 64上为我工作。必须更改使用rsync从服务器下载的文件的所有权。chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*。没有它,我将无法访问rsynced文件夹和文件。
lowtechsun

25

基于dotancohen的答案,我使用别名:

alias sudo="cygstart --action=runas"

发挥魅力:

sudo chown User:Group <file>

而且,如果您已安装SysInternals,您甚至可以非常轻松地以系统用户身份启动命令外壳

sudo psexec -i -s -d cmd

9

我发现sudo-for-cygwin,也许可以用,这是一个客户端/服务器应用程序,它使用python脚本在Windows(pty)中生成子进程,并桥接用户的tty和进程I / O。

它需要Windows中的python和greenlet中的Python模块,以及Cygwin中的eventlet。


我已经使用了一段时间了,它可以处理诸如nano之类的交互式内容,而不会出现任何问题!
MemphiZ


4

似乎cygstart/runas无法正确处理"$@",因此具有包含空格的参数(也许还有其他shell元字符-我没有检查过)的命令将无法正常工作。

我决定只写一个sudo可以通过正确执行参数的临时脚本来工作的小脚本。

#! /bin/bash

# If already admin, just run the command in-line.
# This works on my Win10 machine; dunno about others.
if id -G | grep -q ' 544 '; then
   "$@"
   exit $?
fi

# cygstart/runas doesn't handle arguments with spaces correctly so create
# a script that will do so properly.
tmpfile=$(mktemp /tmp/sudo.XXXXXX)
echo "#! /bin/bash" >>$tmpfile
echo "export PATH=\"$PATH\"" >>$tmpfile
echo "$1 \\" >>$tmpfile
shift
for arg in "$@"; do
  qarg=`echo "$arg" | sed -e "s/'/'\\\\\''/g"`
  echo "  '$qarg' \\" >>$tmpfile
done
echo >>$tmpfile

# cygstart opens a new window which vanishes as soon as the command is complete.
# Give the user a chance to see the output.
echo "echo -ne '\n$0: press <enter> to close window... '" >>$tmpfile
echo "read enter" >>$tmpfile

# Clean up after ourselves.
echo "rm -f $tmpfile" >>$tmpfile

# Do it as Administrator.
cygstart --action=runas /bin/bash $tmpfile

1
接受的答案在Win7上对我不起作用,但此答案就像一个魅力。我能够使用提升的privs设置exim-config,然后在vim中编辑/etc/exim.conf文件。光滑
nanker

2

该答案基于另一个答案。首先,请确保您的帐户在管理员组中。

接下来,创建具有以下内容的通用“ runas-admin.bat”文件:

@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0" %*
    @goto :EOF
)
FOR %%A IN (%*) DO (
    "%%A"
)
@goto :EOF
@end @ELSE
args = WScript.Arguments;
newargs = "";
for (var i = 0; i < args.length; i++) {
    newargs += "\"" + args(i) + "\" ";
}
ShA=new ActiveXObject("Shell.Application");
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+" "+newargs+"\"","","runas",5);
@end

然后执行如下的批处理文件:

./runas-admin.bat "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"

例如:

./runas-admin.bat "net localgroup newgroup1 /add" "net localgroup newgroup2 /add"

只需确保将每个单独的命令用双引号引起来即可。一旦使用此方法,您将仅获得UAC提示符,并且此过程已经推广,因此可以使用任何类型的命令。


2

此线程中提出了一个新提案,旨在增强来自GitHub的CygWin的SUDO,该提案名为TOUACExt

  • 自动打开sudoserver.py。
  • 超时后自动关闭sudoserver.py(默认15分钟)。
  • 要求UAC提升提示是admin用户的是/否样式。
  • 向非管理员用户请求管理员用户/密码。
  • 可使用管理员帐户远程(SSH)工作。
  • 创建日志。

仍在Pre-Beta中,但似乎正在运行。


1

我通过Google登陆了这里,实际上我相信我已经找到了一种在Cygwin中获得功能全面的root promt的方法。

这是我的步骤。

首先,您需要将Windows管理员帐户重命名为“ root”,方法是打开开始菜单,然后键入“ gpedit.msc”。

编辑“本地计算机策略”>“计算机配置”>“ Windows设置”>“安全设置”>“本地策略”>“安全选项”>“帐户”下的条目:重命名管理员帐户

然后,如果尚未启用该帐户,则必须启用它。本地计算机策略>计算机配置> Windows设置>安全设置>本地策略>安全选项>帐户:管理员帐户状态

现在注销并登录到根帐户。

现在为cygwin设置环境变量。要简单地做到这一点:右键单击我的电脑>属性

单击(在左侧栏上)“高级系统设置”

在底部附近,单击“环境变量”按钮

在“系统变量”下,单击“新建...”按钮

对于名称,请在“ cygwin”前加上引号。对于该值,请在您的cygwin根目录中输入。(我的是C:\ cygwin)

按确定,然后关闭所有菜单,以返回桌面。

打开一个Cygwin终端(cygwin.bat)

编辑文件/ etc / passwd并更改行

管理员:未使用:500:503:U- MACHINE \ Administrator,S-1-5-21-12345678-1234567890-1234567890- 500:/ home / Administrator:/ bin / bash

为此(您的数字和计算机名称将有所不同,只需确保将突出显示的数字更改为0!)

:未使用: 0:0:U- MACHINE \ root,S-1-5-21-12345678-1234567890-1234567890- 0:/ root:/ bin / bash

既然所有的工作都完成了,那么下一位将使“ su”命令正常工作。(不是很完美,但是可以使用足够的功能。我认为脚本不能正确运行,但是,嘿,您已经走了很远,也许您可​​以找到办法。请分享)

在cygwin中运行此命令以完成交易。

mv /bin/su.exe /bin/_su.exe_backup
cat > /bin/su.bat << "EOF"
@ECHO OFF
RUNAS /savecred /user:root %cygwin%\cygwin.bat
EOF
ln -s /bin/su.bat /bin/su
echo ''
echo 'All finished'

注销root帐户,然后重新登录到普通的Windows用户帐户。

完成所有这些操作后,在资源管理器中双击运行新的“ su.bat”。输入密码,然后关闭窗口。

现在,尝试从cygwin运行su命令,看看一切是否正常。


1

对于可用的解决方案不满意,我采用了nu774的脚本来增加安全性并使其更易于设置和使用。该项目可用在Github

要使用它,只需下载cygwin-sudo.py并通过运行python3 cygwin-sudo.py **yourcommand**

为了方便起见,您可以设置别名:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"

0

使用它可以从任何目录上下文菜单中获取运行bash或cmd的管理窗口。只需右键单击目录名称,然后选择条目或单击突出显示的按钮。

这是基于差事工具和不幸的是,对我来说,link_boy的答案无效。使用Windows 8对我来说效果很好

副作用是admin cmd窗口中的颜色不同。要在bash上使用此功能,可以更改admin用户的.bashrc文件。

我无法运行“背景”版本(右键单击进入打开的目录)。随时添加。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="&Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="C:\\cygwin\\bin\\bash -c \"/bin/xhere /bin/bash.exe '%L'\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root]
@="&Root Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root\command]
@="runas /savecred /user:administrator \"C:\\cygwin\\bin\\bash -c \\\"/bin/xhere /bin/bash.exe '%L'\\\"\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd]
@="&Command Prompt Here"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd\command]
@="cmd.exe /k cd %L"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root]
@="Roo&t Command Prompt Here"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root\command]
@="runas /savecred /user:administrator \"cmd.exe /t:1E /k cd %L\""

0

使用cygwin shell和相应的子shell以管理员权限运行的一种非常简单的方法是更改链接的属性打开初始shell。

以下内容适用于Windows 7+(也许也适用于以前的版本,但我尚未检查)

我通常从“ 开始”按钮(或桌面)中的cygwin-link启动cygwin外壳。然后,我在选项卡中更改了cygwin-link的属性

/兼容性/特权级别/

并选中该框,

“以管理员身份运行此程序”

这允许cygwin Shell以管理员权限打开,并且相应的子Shell也可以打开。


唯一的小问题是您无法确定它是否以管理员身份打开。
Edwin Pratt

0

我遇到了这个讨论,以寻求有关sudo在不同操作系统中实现的一些详细信息。阅读它,我发现@ brian-white(https://stackoverflow.com/a/42956057/3627676)的解决方案很有用,但可以稍作改进。我避免了创建临时文件,而是实现了通过单个脚本执行所有操作。

我也研究了改进单个窗口/控制台中输出的下一步。不幸的是,没有任何成功。我试图使用命名管道捕获STDOUT / STDERR并在主窗口中打印。但是子进程没有写入命名管道。但是,写入常规文件效果很好。

我放弃了寻找根本原因的任何尝试,并保留了当前的解决方案。希望我的帖子也能有用。

改进之处:

  • 没有临时文件
  • 没有解析和重构命令行选项
  • 等待提升的命令
  • 如果找不到第一个,请使用minttybash
  • 返回命令退出代码
    #!/ bin / bash

    #作为管理员,直接调用命令
    id -G | grep -qw 544 && {
        “ $ @”
        退出$?
    }

    #CYG_SUDO变量用于控制命令调用
    [-z“ $ CYG_SUDO”] && {
        mintty =“ $(其中mintty 2> / dev / null)”
        出口CYG_SUDO =“ $$”
        cygstart --wait --action = runas $ mintty / bin / bash“ $ 0”“ $ @”
        退出$?
    }

    #现在我们能够:
    #-启动命令
    #-显示消息
    #-返回退出代码
    “ $ @”
    RETVAL = $?

    echo“ $ 0:按下以关闭窗口...”
    读

    退出$ RETVAL


cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"如果参数中有空格怎么不中断?通过cygstart / runas时,它总是对我有用。
布莱恩·怀特

0

根据@ mat-khor的答案,我使用syswin su.exe,将其另存为manufacture-syswin-su.exe,并编写了此包装器脚本。它处理命令的stdout和stderr的重定向,因此可以在管道等中使用。此外,脚本以给定命令的状态退出。

局限性:

  • 目前已将syswin-su选项硬编码为使用当前用户。预先考虑env USERNAME=...到脚本调用覆盖它。如果需要其他选项,脚本将必须区分syswin-su和命令参数,例如,在first处拆分--
  • 如果UAC提示被取消或拒绝,脚本将挂起。

#!/bin/bash
set -e

# join command $@ into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "$@"; ) 2>&1 | perl -nle 'print $1 if /\bset -- (.*)/' )

tmpDir=$(mktemp -t -d -- "$(basename "$0")_$(date '+%Y%m%dT%H%M%S')_XXX")
mkfifo -- "$tmpDir/out"
mkfifo -- "$tmpDir/err"

cat >> "$tmpDir/script" <<-SCRIPT
    #!/bin/env bash
    $cmd > '$tmpDir/out' 2> '$tmpDir/err'
    echo \$? > '$tmpDir/status'
SCRIPT

chmod 700 -- "$tmpDir/script"

manufacture-syswin-su -s bash -u "$USERNAME" -m -c "cygstart --showminimized bash -c '$tmpDir/script'" > /dev/null &
cat -- "$tmpDir/err" >&2 &
cat -- "$tmpDir/out"
wait $!
exit $(<"$tmpDir/status")

-1

我自己无法完全测试,我没有合适的脚本进行尝试,我也不是Linux专家,但是您也许可以破解得足够近。

我已经尝试了这些步骤,但它们似乎“起作用”,但不知道它是否足以满足您的需求。

要解决缺少“ root”用户的问题:

  • 在本地Windows机器上创建一个名为“ root”的用户,使其成为“管理员”组的成员
  • 将所有用户的bin / bash.exe标记为“以管理员身份运行”(显然,您必须在需要时将其打开/关闭)
  • 按住Windows资源管理器中的左Shift键,同时右键单击Cygwin.bat文件
  • 选择“以其他用户身份运行”
  • 输入。\ root作为用户名,然后输入密码。

然后,以cygwin中名为“ root”的用户身份运行您,再加上bash.exe文件上的“以管理员身份运行”可能就足够了。

但是,您仍然需要一个sudo。

我通过在/ bin中创建一个名为'sudo'的文件并使用此命令行将命令发送给su来伪造(其他具有更多Linux知识的人可能会更好地伪造它):

su -c "$*"

命令行“ sudo vim”和其他命令似乎对我来说还可以,所以您可能想尝试一下。

有兴趣知道这是否满足您的需求。


-1

我通常要做的是使用注册表“ Open Here”帮助程序,以便从计算机的任何位置轻松地以管理特权打开cygwin shell。

请注意,您必须安装cygwin“ chere”软件包,请chere -i -m首先从高架的cygwin外壳中使用“ ”。

假设您的cygwin安装在C:\ cygwin中...

这是注册表代码:

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

希望这可以帮助。请让我知道这对你有没有用。谢谢。

PS:您可以获取此代码,将其复制并粘贴并保存在name.reg文件中以运行它...,也可以手动添加值。


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.