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

如何在不给自己执行权限(使用chmod u+x )的情况下执行文件?

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

检查文件所有权

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

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

图形

  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" 

可执行文件

我从Lekensteyn关于NTFS分区上关于chmod的问题的答案中找到了答案 ,我认为这个问题应该得到它自己的问题和答案,完全归功于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)"

如果它是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 "$@" 

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

话虽如此,这可能不是解决潜在问题的最佳解决方案,但我们对该问题的了解不足以提供替代方案。