如何在没有执行权限的情况下执行文件?

如何在没有执行权限的情况下执行文件?

我如何才能执行一个文件而不授予自己执行权限(使用chmod u+x)?

如果我尝试勾选“允许作为程序执行文件”复选标记,则复选标记会立即被删除。

答案1

检查文件所有权

在进行任何进一步的操作之前,请先执行此操作(除非您确定您拥有该文件)。

使用以下方法之一检查并确保您拥有您尝试执行的文件。

图形化

  1. 右键单击该文件。
  2. 单击“属性”。
  3. 单击“权限”选项卡。
  4. 确保“所有者”字段显示您的用户名。如果没有看到下面的“更改文件所有权”

命令行

  1. 在终端中执行此命令

     [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. 如果打印“ You don't own the file”,请参阅下面的“更改文件所有权”。

更改文件所有权

在终端中执行此命令

sudo chown $USER:$(id -gn $USER) "/path/to/file"

可执行文件

我从以下网站找到的答案评论经过莱肯施泰因回答为一个问题关于chmodNTFS 分区,我认为它值得有自己的问答,这完全归功于 Lekensteyn。

对可执行文件使用此命令(/path/to/executable用正确的路径替换):

  • 64 位可执行文件:

     /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • 32 位可执行文件:

     /lib/ld-linux.so.2 /path/to/executable
    

如果上述方法不起作用(或出现文件未找到错误),请尝试在上述命令之前使用此命令

cd "$(dirname /path/to/executable)"

以上所有命令将不会适用于基于文本的脚本(Bash、Python、Perl 等),见下文。

检查程序是 64 位还是 32 位

使用此命令可以查明可执行文件是 32 位 ( x86) 还是 64 位 ( x86-64)

objdump -f "$file" | grep '^architecture' | cut -d, -f1 | sed 's/architecture: //'

如果显示i386:x86-64,则为 64 位。如果i386仅显示 ,则为 32 位。


脚本

#!对于基于文本的脚本(Bash、Python、Perl 等),您应该使用文件第一行指定的命令。

例如,如果文件的第一行是

#!/usr/bin/env python3

然后在终端中运行这些命令(/path/to/file用正确的路径替换)

cd "$(dirname /path/to/file)"       # Not strictly necessary, see section below

# Replace '/usr/bin/env python3' with the first line without the front #!
/usr/bin/env python3 /path/to/file  # Use './file' if you want

Java.jar文件

对于 Java 可执行 jar,您可以简单地使用这些命令(/path/to/jar用正确的路径替换):

cd "$(dirname /path/to/jar)"   # Not strictly necessary, see section below
java -jar /path/to/jar

当你不需要cd "$(dirname /path/to/file)"

cd "$(dirname /path/to/file)"在这些可能的情况下,您在使用任何方法运行程序之前都不需要使用:如果至少有一个为真,那么您就不需要cd先使用。

  • 该程序本身不执行任何文件操作(例如:它仅使用apt-get
  • 该程序cd在执行任何文件操作之前使用(或等效方法)更改为绝对路径(例如cd "$(dirname "$0")":)
  • 该程序不引用任何相对路径(以斜杠开头./或不以斜杠开头的路径)

如果不确定,请添加cd "$(dirname "$0")"(或等效)到脚本的顶部(如果适用)或使用cd "$(dirname /path/to/file)"

答案2

如果它是一个 shell 脚本,你可以从另一个 shell 脚本中“获取”它,即:

#!/bin/bash
# This script runs another script indirectly, by sucking in its contents and evaluating inline:

source /path/to/script/which/lost/its/exec/flag "$@"

如果需要,“$@”会附加命令行参数。

话虽如此,这可能不是解决根本问题的最佳方案,但我们对该问题了解不够,无法提供替代方案。

相关内容