我正在尝试在Cygwin中运行bash脚本。
我收到Must run as root, i.e. sudo ./scriptname
错误。
chmod 777 scriptname
无济于事。
我已经找到了在Cygwin上模仿sudo的方法,添加root用户,因为调用“su”会呈现错误su: user root does not exist
,任何有用的东西,什么也没找到。
有人有任何建议吗?
答案 0 :(得分:206)
我在SuperUser上回答了这个问题,但只是在OP无视当时唯一回答问题的无用答案之后。
以下是提升Cygwin权限的正确方法,从我在SuperUser上的答案中复制:
我在the cygwin mailing list找到了答案。要在Cygwin中使用提升的权限运行command
,请在命令前添加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上测试。
答案 1 :(得分:47)
您可能需要以管理员身份运行cygwin shell。您可以右键单击快捷方式,然后单击以管理员身份运行或进入快捷方式的属性并在兼容性部分中进行检查。请注意....根权限可能很危险。
答案 2 :(得分:20)
在dotancohen's answer上构建我使用别名:
alias sudo="cygstart --action=runas"
充当魅力:
sudo chown User:Group <file>
如果您安装了SysInternals,您甚至可以非常轻松地以系统用户身份启动命令shell
sudo psexec -i -s -d cmd
答案 3 :(得分:9)
我发现sudo-for-cygwin,也许这会起作用,它是一个客户端/服务器应用程序,它使用python脚本在windows(pty)中生成子进程并桥接用户的tty和进程I / O. / p>
它需要Windows中的python和Python模块greenlet,以及Cygwin中的eventlet。
答案 4 :(得分:3)
似乎cygstart/runas
没有正确处理"$@"
因此具有包含空格的参数的命令(可能还有其他shell元字符 - 我没有检查)将无法正常工作。< / p>
我决定只编写一个小的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
答案 5 :(得分:2)
在this thread中从GitHub增强CygWin SUDO的新提案,名为 TOUACExt :
仍在 Pre-Beta ,但似乎正在运作。
答案 6 :(得分:2)
或者安装syswin包,其中包含一个用于cygwin的端口:http://sourceforge.net/p/manufacture/wiki/syswin-su/
答案 7 :(得分:2)
此答案基于another answer。首先,请确保您的帐户位于管理员组中。
接下来,使用以下内容创建一个通用的“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提示,并且此过程已被推广,因此您可以使用任何类型的命令。
答案 8 :(得分:1)
我通过谷歌来到这里,我实际上相信我已经找到了一种方法来获得cygwin中一个功能齐全的root promt。
以下是我的步骤。
首先,您需要将Windows管理员帐户重命名为“root” 通过打开start manu并输入“gpedit.msc”
来完成此操作编辑条目 “本地计算机政策”&gt; <计算机配置> Windows设置&gt;安全设置&gt;地方政策&gt;安全选项&gt;帐户:重命名管理员帐户
然后,如果帐户尚未启用,则必须启用该帐户。 “本地计算机政策”&gt; <计算机配置> Windows设置&gt;安全设置&gt;地方政策&gt;安全选项&gt;帐户:管理员帐户状态
现在注销并登录root帐户。
现在为cygwin设置一个环境变量。要做到这一点,简单的方法: 右键单击我的电脑&gt;特性
点击(左侧栏)“高级系统设置”
在底部附近点击“环境变量”按钮
在“系统变量”下,单击“新建...”按钮
对于名称不带引号的“cygwin”。 对于该值,请输入您的cygwin根目录。 (我是C:\ cygwin)
按确定并关闭所有内容以返回桌面。
打开Cygwin终端(cygwin.bat)
编辑文件/ etc / passwd 并改变行
<强>管理员强>:未使用的:的 500:503 强>:U-的 MACHINE \管理员下,S-1-5-21-12345678-1234567890- 1234567890-的 500:/家庭/管理员强>:/斌/庆典
对此(您的号码和机器名称会有所不同,只需确保将突出显示的数字更改为0!)
<强>根强>:未使用的:的 0:0 强>:U-的 MACHINE \根下,S-1-5-21-12345678-1234567890- 1234567890-的 0:/根强>:/斌/庆典
现在所有这一切都已完成,下一位将使“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命令,看看是否一切正常。
答案 9 :(得分:1)
对可用的解决方案不满意,我采用了nu774's script来增加安全性并使其更易于设置和使用。该项目可用on Github
要使用它,只需下载cygwin-sudo.py
并通过python3 cygwin-sudo.py **yourcommand**
运行。
您可以为方便起见设置别名:
alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
答案 10 :(得分:0)
使用此命令从任何目录上下文菜单中获取运行bash或cmd的管理窗口。只需右键单击目录名称,然后选择条目或按下高亮按钮。
这是基于chere工具和来自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\""
答案 11 :(得分:0)
使用管理员权限运行cygwin shell和相应子shell的一种非常简单的方法是更改链接的属性,这将打开初始shell。
以下内容适用于Windows 7+(也许适用于以前的版本,但我没有检查过)
我通常从 start 按钮(或桌面)中的cygwin-link启动cygwin shell。 然后,我在选项卡中更改了cygwin-link的属性
/兼容性/权限级别/
并勾选方框,
“以管理员身份运行此程序”
这允许cygwin shell以管理员权限和相应的子shell打开。
答案 12 :(得分:0)
我遇到了这个讨论,寻找有关不同操作系统中sudo
实现的一些细节。阅读它我发现@ brian-white(https://stackoverflow.com/a/42956057/3627676)的解决方案很有用,但可以略微改进。我避免创建临时文件并实现以通过单个脚本执行所有操作。
我还研究了单窗口/控制台内输出改进的下一步。不幸的是,没有任何成功。我试图使用命名管道捕获STDOUT / STDERR并在主窗口中打印。但是子进程没有写入命名管道。但是写入常规文件效果很好。
我放弃了找到根本原因的任何尝试,并按原样保留当前解决方案。希望我的帖子也很有用。
改进:
mintty
或bash
,如果找不到第一个#!/bin/bash # Being Administrators, invoke the command directly id -G | grep -qw 544 && { "$@" exit $? } # The CYG_SUDO variable is used to control the command invocation [ -z "$CYG_SUDO" ] && { mintty="$( which mintty 2>/dev/null )" export CYG_SUDO="$$" cygstart --wait --action=runas $mintty /bin/bash "$0" "$@" exit $? } # Now we are able to: # -- launch the command # -- display the message # -- return the exit code "$@" RETVAL=$? echo "$0: Press to close window..." read exit $RETVAL
答案 13 :(得分:0)
基于@ mat-khor的答案,我使用了syswin su.exe
,将其保存为manufacture-syswin-su.exe
,并编写了该包装脚本。它处理命令的stdout和stderr的重定向,因此可以在管道等中使用。此外,脚本以给定命令的状态退出。
限制:
env USERNAME=...
会覆盖它。如果需要其他选项,脚本将必须区分syswin-su和命令参数,例如在第一个--
处拆分。。
#!/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")
答案 14 :(得分:0)
只需简化已接受的答案,在 Cygwin 终端中复制以下内容即可:
cat <<EOF >> /bin/sudo
#!/usr/bin/bash
cygstart --action=runas "\$@"
EOF
chmod +X /bin/sudo
答案 15 :(得分:-1)
我通常做的是拥有一个注册表“Open Here”帮助程序,以便在我的计算机上的任何地方轻松打开具有管理权限的cygwin shell。
请注意,您必须安装cygwin“chere”软件包,首先使用升级的cygwin shell中的“chere -i -m
”。
假设您的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文件中以运行它...或者您可以手动添加值。
答案 16 :(得分:-1)
我自己无法对此进行全面测试,我没有合适的脚本可以试用它,而且我不是Linux专家,但你可能能够破解足够接近的东西。
我已尝试过这些步骤了,而且他们似乎已经#39;工作,但不知道它是否足以满足您的需求。
为了解决缺乏根源问题。用户:
然后,这会以名为“root&#39;在cygwin中,它与“以管理员身份运行”相关联。在bash.exe文件上可能就够了。
但是你还需要一个sudo。
我伪造了这个(而其他拥有更多Linux知识的人可能会更好地伪造它)通过创建一个名为&#39; sudo&#39;在/ bin中并使用此命令行将命令发送到su:
su -c "$*"
命令行&#39; sudo vim&#39;和其他人似乎对我有用,所以你可能想尝试一下。
有兴趣知道这是否适合您的需要。
答案 17 :(得分:-5)
尝试:
chmod -R ug+rwx <dir>
其中<dir>
是您的目录
想要更改权限。