File program ada di / usr / bin, tetapi tidak dapat digunakan

15

Jelas file saya ada di /usr/bin

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

Namun, ketika saya berusaha untuk chownitu saya menerima kesalahan

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

Upaya lebih lanjut untuk menjalankannya juga gagal!

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

Apa yang terjadi disini?

Jorik
sumber
Poin ketiga bisa terjadi juga jika '/ usr / bin /' tidak ada di PATH Anda. Anda harus menguji dengan /usr/bin/ngrokmenjadi simetri lengkap dari kasus berikut dengan sudo.
Patrick Mevzek

Jawaban:

52

/usr/bin/ngrokakan menjadi symlink yang menunjuk ke mana-mana (atau lebih tepatnya ke file yang tidak ada). Periksa dengan ls -l.

Sven
sumber
13
Kesalahan "tidak bisa dereferensi" adalah hadiah mati di sini. Anda tidak "dereference" file normal, Anda membukanya.
Kevin
1
Atau readlink -f /usr/bin/ngrokuntuk menemukan di mana tautan harus mengarah.
Eric Duminil
ataunamei -l /usr/bin/ngrok
hanshenrik
4

Mengingat chownkesalahannya, kemungkinan yang paling mungkin adalah symlink, seperti dijawab oleh Sven . Namun, hanya untuk referensi jika seseorang berakhir di sini untuk kasus-kasus di mana file ada dan bukan tautan, tetapi memberikan kesalahan perintah-tidak-ditemukan / file-tidak-ditemukan, satu kemungkinan lagi adalah bahwa executable terhubung secara dinamis dan untuk beberapa alasan itu tidak dapat memuat perpustakaan:

  • perpustakaan yang hilang (jalankan lddpada biner untuk melihatnya)
  • loader hilang
  • apparmor menolak akses ke perpustakaan atau loader
  • ...

Juga, untuk skrip, jika penerjemah di shebang tidak dapat dieksekusi karena alasan yang sama, Anda akan mendapatkan kesalahan yang sama.

muru
sumber
Bahkan lebih membingungkan, ini memang dapat mengakibatkan "tidak ada file atau direktori."
rackandboneman
0

Anda juga memiliki opsi untuk mengubah kepemilikan symlink itu sendiri

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

jika Anda tidak ingin (atau memiliki izin) untuk mengubah kepemilikan file target.

weasel5i2
sumber
2
Saya tidak yakin bagaimana ini menjawab pertanyaan - pertanyaannya adalah "Apa yang terjadi di sini?" dan masalahnya adalah file target tidak ada. Ini tidak menyelesaikan masalah dan tidak menjawab pertanyaan.
wizzwizz4
1
@ wizzwizz4 Saya kira Anda juga dapat menafsirkan pertanyaan sebagai "file itu memang ada (symlink adalah file), mengapa ia memberi tahu saya sebaliknya dan mengapa saya tidak bisa mengubah kepemilikannya?" Jawaban ini mencakup interpretasi itu. Sven hanya mengasumsikan (mungkin dengan benar) OP ingin bekerja dengan file target.
JoL
1
@muru Ini tidak berlaku pada sistem Linux, yang tidak memiliki izin untuk symlink. Sebenarnya, Linux adalah salah satu dari sedikit (satu-satunya?) OS keluarga POSIX yang memang memiliki kemampuan untuk mengatur pemilik / grup symlink. Lihat chown(1)halaman manual Linux . Kemungkinan alasan mengapa Linux melakukan hal ini dibahas di unix.stackexchange.com/questions/33180/…
Andrew Henle
2
@AndrewHenle dan bagaimana itu membantu? Mengubah pemilik / grup untuk symlink tidak membuat perbedaan di sini karena izin yang diterapkan saat mengeksekusi selalu dari file target. Jadi Anda bisa memiliki tautan yang dimiliki oleh siapa pun, tetapi mengubah kepemilikan pada tautan itu sama sekali tidak membuat perbedaan dengan izin yang dipertimbangkan saat menjalankannya.
muru
1
@muru dan bagaimana itu membantu? Baca pertanyaan yang sudah saya tautkan karena secara khusus menanyakan: "Di linux dimungkinkan untuk mengubah pemilik atau pemilik grup dari tautan simbolik (symlink). Saya bertanya-tanya mengapa seseorang ingin melakukan itu, karena izin dari symlink tidak digunakan ketika mengakses file melalui itu "
Andrew Henle