【问题标题】:Permission denied when running without bash在没有 bash 的情况下运行时权限被拒绝
【发布时间】:2014-02-28 19:22:43
【问题描述】:

我有一个脚本可以调用其他一些 bash、python 和 ruby​​ 脚本。该脚本类似于以下内容:

#!/bin/bash

set -x

./aux1.py
./aux2.sh

当我从命令行运行脚本时,它会运行,但会给出以下输出:

./script.sh: line 5: ./aux1.py: Permission denied

aux.py 脚本顶部有 #!/usr/bin/env python;当我从命令行使用./aux.py 调用它时,它很好,但是当以完全相同的方式从这个脚本调用时,我得到了这个错误。奇怪的是,这只发生在我使用./script.sh 运行脚本时;当我使用bash script.sh 运行脚本时,辅助脚本运行良好。

我用的是Linux,为什么会这样?


2014 年 3 月 3 日更新

PATH 中没有任何冲突,所有脚本都是 chmod +rxuname -srvmo给了

Linux 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Dec 13 06:58:20 EST 2013 x86_64 GNU/Linux

uname -a 中没有更多信息。 SELinux 已启用,但我不是管理员,因此无法访问该信息。

【问题讨论】:

  • 我应该补充一点,所有脚本(script.shaux1.pyaux2.py)都具有读取和执行权限。
  • 无法在我的 Fedora 19 系统上重现它。你也可以发布你的aux1.py吗?
  • 另外,检查您的文件是否有本地 UNIX 换行符;如果你有 DOS 换行符,那么 #!/usr/bin/env python 实际上会寻找一个名为 python^M 的解释器,而不是 python
  • 您是否检查了script.sh 中的任何隐藏的、不需要的字符?你可以检查od -c script.sh,或者从头开始制作一个新版本,因为它很小,然后再试一次。
  • 这个问题缺乏足够的信息来诊断问题。 OP 的评论声称存在操作系统级别的权限,并且后续问题(关于文件系统挂载选项、隐藏字符等)尚未得到回应。

标签: linux bash shell


【解决方案1】:

在启动主脚本之前,您必须确保所有下标都获得了正确的权限。特别是您对您(您的用户和文件所有者)执行文件的权限感兴趣。这是关于权限的简短教程。 http://blog.pluralsight.com/linux-file-permissions http://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

如果这是问题(看起来确实如此),更简单的解决方案是运行以​​下命令

chmod u+x script.sh aux1.py aux2.sh

要检查您是否有执行权限,只需运行

ls -l

你应该看到类似

的东西
-rwxr--r-- 1 youruser youruser 26 Feb 28 21:44 script.sh
-rwxr--r-- 1 youruser youruser 32 Feb 28 21:44 aux1.py

您应该在该文件对应的第 4 列中看到一个“x”。

【讨论】:

  • 有一个已删除的答案,诊断和解决方法相同; OP对此发表评论,声称所有文件都具有执行权限。
  • ...如果 OP 在这方面的声明是真的,这可能是在安装了 noexec 标志的文件系统上,或者通过不同方式应用的类似限制(SELinux process-label基于限制,&c)
  • 你说得对,可能是这样。他可能不会简单地将ls -l 的输出发布到工作目录并在此处发布mount?所以我们可以检查这个选项。
  • 几小时前我让他这样做了;没有回应 - 因此投票结束,信息不足。
【解决方案2】:

也许在运行你的脚本之前输入sudo su,这样你就是root用户。脚本完成后,只需键入 exit 即可退出 root。再次输入 exit 以关闭 shell。

:D

【讨论】:

  • 他可能不想以root身份运行这个脚本,并且从shell运行它也可以,所以这似乎是问题
  • 好吧,我试过了。它可能会起作用。如果他是root,则应该没有权限问题。我并不是要以某种方式暗示 shell 脚本是负面的东西(顺便说一句),我不确定你是如何得出这个结论的。 Shell 脚本摇滚。大声笑。
  • @user_loser,没有 +x 的文件无法使用 exec() 系列系统调用执行,即使是 root。
  • ...嗯,这里他们有+x但没有+r的可能性。在这种情况下,成为 root 会有所作为,但设置 +r 是正确的。
  • @CharlesDuffy 令人着迷......我不知道这一点。也许使用chmod +x 是个好主意?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2011-08-20
  • 2014-06-21
相关资源
最近更新 更多