Làm thế nào tôi có thể thực thi một tập tin mà không có quyền thực thi?


11

Làm cách nào tôi có thể thực thi một tệp mà không cho phép bản thân thực thi quyền (với chmod u+x) cho nó?

Nếu tôi thử và đánh dấu vào dấu kiểm 'Cho phép thực thi tệp dưới dạng chương trình', dấu kiểm sẽ bị xóa ngay lập tức.



1
không phải là toàn bộ quyền của tập tin sao cho điều này KHÔNG xảy ra? : D
galois

Câu trả lời:


14

Kiểm tra quyền sở hữu tập tin

Vui lòng làm điều này trước bất cứ điều gì hơn nữa (trừ khi bạn chắc chắn rằng bạn sở hữu tệp).

Kiểm tra và đảm bảo rằng bạn sở hữu tệp mà bạn đang cố thực hiện bằng một trong các phương pháp sau.

Đồ họa

  1. Nhấp chuột phải vào tập tin.
  2. Nhấp vào 'Thuộc tính'.
  3. Nhấp vào tab 'Quyền'.
  4. Đảm bảo rằng trường 'Chủ sở hữu' cho biết tên người dùng của bạn. Nếu nó không thấy "Thay đổi quyền sở hữu tệp" bên dưới

Dòng lệnh

  1. Thực hiện lệnh này trong một thiết bị đầu cuối

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. Nếu nó in " You don't own the file", xem "Thay đổi quyền sở hữu tệp" bên dưới.

Thay đổi quyền sở hữu tập tin

Thực hiện lệnh này trong một thiết bị đầu cuối

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

Các tập tin thực thi

Một câu trả lời tôi tìm thấy từ một bình luận của Lekensteyn về câu trả lời cho câu hỏi về chmodphân vùng NTFS mà tôi nghĩ xứng đáng với câu hỏi và câu trả lời của riêng mình, hoàn toàn tin tưởng vào Lekensteyn.

Sử dụng lệnh này cho các tệp thực thi (thay thế /path/to/executablebằng đường dẫn chính xác):

  • Tập tin thực thi 64 bit:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • Tệp thực thi 32 bit:

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

Nếu cách trên không hoạt động (hoặc tăng tệp không tìm thấy lỗi), hãy thử sử dụng lệnh này trước lệnh trên

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

Tất cả các lệnh trên sẽ không hoạt động đối với các tập lệnh dựa trên văn bản (Bash, Python, Perl, v.v.), xem bên dưới.

Kiểm tra xem một chương trình là 64 hay 32 bit

Sử dụng lệnh này để tìm hiểu xem một tệp thực thi là bit 32 ( x86) hay 64 ( x86-64)

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

Nếu nó nói i386:x86-64, thì đó là 64 bit. Nếu nó i386chỉ nói , thì đó là 32 bit.


Chữ viết

Đối với các tập lệnh dựa trên văn bản (Bash, Python, Perl, v.v.), bạn nên sử dụng lệnh được chỉ định trong #!dòng đầu tiên trong tệp.

Ví dụ: nếu dòng đầu tiên của tệp là

#!/usr/bin/env python3

sau đó chạy các lệnh này trong một thiết bị đầu cuối (thay thế /path/to/filebằng đường dẫn chính xác)

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

Các .jartệp Java

Đối với các tệp jar thực thi của Java, bạn chỉ cần sử dụng các lệnh này (thay thế /path/to/jarbằng đường dẫn chính xác):

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

Khi bạn không cần cd "$(dirname /path/to/file)"

Đây là những trường hợp có thể xảy ra khi bạn không cần sử dụng cd "$(dirname /path/to/file)"trước khi chạy chương trình với bất kỳ phương pháp nào: Nếu ít nhất một điều là đúng, bạn sẽ không cần cdtrước.

  • Chương trình không tự thực hiện bất kỳ hoạt động tập tin nào (ví dụ: nó chỉ sử dụng apt-get)
  • Chương trình sử dụng cd(hoặc tương đương) để thay đổi thành một đường dẫn tuyệt đối trước khi thực hiện bất kỳ thao tác tệp nào (ví dụ cd "$(dirname "$0")":)
  • Chương trình không tham chiếu bất kỳ đường dẫn tương đối nào (các đường dẫn bắt đầu bằng ./hoặc bắt đầu không có dấu gạch chéo)

Nếu không chắc chắn, hãy thêm cd "$(dirname "$0")"(hoặc tương đương) vào đầu tập lệnh (nếu có) hoặc sử dụng bằng cd "$(dirname /path/to/file)"mọi cách.


1
Bất cứ ai muốn kịch bản này và làm cho nó bao gồm tất cả các khả năng (nếu bạn sử dụng hệ thống tập tin MS rất nhiều ) đều được chào đón. Tôi có thể tự làm điều đó, nhưng đừng tin vào điều đó. (+1 nhận xét này nếu bạn muốn điều này, đủ hỗ trợ và tôi có thể làm điều đó)
kiri

0

Nếu đó là tập lệnh shell, bạn có thể "nguồn" nó từ tập lệnh shell khác, tức là:

#!/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 "$@"

"$ @" Nối các tham số dòng lệnh, nếu cần.

Phải nói rằng, đây có lẽ không phải là giải pháp tốt nhất cho vấn đề tiềm ẩn, nhưng chúng tôi không biết đủ về vấn đề đó để đưa ra giải pháp thay thế.


Tôi không thấy điều này đặc biệt khác vớibash script $@
kiri

Nó không khác nhau về cơ bản trong hoạt động. Rất có thể tôi không hiểu vấn đề gì bạn đang cố gắng giải quyết - Tôi giả định rằng bạn muốn có một cách thức điểm và nhấp để thực thi một tập lệnh (vì bất kỳ lý do gì) không thể thực thi được. "Làm cho cái đó có thể thực thi được và có nguồn khác" là một giải pháp cho vấn đề đó. Nếu đó là vấn đề sai ... tốt :)
Stablesog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.