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.
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.
Câu trả lời:
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.
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"
You don't own the file
", xem "Thay đổi quyền sở hữu tệp" bên dưới.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"
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ề chmod
phâ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/executable
bằ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.
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ó i386
chỉ nói , thì đó là 32 bit.
Đố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/file
bằ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
.jar
tệ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/jar
bằng đường dẫn chính xác):
cd "$(dirname /path/to/jar)" # Not strictly necessary, see section below
java -jar /path/to/jar
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 cd
trước.
apt-get
)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")"
:)./
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.
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ế.
bash script $@