【问题标题】:"Permission Denied" using cygwin in Windows在 Windows 中使用 cygwin “权限被拒绝”
【发布时间】:2010-12-18 19:09:09
【问题描述】:

背景: 我正在尝试编写一个 [.bat] 文件,这样我可以双击它并调用一个 bash 脚本。 bash 脚本将启动一些 Windows GUI 应用程序来监控 GPU/CPU 温度。我刚刚重新安装了 cygwin v1.7.7-1(今天下载)和 windows 7。

代码: monitor-temps.bat:

C:\cygwin\bin\bash.exe ~/bin/monitor-temps.bash
pause

代码: 监视器-temps.bash:

#!/usr/bin/bash
"/cygdrive/c/Users/michael/Desktop/apps_and_drivers/GPU-Z.0.4.8.exe" &

输出: 双击 [.bat] 文件后,我得到一个:

C:\Users\michael\Desktop>C:\cygwin\bin\bash.exe ~/bin/monitor-temps.bash

C:\Users\michael\Desktop>pause
Press any key to continue . . . /home/michael/bin/monitor-temps.bash: line 2: /cygdrive/c/Users/michael/Desktop/apps_and_drivers/GPU-Z.0.4.8.exe: Permission denied

当我 cd 到目录并手动执行应用程序时,我仍然遇到相同的权限错误。

权限: 根据我在 Linux 中权限问题的经验,一切看起来都不错,因为我是我认为的用户,并且文件具有预期的权限:

$ whoami
michael

$ ls -l GPU*
-rwx------+ 1 michael        None 890720 2010-12-01 19:23 GPU-Z.0.4.8.exe

问题: 有谁知道如何解决这一问题?我错过了什么吗?

