我正在尝试在Cygwin中运行bash脚本。
我得到Must run as root, i.e. sudo ./scriptname
错误。
chmod 777 scriptname
没有任何帮助。
我一直在寻找在Cygwin上模仿sudo的方法,以添加root用户,因为调用“ su”会导致错误su: user root does not exist
,任何有用的东西,却一无所获。
有人有什么建议吗?
我正在尝试在Cygwin中运行bash脚本。
我得到Must run as root, i.e. sudo ./scriptname
错误。
chmod 777 scriptname
没有任何帮助。
我一直在寻找在Cygwin上模仿sudo的方法,以添加root用户,因为调用“ su”会导致错误su: user root does not exist
,任何有用的东西,却一无所获。
有人有什么建议吗?
Answers:
我在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'
cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF
我不知道如何在此注释中插入换行符,因此我在代码中添加了“ \ n”)PATH = ...之后的其余部分都很好。
ls
是将它包装在一个长运行的进程中,例如薄荷,bash或zsh。但这一切都出现在单独的终端中。在这一点上,我可以使用ConEMU通过GUI打开它。
"$@"
扩展到像"$1" "$2" "$3" ...
和无,$@
膨胀到$1 $2 $3...
。
您可能需要以管理员身份运行cygwin Shell。您可以右键单击该快捷方式,然后单击以管理员身份运行,或者进入快捷方式的属性,然后在“兼容性”部分中对其进行检查。提防.... root权限可能很危险。
chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*
。没有它,我将无法访问rsynced文件夹和文件。
基于dotancohen的答案,我使用别名:
alias sudo="cygstart --action=runas"
发挥魅力:
sudo chown User:Group <file>
而且,如果您已安装SysInternals,您甚至可以非常轻松地以系统用户身份启动命令外壳
sudo psexec -i -s -d cmd
我发现sudo-for-cygwin,也许可以用,这是一个客户端/服务器应用程序,它使用python脚本在Windows(pty)中生成子进程,并桥接用户的tty和进程I / O。
它需要Windows中的python和greenlet中的Python模块,以及Cygwin中的eventlet。
或安装syswin软件包,其中包括cygwin的su端口:http : //sourceforge.net/p/manufacture/wiki/syswin-su/
似乎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
该答案基于另一个答案。首先,请确保您的帐户在管理员组中。
接下来,创建具有以下内容的通用“ 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提示符,并且此过程已经推广,因此可以使用任何类型的命令。
在此线程中提出了一个新提案,旨在增强来自GitHub的CygWin的SUDO,该提案名为TOUACExt:
仍在Pre-Beta中,但似乎正在运行。
我通过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命令,看看一切是否正常。
对于可用的解决方案不满意,我采用了nu774的脚本来增加安全性并使其更易于设置和使用。该项目可用在Github
要使用它,只需下载cygwin-sudo.py
并通过运行python3 cygwin-sudo.py **yourcommand**
。
为了方便起见,您可以设置别名:
alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
使用它可以从任何目录上下文菜单中获取运行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\""
使用cygwin shell和相应的子shell以管理员权限运行的一种非常简单的方法是更改链接的属性打开初始shell。
以下内容适用于Windows 7+(也许也适用于以前的版本,但我尚未检查)
我通常从“ 开始”按钮(或桌面)中的cygwin-link启动cygwin外壳。然后,我在选项卡中更改了cygwin-link的属性
/兼容性/特权级别/
并选中该框,
“以管理员身份运行此程序”
这允许cygwin Shell以管理员权限打开,并且相应的子Shell也可以打开。
我遇到了这个讨论,以寻求有关sudo
在不同操作系统中实现的一些详细信息。阅读它,我发现@ brian-white(https://stackoverflow.com/a/42956057/3627676)的解决方案很有用,但可以稍作改进。我避免了创建临时文件,而是实现了通过单个脚本执行所有操作。
我也研究了改进单个窗口/控制台中输出的下一步。不幸的是,没有任何成功。我试图使用命名管道捕获STDOUT / STDERR并在主窗口中打印。但是子进程没有写入命名管道。但是,写入常规文件效果很好。
我放弃了寻找根本原因的任何尝试,并保留了当前的解决方案。希望我的帖子也能有用。
改进之处:
mintty
或bash
#!/ 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时,它总是对我有用。
根据@ mat-khor的答案,我使用syswin su.exe
,将其另存为manufacture-syswin-su.exe
,并编写了此包装器脚本。它处理命令的stdout和stderr的重定向,因此可以在管道等中使用。此外,脚本以给定命令的状态退出。
局限性:
env USERNAME=...
到脚本调用覆盖它。如果需要其他选项,脚本将必须区分syswin-su和命令参数,例如,在first处拆分--
。。
#!/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")
我自己无法完全测试,我没有合适的脚本进行尝试,我也不是Linux专家,但是您也许可以破解得足够近。
我已经尝试了这些步骤,但它们似乎“起作用”,但不知道它是否足以满足您的需求。
要解决缺少“ root”用户的问题:
然后,以cygwin中名为“ root”的用户身份运行您,再加上bash.exe文件上的“以管理员身份运行”可能就足够了。
但是,您仍然需要一个sudo。
我通过在/ bin中创建一个名为'sudo'的文件并使用此命令行将命令发送给su来伪造(其他具有更多Linux知识的人可能会更好地伪造它):
su -c "$*"
命令行“ sudo vim”和其他命令似乎对我来说还可以,所以您可能想尝试一下。
有兴趣知道这是否满足您的需求。
我通常要做的是使用注册表“ 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文件中以运行它...,也可以手动添加值。
what
您要运行的脚本的更多详细信息吗?在cygwin shell中没有等效于'sudo'的权限-权限是启动cygwin shell的win用户的权限,因此KyleWpppd链接可以避免诸如“ sudo unknown command”之类的错误。就您而言,这似乎是您要执行的脚本的特定问题。