Koşmaya çalıştığımda ./script.sh
anladım Permission denied
ama koşarken bash script.sh
her şey yolunda.
Neyi yanlış yaptım?
Koşmaya çalıştığımda ./script.sh
anladım Permission denied
ama koşarken bash script.sh
her şey yolunda.
Neyi yanlış yaptım?
Yanıtlar:
Bu, yürütme izni bitinin ayarlanmadığı anlamına gelir script.sh
. Çalıştırırken bash script.sh
, sadece okuma iznine ihtiyacınız var script.sh
. Bkz. “Bash script.sh” ve “./script.sh” çalıştırmak arasındaki fark nedir? daha fazla bilgi için.
Bunu çalıştırarak doğrulayabilirsiniz ls -l script.sh
.
Yeni bir Bash işlemi başlatmanız bile gerekmeyebilir. Çoğu durumda, geçerli etkileşimli kabuğunuzdaki komut dosyası komutlarını çalıştırabilir source script.sh
veya . script.sh
çalıştırabilirsiniz. Komut dosyası geçerli dizini değiştirirse veya geçerli işlemin ortamını değiştirirse, muhtemelen yeni bir Bash işlemi başlatmak istersiniz.
POSIX izin bitleri doğru ayarlanmışsa, sizin veya grubunuzun dosyayı yürütmesini engellemek için Erişim Kontrol Listesi (ACL) yapılandırılmış olabilir. Örneğin POSIX izinleri, test kabuğu komut dosyasının çalıştırılabilir olduğunu gösterir.
$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh
Ancak, dosyayı çalıştırma girişimi şöyle sonuçlanır:
$ ./t.sh
bash: ./t.sh: Permission denied
getfacl
Komut nedenini gösterir:
$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx
Bu durumda, birincil grubum domain users
ACL'yi kısıtlayarak yürütme izinlerini iptal eden gruptur sudo setfacl -m 'g:domain\040users:rw-' t.sh
. Bu kısıtlama aşağıdaki komutlardan biriyle kaldırılabilir:
sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh
Görmek:
Son olarak, bu özel durumda betiği çalıştıramamanın nedeni, betiğin üzerinde bulunduğu dosya sisteminin bir noexec
seçenekle donatılmış olmasıdır. Bu seçenek, o dosya sistemindeki herhangi bir dosyanın yürütülmesini önlemek için POSIX izinlerini geçersiz kılar.
Bu, mount
tüm bağlı dosya sistemlerini listelemek için çalıştırılarak kontrol edilebilir; mount seçenekleri dosya sistemine karşılık gelen girişte parantez içinde verilmiştir;
/dev/sda3 on /tmp type ext3 (rw,noexec)
Komut dosyasını başka bir bağlı dosya sistemine taşıyabilir veya yürütmeye izin veren dosya sistemini yeniden bağlayabilirsiniz:
sudo mount -o remount,exec /dev/sda3 /tmp
Not: /tmp
Burada bir örnek olarak kullandım , çünkü çeşitli seçeneklere bağlı kalmak için iyi güvenlik nedenleri var ./tmp
noexec,nodev,nosuid
Deneyin
chmod 755 script.sh
bu dosyayı çalıştırılabilir yapar. O zaman dene,
./script.sh
Umarım bu işe yarar.
Benim win7 benim yönetici cmd çalıştıran; Ben cygwin64 / bin / bash ile ilişkili .sh dosyaları var, ancak cmd tarafından engellendi. Yukarıdaki önerilerden hiçbiri yardımcı olmadı (chmod, setfacl, mount).
Aşağıdaki çözüm işe yaradı, ne zaman klasörler / dosyalar win7'de admin'e erişilemezse, bu genellikle bir yöneticidir.
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
?