【问题讨论】:

    标签: windows-7 cygwin file-permissions


    【解决方案1】:

    作为一名开发人员,我在我的 Windows 环境中使用快捷方式来提供与 Linux 类似的命令行界面 (CLI),并在尝试解压缩文件时遇到了同样的问题。

    解决方法是将快捷方式设置为“以管理员身份运行”。

    如果您使用此方法访问您的 Cygwin 环境,请转到快捷方式的属性,选择“高级”按钮以获取“以管理员身份运行”选项,选中该框,单击“确定”。你走吧! 您还可以设置批处理文件来执行此操作,方法是创建一个快捷方式并执行上述操作。

    希望有帮助!

    【讨论】:

    • 比弄乱 setfacl 简单得多,这对我没有用。只需右键单击 Cygwin 图标,选择“以管理员身份运行”,然后编译时文件夹创建就开始工作了!谢谢,@Darkstrumm!
    • 我需要编辑/etc/nsswitch.conf 来修复配置文件问题,并且以管理员身份启动终端是唯一允许我这样做的方法。谢谢!
    • 此提示不适用于网络驱动器。 “以管理员身份运行”模式仅限制对 /cygdrive/c 的访问。
    【解决方案2】:

    我认为您必须更改目录或文件权限。如果要更改文件或目录的权限,则必须在代码中添加完整路径。

    如果您想更改 C:\yourDirectory 上 cocos2d-x 文件夹的权限(我在 Windows 上;在 Mac 上它将是 / 而不是 \)在 cygwin 控制台上编写代码:

    chmod -R 775 /cygwindrive/c/yourDirectory
    

    注意:如果它在 C: 驱动器中,您必须以管理员身份运行它。

    【讨论】:

    • 这对我来说在 C:/ 中不起作用。权限被拒绝,必须以管理员身份运行 cygwin 控制台。
    • 更改 bash 文件的权限对我来说已经足够了。
    【解决方案3】:
    • 使用cat /proc/mountsmount 检查挂载表,并确保//usr/bin/usr/lib 之外的每个挂载点都有noacl 标志。如果它丢失,请更正 /etc/fstab 并重新启动。 (重新启动为我同步了根挂载点的noacl 标志,我不知道是否可以在不重新启动的情况下实现相同的效果)。

    • 根据文件检查 icacls 输出中的 NULL SID 记录和其他奇怪记录。它们出现在 Cygwin 中的 POSIX ACL 转换层写入时添加(在 /etc/fstab 中使用“noacl”允许禁用它,但损坏已经造成)。

      如果包含的父项具有 NULL SID 记录,则仅在文件上重置 Windows ACL 可能还不够。一个人必须跑

      icacls c:\cygwin64 /reset /t /l /c
      

      从命令提示符中删除每个文件和目录中 Windows ACL 中的无关记录。

    更新 其他命令重置所有权、删除默认 ACL 并显示更改前后已知二进制文件的 ACL:

    set croot=c:\cygwin64
    icacls %croot%\bin\ls.exe
    %croot%\bin\getfacl /bin/ls
    takeown /F %croot% /R /D Y > nul
    icacls %croot% /reset /T /C /L /Q
    icacls %croot%\bin\ls.exe
    
    %croot%\bin\getfacl /bin/setfacl
    %croot%\bin\getfacl /bin/find
    %croot%\bin\setfacl -bk /bin/find
    %croot%\bin\find -P / -xdev -exec /bin/setfacl -bk "{}" +
    
    icacls %croot%\bin\ls.exe
    %croot%\bin\getfacl /bin/ls
    

    【讨论】:

    • 除了上述之外,我认为我需要删除继承的权限,为 .\Administrators 和 .\SYSTEM 设置完全访问权限。我想这可以用一个额外的icacls %croot% /grant:r SYSTEM:F Administrators:F /t /c /l /q 编写脚本。
    【解决方案4】:

    解决此问题的最简单方法是:

    1. 下载Sysinternals ProcMon,启动并运行一段时间。
    2. 排除所有产生噪音的进程。
    3. 当日志变得不那么繁忙时,开始您的文件访问尝试。
    4. 在 ProcMon 日志中搜索“拒绝访问”消息。
    5. 调查。应该很容易修复。

    【讨论】:

    • 那么,如果它很容易修复,有什么办法呢?我发现我想要 dlopen 的 .dll 在 procmon 中返回拒绝访问消息
    • @activedecay 查看该行的详细信息(双击),找出哪个进程和哪个用户尝试访问,然后修改 DLL 的文件系统权限,或者DLL 所在文件夹的名称,或者您更改进程运行的用户。
    【解决方案5】:

    -rwx------+ 可能是问题所在。一些隐藏的 acl 可能会为您禁止 x。 然后用 setfacl 重置你的 acl。

    $ cat >/tmp/faclx <<EOF
    user::rwx
    group::r--
    mask:rwx
    other:r--
    EOF
    $ setfacl -f /tmp/faclx /cygdrive/c/Users/michael/Desktop/apps_and_drivers/GPU-Z.0.4.8.exe
    

    或者您需要提升权限:

    $ cygstart  --action=runas /cygdrive/c/Users/michael/Desktop/apps_and_drivers/GPU-Z.0.4.8.exe
    

    【讨论】:

      【解决方案6】:

      我遇到了这个问题,并通过cd 将其修复到包含我刚刚制作的盒子的目录(打包或重新打包)。然后vagrant box add &lt;file.box&gt; --name &lt;name&gt;。我认为 PATHs fvck 事情发生了,并导致它失败。然后仔细检查vagrant box list。然后我mkdir coolbox; cd coolbox。然后我只是vagrant init &lt;name&gt;,这一切都像魔术一样出现。

      【讨论】:

        【解决方案7】:

        git bash,像这样运行命令:cmd "/C postgresql-10.5-2-windows-x64.exe --unattendedmodeui minimal --mode unattended --servicename 'postgreSQL'"

        【讨论】:

          【解决方案8】:

          我在 tee 重定向方面遇到了类似的问题:

          "%CYGWIN_ROOT%\bin\bash.exe" -c "{ cd ""%PWD:\=/%""; CHERE_INVOKING=. ""%CYGWIN_ROOT:\=/%/bin/bash.exe"" -l -i; } 2>&1 | ""%CYGWIN_ROOT:\=/%/bin/tee.exe"" -a ""%PROJECT_LOG_FILE:\=/%"""
          

          如果您想在特定目录(调用登录 shell 之前cd)运行 bash shell,则需要这种代码。

          但在我的情况下它不起作用,因为错误:tee: 'standard output': Permission denied

          更新

          在这里找到了修复:https://sourceware.org/pipermail/cygwin/2020-December/247185.html

          In Win7,
          1) Start command prompt.
          2) Run chcp 65001
          3) Change the font of command prompt to raster font.
          4) Run c:\cygwin\bin\printf "\xce\b1\n"
          
          This causes the error:
          /usr/bin/printf: write error
          
          What weird is that if the font is other than raster font,
          this error does not occur.
          

          光栅字体在 65001 代码页下触发控制台写入错误(在管道的情况下为 permission denied),特别是在 Windows 7 中。

          【讨论】:

            【解决方案9】:

            您可以按照此链接中的说明进行操作:https://cygwin.readthedocs.io/en/latest/install/#install-and-maintain-cygwin 当涉及到授予 Windows 上的文件夹权限时,请使用以下命令: chmod ugo+x /usr/local/bin/cyg-get 从 Cygwin 终端,如本例所示:

            打开 Cygwin64 终端,然后运行:

            chmod -R 775 /usr/local/bin/
            

            【讨论】:

              【解决方案10】:

              只需使用 chmod 命令更改脚本的模式以使其可执行。 有关详细信息,请参阅 man chmod。

              【讨论】:

              • 如果您遇到 windows/cygwin 权限问题,chmod 将无效。相信我,我一直在尝试,但我的文件每次都获得 755 个权限。在 Windows 中更改安全权限也没有好处。
              猜你喜欢
              • 2015-04-28
              • 1970-01-01
              • 2016-01-17
              • 2022-07-21
              • 2014-12-29
              • 1970-01-01
              • 2011-05-13
              • 2013-07-10
              • 2019-03-25
              相关资源
              最近更新 更多