Tệp chương trình tồn tại trong / usr / bin, nhưng không thể được sử dụng


15

Rõ ràng tập tin của tôi tồn tại trong /usr/bin

$ ls /usr/bin/ngrok
/usr/bin/ngrok

Tuy nhiên, khi tôi cố gắng chown, tôi nhận được một lỗi

$ sudo chown my_user:users /usr/bin/ngrok
chown: cannot dereference '/usr/bin/ngrok': No such file or directory

Nỗ lực hơn nữa để chạy nó cũng thất bại!

$ ngrok
bash: ngrok: command not found
$ sudo /usr/bin/ngrok
sudo: /usr/bin/ngrok: command not found

Chuyện gì đang xảy ra ở đây?


Điểm thứ ba cũng có thể xảy ra nếu '/ usr / bin /' không có trong PATH của bạn. Bạn nên kiểm tra /usr/bin/ngrokđể có sự đối xứng hoàn toàn của trường hợp sau với sudo.
Patrick Mevzek

Câu trả lời:


52

/usr/bin/ngroksẽ là một liên kết tượng trưng mà không ở đâu (hay đúng hơn là một tệp không tồn tại). Kiểm tra với ls -l.


13
Lỗi "không thể hủy bỏ" là lỗi chết ở đây. Bạn không "dereference" một tập tin bình thường, bạn mở nó.
Kevin

1
Hoặc readlink -f /usr/bin/ngrokđể tìm nơi liên kết nên trỏ đến.
Eric Duminil

hoặcnamei -l /usr/bin/ngrok
hanshenrik

4

Do chownlỗi, khả năng rất có thể là đó là một liên kết tượng trưng, ​​như đã được trả lời bởi Sven . Tuy nhiên, chỉ để tham khảo trong trường hợp ai đó kết thúc ở đây trong trường hợp tệp tồn tại và không phải là liên kết, nhưng đưa ra lỗi không tìm thấy / không tìm thấy tệp, một khả năng nữa là tệp thực thi được liên kết động và vì một số lý do, nó không thể tải các thư viện:

  • thiếu thư viện (chạy lddtrên nhị phân để xem những cái đó)
  • thiếu bộ tải
  • apparmor từ chối truy cập vào thư viện hoặc trình tải
  • ...

Ngoài ra, đối với tập lệnh, nếu trình thông dịch trong shebang không thể được thực thi vì lý do tương tự, bạn sẽ gặp lỗi tương tự.


Thậm chí khó hiểu hơn, điều này thực sự có thể dẫn đến một sự bí ẩn "không có tập tin hoặc thư mục như vậy."
rackandboneman

0

Bạn cũng có tùy chọn thay đổi quyền sở hữu của chính liên kết tượng trưng với

chown -h my_user:users /usr/bin/ngrok

nếu bạn không muốn (hoặc có quyền) thay đổi quyền sở hữu tệp mục tiêu.


2
Tôi không chắc làm thế nào điều này trả lời câu hỏi - câu hỏi là "Chuyện gì đang xảy ra ở đây?" và vấn đề là tập tin đích không tồn tại. Điều này không giải quyết vấn đề và nó không trả lời câu hỏi.
wizzwizz4

1
@ wizzwizz4 Tôi cho rằng bạn cũng có thể diễn giải câu hỏi là "tệp tồn tại (symlink là một tệp), tại sao nó lại cho tôi biết khác và tại sao tôi không thể thay đổi quyền sở hữu?" Câu trả lời này bao gồm sự giải thích đó. Sven chỉ giả định (có thể chính xác) OP muốn làm việc với tệp mục tiêu.
JoL

1
@muru Điều này không áp dụng trên hệ thống Linux, không có quyền đối với các liên kết tượng trưng. Trên thực tế, Linux là một trong số ít (là duy nhất?) Của hệ điều hành POSIX-gia đình mà không có khả năng thiết lập liên kết tượng trưng chủ sở hữu / nhóm. Xem chown(1)trang người đàn ông Linux . Những lý do có thể Linux làm điều này được thảo luận tại unix.stackexchange.com/questions/33180/ Khăn
Andrew Henle

2
@AndrewHenle và làm thế nào để giúp đỡ? Thay đổi chủ sở hữu / nhóm cho một liên kết tượng trưng không có sự khác biệt ở đây vì các quyền được áp dụng khi thực thi luôn thuộc về tệp đích. Vì vậy, bạn có thể có một liên kết thuộc sở hữu của bất cứ ai, nhưng việc thay đổi quyền sở hữu trên liên kết đó hoàn toàn không có sự khác biệt nào đối với các quyền được xem xét khi thực hiện liên kết đó.
muru

1
@muru và làm thế nào để giúp đỡ? Đọc câu hỏi tôi đã liên kết vì nó đặc biệt hỏi: "Trong linux có thể thay đổi chủ sở hữu hoặc chủ sở hữu nhóm của một liên kết tượng trưng (symlink). Tôi đã tự hỏi tại sao ai đó muốn làm điều đó, vì không có quyền của liên kết tượng trưng được sử dụng khi truy cập một tập tin thông qua nó "
Andrew Henle
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.