Bagaimana saya bisa mengeksekusi file tanpa mengeksekusi izin?

11

Bagaimana saya bisa mengeksekusi file tanpa memberi saya mengeksekusi izin (dengan chmod u+x) untuk itu?

Jika saya mencoba dan mencentang tanda centang 'Izinkan menjalankan file sebagai program', tanda centang segera dihapus.

kiri
sumber
1
bukankah seluruh titik izin file sehingga ini TIDAK terjadi? : D
galois

Jawaban:

14

Periksa kepemilikan file

Silakan lakukan ini sebelum hal lain (kecuali Anda yakin Anda memiliki file).

Periksa dan pastikan Anda memiliki file yang Anda coba jalankan dengan salah satu metode berikut.

Grafis

  1. Klik kanan file tersebut.
  2. Klik 'Properti'.
  3. Klik tab 'Izin'.
  4. Pastikan bidang 'Pemilik' menyebutkan nama pengguna Anda. Jika tidak melihat "Ubah kepemilikan file" di bawah

Garis komando

  1. Jalankan perintah ini di terminal

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. Jika mencetak " You don't own the file", lihat "Ubah kepemilikan file" di bawah.

Ubah kepemilikan file

Jalankan perintah ini di terminal

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

File yang Dapat Dieksekusi

Sebuah jawaban yang saya temukan dari komentar oleh Lekensteyn pada jawaban untuk pertanyaan tentang chmodpartisi NTFS yang saya pikir pantas untuk pertanyaan dan jawaban sendiri, kredit penuh untuk Lekensteyn.

Gunakan perintah ini untuk file yang dapat dieksekusi (menggantikan /path/to/executabledengan jalur yang benar):

  • File yang dapat dieksekusi 64 bit:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • File yang dapat dieksekusi 32 bit:

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

Jika hal di atas tidak berhasil (atau menimbulkan file tidak ditemukan kesalahan), coba gunakan ini sebelum perintah di atas

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

Semua perintah di atas tidak akan berfungsi untuk skrip berbasis teks (Bash, Python, Perl, dll.), Lihat di bawah.

Periksa apakah suatu program 64 atau 32 bit

Gunakan perintah ini untuk mencari tahu apakah executable adalah 32 ( x86) atau 64 ( x86-64) bit

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

Jika dikatakan i386:x86-64, maka itu 64 bit. Jika i386hanya mengatakan , maka itu 32 bit.


Skrip

Untuk skrip berbasis teks (Bash, Python, Perl, dll.), Anda harus menggunakan perintah yang ditentukan pada #!baris pertama dalam file.

Misalnya, jika baris pertama file adalah

#!/usr/bin/env python3

kemudian jalankan perintah ini di terminal (mengganti /path/to/filedengan jalur yang benar)

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

.jarFile Java

Untuk jar Java yang dapat dieksekusi, Anda cukup menggunakan perintah ini (mengganti /path/to/jardengan jalur yang benar):

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

Ketika Anda tidak membutuhkannya cd "$(dirname /path/to/file)"

Ini adalah keadaan yang memungkinkan di mana Anda tidak perlu menggunakan cd "$(dirname /path/to/file)"sebelum menjalankan program dengan metode apa pun: Jika setidaknya ada satu yang benar, Anda tidak perlu cdterlebih dahulu.

  • Program tidak menjalankan operasi file apa pun itu sendiri (contoh: hanya menggunakan apt-get)
  • Program menggunakan cd(atau setara) untuk mengubah ke jalur absolut sebelum melakukan operasi file apa pun (contoh cd "$(dirname "$0")":)
  • Program tidak mereferensikan jalur relatif apa pun (jalur yang dimulai dengan ./atau dimulai tanpa garis miring)

Jika tidak yakin, tambahkan cd "$(dirname "$0")"(atau setara) ke bagian atas skrip (jika ada) atau gunakan cd "$(dirname /path/to/file)"pula.

kiri
sumber
1
Siapa pun yang ingin script ini dan membuatnya untuk menutupi semua kemungkinan (jika Anda menggunakan MS filesystem banyak ) dipersilahkan untuk. Saya mungkin melakukannya sendiri, tetapi jangan mengandalkannya. (Beri komentar ini +1 jika Anda menginginkan ini, dukungan yang cukup dan saya mungkin akan melakukannya)
kiri
0

Jika skrip shell, Anda dapat "sumber" dari skrip shell lain, yaitu:

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

"$ @" Menambahkan parameter baris perintah, jika perlu.

Karena itu, ini mungkin bukan solusi terbaik untuk masalah yang mendasarinya, tetapi kami tidak cukup tahu tentang masalah itu untuk menawarkan alternatif.

Stabledog
sumber
Saya tidak melihat bagaimana ini sangat berbeda denganbash script $@
kiri
Ini tidak berbeda secara fundamental dalam operasi. Kemungkinan besar saya tidak mengerti masalah apa yang Anda coba selesaikan - saya berasumsi bahwa Anda menginginkan cara point-and-klik untuk menjalankan skrip yang (untuk alasan apa pun) tidak dapat dieksekusi. "Buat satu yang bisa dieksekusi dan minta sumber yang lain" adalah salah satu solusi untuk masalah itu. Jika itu masalah yang salah ... baik :)
Stabledog