Jalankan ./script.sh vs bash script.sh - izin ditolak

44

Ketika saya mencoba untuk berlari ./script.shsaya dapat Permission deniedtetapi ketika saya menjalankan bash script.shsemuanya baik-baik saja.

Apa kesalahan yang telah aku perbuat?

Piotr Stapp
sumber
Bisakah Anda mengedit pertanyaan untuk memasukkan konten dari garis shebang dan juga output dari getfacl script.sh?
Anthony G - keadilan untuk Monica

Jawaban:

50

Izin POSIX salah

Ini berarti Anda tidak memiliki bit izin eksekusi yang ditetapkan script.sh. Saat berjalan bash script.sh, Anda hanya perlu izin baca untuk script.sh. Lihat Apa perbedaan antara menjalankan "bash script.sh" dan "./script.sh"? untuk info lebih lanjut.

Anda dapat memverifikasi ini dengan menjalankan ls -l script.sh.

Anda bahkan mungkin tidak perlu memulai proses Bash baru. Dalam banyak kasus, Anda bisa menjalankan source script.shatau . script.shmenjalankan perintah skrip di shell interaktif Anda saat ini. Anda mungkin ingin memulai proses Bash baru jika skrip mengubah direktori saat ini atau memodifikasi lingkungan proses saat ini.

Daftar Kontrol Akses

Jika bit izin POSIX diatur dengan benar, Access Control List (ACL) mungkin telah dikonfigurasi untuk mencegah Anda atau grup Anda dari mengeksekusi file. Misalnya izin POSIX akan menunjukkan bahwa skrip shell tes dapat dieksekusi.

$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh

Namun, mencoba untuk mengeksekusi hasil file di:

$ ./t.sh
bash: ./t.sh: Permission denied

The getfaclperintah menunjukkan alasan mengapa:

$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx

Dalam hal ini, grup utama saya adalah domain usersyang telah menjalankan izin yang dicabut dengan membatasi ACL dengan sudo setfacl -m 'g:domain\040users:rw-' t.sh. Pembatasan ini dapat diangkat dengan salah satu dari perintah berikut:

sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh

Lihat:

Filesystem dipasang dengan opsi noexec

Akhirnya, alasan dalam kasus khusus ini karena tidak dapat menjalankan skrip adalah bahwa sistem file tempat skrip berada telah terpasang dengan noexecopsi. Opsi ini mengesampingkan izin POSIX untuk mencegah file apa pun pada sistem file tersebut dieksekusi.

Ini dapat diperiksa dengan menjalankan mountdaftar semua sistem file yang terpasang; opsi mount terdaftar dalam tanda kurung di entri yang sesuai dengan sistem file, misalnya

/dev/sda3 on /tmp type ext3 (rw,noexec)

Anda dapat memindahkan skrip ke sistem file lain yang dipasang atau memasang kembali sistem file yang memungkinkan eksekusi:

sudo mount -o remount,exec /dev/sda3 /tmp

Catatan: Saya telah menggunakan /tmpsebagai contoh di sini karena ada alasan keamanan yang baik untuk tetap /tmpterpasang dengan noexec,nodev,nosuidset opsi.

Anthony G - keadilan untuk Monica
sumber
2
Saya mengatur chmod 777 dan masih memiliki kesalahan ini.
Piotr Stapp
2
Saya tidak memiliki exec pada partisi.
Piotr Stapp
jadi saya tidak punya eksekutif dan tidak terdaftar di fstab. kenapa dia melakukan ini pada partisi non-tmp yang saya miliki?
Deryck
2
Itu adalah opsi noexec di / etc / fstab.
user208145
Saya ingin menambahkan bahwa sebaiknya juga memeriksa apakah folder yang berisi skrip itu "dapat dieksekusi" atau tidak (jadi ia memiliki bendera X atau tidak). Jika tidak, maka skrip hanya dapat dieksekusi oleh pengguna root.
Letokteren
30

Mencoba

chmod 755 script.sh

ini akan membuat file dapat dieksekusi. Lalu coba,

./script.sh

Semoga ini berhasil.

ranga.sl
sumber
2
Saat saya bergabung dengan U&L, saya memformat ulang berdasarkan konvensi, namun ini hampir tidak menambah apa pun pada jawaban sebelumnya.
Archemar
8
terkadang, jawaban terpendek adalah yang terbaik :)
Sameera Kumarasingha
1

Di win7 saya dengan admin menjalankan cmd; Saya memiliki file .sh yang terkait dengan cygwin64 / bin / bash, tetapi diblokir oleh cmd. Tidak ada saran di atas yang membantu (chmod, setfacl, mount).

Solusi di bawah ini berhasil, itu adalah admin sledge-hammer acl-fixer setiap kali folder / file menjadi tidak dapat diakses oleh admin di win7, yang sering kali):

  Start > run cmd as Admin
  c:\> script.sh
    Access is denied.

  cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
  cmd> script.sh
    Access is denied.

  > assoc .sh
  .sh=bash

  > ftype bash
  bash=C:\cygwin64\bin\bash.exe -- "%1" %*

  > bash
  $ FILE=c:/cygwin64/bin/bash.exe
  $ FILE=${FILE////\\} # s,/,\,g

  # Compare these permissions using accesschk by Mark Russinovich 2015
  $ accesschk.exe -lq  $FILE 
  $ accesschk.exe -lq c:/windows/system32/cmd.exe
  # [large output not shown]

  # === Solution: Change windows acl for bash ===
  $ takeown /F $FILE /A > /dev/null
  $ icacls $FILE /t /q /c /reset
  $ icacls $FILE /t /q /c /grant    :r Everyone:F
  $ icacls $FILE /t /q /c /setowner Administrators  
  # ====

  cmd> script.sh
    OK .. invokes bash
mosh
sumber