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


Answers:


14

检查文件所有权

请先执行此操作(除非您确定自己拥有该文件)。

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

图形化

  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回答了一个问题,关于chmod上,我认为值得它自己的问题和答案,充分肯定Lekensteyn NTFS分区。

将此命令用于可执行文件(替换/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-6464位。如果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)"任何方法就可以运行该程序:如果至少有一个为true,则不需要cd首先使用。

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

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


1
谁想要这个脚本,并使其覆盖所有的可能性(如果你使用MS文件系统有很多),欢迎。我可能会自己做,但不要指望它。(如果需要,+ 1注释,有足够的支持,我可能会做)
kiri

0

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

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

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


我看不出这与bash script $@
kiri

操作上没有根本不同。很可能我不明白您要解决的问题-我假设您想通过点击的方式来执行(无论出于何种原因)不可执行的脚本。“使其中一个可执行文件,并使其成为另一个文件”是解决该问题的一种方法。如果那是一个错误的问题……好吧:)
Stabledog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.