【问题标题】:shell script run when I am root but I get a permission denied when it is invoked from a Makefile (still as root)当我是 root 时运行 shell 脚本,但是当我从 Makefile 调用它时我得到一个权限被拒绝(仍然作为 root)
【发布时间】:2015-02-04 22:06:26
【问题描述】:

我需要运行一个调用 shell 脚本的 Make 脚本

我可以直接以 root 身份运行 shell 脚本,但是在 makefile 上运行 make 时(仍以 root 身份),make 被拒绝运行相同的 shell 脚本?

Makefile 中有问题的那一行是:

PLATFORM=$(shell $(ROOT)/systype.sh)

我可以进入并硬编码系统上每个 Makefile 脚本的每个 PLATFORM 变量的值,但这将是没有意义的修复,我想了解为什么会出现 Permission Denied 错误:

make[1]: execvp: ../systype.sh: Permission denied

PS:即使 shell 脚本只包含 lsecho linux,shell 脚本的内容也不是问题,Make 实用程序运行 shell 脚本的权限被拒绝。

PS:我不是make专家,所以如果解释与Make有关,请尽可能具体。

【问题讨论】:

  • 如何手动运行? /path/to/systype.sh? bash /path/to/systype.sh?如果是后者,那么问题很可能是可执行权限。
  • 脚本是否设置了执行标志 (chmod 755 systype.sh)?有shebang线吗?
  • 当我手动运行它时,我使用 .脚本名.sh
  • scriptname.sh 将在没有 x 权限的情况下执行,因为它是一个 shell 脚本(我尝试了两种方式来清除这种可能性)
  • 我的默认 shell 是 bash,您可以从 /etc/passwd root:x:0:0:root:/root:/bin/bash lvignals:x:1000:1000:lvignals 中看到, ,:/home/lvignals:/bin/bash

标签: linux shell makefile


【解决方案1】:

在您上面的 cmets 中,您说当您“手动运行”时使用. scriptname.sh,对吗?您使用. 后跟scriptname.sh

运行脚本,来源脚本。您关于 scriptname.sh 将在有和没有 x 权限的情况下执行的声明,因为它是一个 shell 脚本 是错误的。如果您具有读取权限,则可以source 脚本。但是你不能执行脚本,除非你有执行权限。

“Sourcing”表示没有启动新的 shell:而是您当前的 shell(您在其中键入该命令)读取脚本的 内容 并运行它们,就像您键入它们一样手动,在当前的外壳中。最后,在该脚本中执行的所有副作用(目录更改、变量分配等)在您当前的脚本中仍然可用。

“正在执行”意味着脚本被视为程序,但该程序是一个启动的新 shell,然后读取脚本的内容并执行它。一旦脚本结束,shell 就会退出并且所有副作用都将丢失。

make 中的$(shell ...) 函数不会获取您的脚本(除非您还在那里使用.,但您没有使用)。它将尝试运行您的脚本。您显示的错误意味着 systype.sh 没有设置执行位,或者它有一个无效的 #!线。我想不出其他解释。

如果获取文件确实符合您的要求,那么为什么不在$(shell ...) 中使用您在个人用途中使用的相同方法:

PLATFORM=$(shell . $(ROOT)/systype.sh)

如果更改用户权限不起作用,您确定拥有该脚本的用户与您用来调用 make 的用户相同吗?你说你“以root身份运行”;脚本是root拥有的吗?还是它归您所有并且您正在运行 sudo make 或类似名称?

我不知道你为什么不直接使用:

chmod +x systype.sh

收工。

【讨论】:

    【解决方案2】:

    将执行权限添加到文件组而不是文件用户修复了问题。

    PS:我想知道为什么?似乎 Make 实用程序运行的 shell 脚本与启动 Make 的用户不同...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 2014-12-24
      • 2016-07-08
      相关资源
      最近更新 更多