终端错误:zsh:权限被拒绝:./startup.sh

126

我正在运行一个命令

./startup.sh nginx:start

并且我收到了这个错误信息

zsh: permission denied: ./startup.sh

为什么会发生这种情况?


1
请仔细检查,确保您没有尝试执行名为“./startup.sh”的目录。 - phil1008
9个回答

241

一定要给它执行权限。

cd ~/the/script/folder

chmod +x ./startup.sh

这将给用户、组和其他人都授予执行权限,因此要注意可能存在的安全问题。如需限制权限为单个访问类,请使用:

chmod u+x ./startup.sh

这将仅授予用户执行权限

参考资料


2
如果有人在符号链接方面遇到了这个问题,我刚刚遇到了一个问题,即符号链接具有执行权限,但原始文件没有。听起来很明显,但请确保原始文件也具有相应的权限:facepalm: - Phil Gibbins
1
这样做会有任何安全风险吗? - ScottyBlades
2
@ScottyBlades 你提出了一个很好的观点,当然,将文件设置为可执行可能会导致安全问题,这取决于文件内部的内容。使用chmod +x为用户、组和所有人授予执行权限。如果您想将执行权限授予特定的访问类别,可以在+x之前像参数一样传递它。例如,要仅向用户授予执行权限,可以执行chmod u+x ./script.sh。 - Andrea Golin
太棒了,谢谢你。添加“u”只适用于当前用户。在没有使用“u”的情况下运行命令后是否有任何方法可以应用该限制? - ScottyBlades
u+x会给文件所有者赋予执行权限,但不一定是当前用户。我不知道你在问什么,但是是的,你可以随时使用chmod命令修改文件权限。 - Andrea Golin
顺便提一下,chmod 所做的更改也会保存在 git 历史记录中,因此在提交更改后,在您的 CI 中,脚本也将具有执行权限。 - Peng-Watcher37-Link37

40

或者您可以使用Bash:

bash startup.sh

那么您就不需要执行权限。

在MacOS Catalina中,苹果已将bash替换为zsh作为默认shell。这意味着他们有意在未来删除bash,因此这可能在以后不再是一个选项,但在Catalina上仍然可以使用。


3
为什么bash可以在没有执行权限的情况下工作,但是zsh不行? - dijonkitchen

7
从macOS Catalina开始,您的Mac将使用zsh作为默认登录shell和交互式shell。您也可以在早期版本的macOS中将zsh设置为默认值。
如何更改默认shell: 无论您的用户帐户配置为使用zsh(推荐),bash或其他shell,您都可以从“用户与组”首选项或命令行更改默认shell。
1. 从“用户与组”首选项中 2. 选择苹果菜单>系统偏好设置,然后单击“用户与组”。 3. 单击锁定图标,然后输入您的帐户名称和密码。 4. 在左侧用户列表中控制单击您的用户名,然后选择“高级选项”。 5. 从“登录shell”菜单中选择一个shell,然后单击“确定”以保存更改。
请访问链接获取更多详细信息 - https://support.apple.com/en-in/HT208050

3
您需要为您的文件授予执行权限。以下是一种实现方式。
导航到包含文件的文件夹并运行此命令-
chmod 755 <filename>

数字755的三个数字代表三种用户——拥有者、组和其他用户的权限。
因此,755表示:
数字(八进制) 二进制 读取 写入 执行 用于 7 111 1 1 1 拥有者 5 101 1 0 1 组 5 101 1 0 1 其他用户
因此,该命令为所有三个权限——读取、写入和执行——赋予了拥有者,而仅为组和其他用户赋予了读取和执行权限。
有关MacOS / Linux中权限的更多详细信息,请参见此处- https://askubuntu.com/questions/932713/what-is-the-difference-between-chmod-x-and-chmod-755

2
由于权限问题导致的。要么文件属于其他用户,要么您没有执行该文件的权限。
要解决这个错误,您可以更改文件的所有权(可选)和权限:
更改文件的所有权:
sudo chown $USER startup.sh
更改文件的权限:
sudo chmod +x startup.sh

0

另一个令人烦恼的错误可能是sh脚本中的拼写错误。

在下面的例子中,ZSH的错误信息很令人困惑。ZSH确实告诉你zsh: permission denied: startup.sh。但是你有访问脚本的权限。问题在于脚本中的无效Shebang行:

#!/usr/local/bin sh

正确的Shebang行可以是:

#!/usr/bin/env sh

0

以下内容适用于我,但我不知道为什么。

在进行以下更改之前,我的文件权限为-rwxr-xr-x。即使我有执行权限,但仍然遇到了拒绝访问的错误。

我正在使用vs code编辑器。我执行了chmod +x filename,文件权限仍然保持不变。这一次唯一的区别是我能够运行该文件。文件发生了变化,但看不出来。我之所以说看不出来,是因为在编辑器的源代码控制选项卡中,我的新文件和旧文件看起来完全一样。如果我隐藏我的更改并执行该文件,则会再次出现相同的错误。

我不知道为什么它有效,也不知道它是如何工作的,但值得一试。

如果有人能够解释为什么此前它无效,而我却具有相同的权限,那我将非常高兴?此外,我的文件发生了什么变化,我看不到它们的原因是什么?


我不明白这个回答与页面顶部的问题有何关联,但它应该有。请根据[答案]进行[编辑]或删除回答。否则,它可能会被标记为“不是答案”并被删除。 - Yunnosch

-1

在命令开始前添加sudo,可以节省您的时间,例如:

sudo anyTemninalCommand

不要这样做;它会产生不良副作用,而且可能无法解决你的问题。 - tripleee

-1
请在终端中进入任何目录之前使用“cd”命令。

这不是问题的答案。一旦您获得足够的声望,您将能够评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审查 - ChrisB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接