Linux 中可执行符号链接到不可执行文件的可能性?

Linux 中可执行符号链接到不可执行文件的可能性?

我有一些 Python 脚本,保存在存储库中;它们是纯文本文件,但如果设置了它们的可执行位,则在线存储库页面将它们作为二进制下载,而不是纯文本页面。因此,我宁愿让这些脚本不可执行。

不过,我也想使用它们。原则上,我可以这样做:

sudo ln -s /path/to/wherever/I/have/put/myscript.py /usr/bin/

...然后,如果脚本是可执行的(并且有 shebang),我可以在命令行上调用:

myscript.py [ARGS]

...这就是我想要的。但是,如果我使脚本本身可执行,那么我就会遇到如上所述的存储库下载问题。而且,只要脚本不可执行,我就必须使用额外的python- 和 a来调用它which(否则python只会在当前目录中查找该文件):

python `which myscript.py` [ARGS]

...这仍然是相当多的打字,我不喜欢。此外,只要文件是不可执行的,my[TAB]即使它位于/usr/bin;中,即使制表符补全也不起作用。只会which起作用。

现在,粗略地说 - 如果我可以对符号链接拥有单独的可执行权限,我可以希望保留原始的不可执行权限,并且仍然能够通过myscript.py命令行直接运行。我不确定 Mac OSX 是否有可能 - 但作为文件权限如何应用于符号链接? - 超级用户请注意,Linux 绝对不提供这样的选项:仅考虑原始文件权限,而不考虑符号链接本身的权限。

所以我想知道:

  • 是否可以使用不同类型的链接(也许是“硬链接”?)来达到这种目的?
  • 是否有某种驱动程序或软件,基本上允许您制作类似于符号链接的东西,但会是源代码的相同副本 - 除了它自己的一组权限之外?

答案1

符号链接不起作用。硬链接(如果可能)也不起作用,因为两个文件将具有相同的权限。但我会执行以下操作:编写一个/usr/bin/myscript.py执行脚本本身的shell 脚本,而不是链接:

#!/bin/sh
exec python /path/to/wherever/I/have/put/myscript.py "$@"

传递"$@"任何参数;如果您的脚本不接受任何参数,您可以安全地删除该部分。

答案2

符号链接不会影响其目标的权限,它只是存储内核自动遵循的路径的一种方式。事实上,许多系统完全忽略了符号链接的权限。

硬链接对您没有帮助,因为这是在文件系统中的多个位置拥有相同文件(相同内容、相同元数据(包括权限))的一种方式。

您可以使用绑定文件系统创建文件系统的备用视图,其中文件具有不同的权限。

bindfs --perms=a+x /path/to/wherever/I/have/put ~/bin/wherever

这将使备用视图中的所有文件都可执行。对于您的情况来说,这可能不是一个方便的方法,但可能对遇到类似问题的其他人有用。

对您而言,真正的解决方案是修复存储库系统,使其不关心权限,假设下载系统能够使文件可执行。如果做不到这一点,我要做的就是在下载后更改文件的权限。

#!/bin/sh
actual-download-command
chmod +x /path/to/wherever/I/have/put/*.py

相关内容