Ketika saya mencoba untuk berlari ./script.sh
saya dapat Permission denied
tetapi ketika saya menjalankan bash script.sh
semuanya baik-baik saja.
Apa kesalahan yang telah aku perbuat?
Ketika saya mencoba untuk berlari ./script.sh
saya dapat Permission denied
tetapi ketika saya menjalankan bash script.sh
semuanya baik-baik saja.
Apa kesalahan yang telah aku perbuat?
Jawaban:
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.sh
atau . script.sh
menjalankan 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.
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 getfacl
perintah 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 users
yang 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:
Akhirnya, alasan dalam kasus khusus ini karena tidak dapat menjalankan skrip adalah bahwa sistem file tempat skrip berada telah terpasang dengan noexec
opsi. Opsi ini mengesampingkan izin POSIX untuk mencegah file apa pun pada sistem file tersebut dieksekusi.
Ini dapat diperiksa dengan menjalankan mount
daftar 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 /tmp
sebagai contoh di sini karena ada alasan keamanan yang baik untuk tetap /tmp
terpasang dengan noexec,nodev,nosuid
set opsi.
Mencoba
chmod 755 script.sh
ini akan membuat file dapat dieksekusi. Lalu coba,
./script.sh
Semoga ini berhasil.
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
getfacl script.sh
?