Koşmaya çalıştığımda ./script.shanladım Permission deniedama koşarken bash script.shher şey yolunda.
Neyi yanlış yaptım?
Koşmaya çalıştığımda ./script.shanladım Permission deniedama koşarken bash script.shher ş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.shveya . 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
getfaclKomut 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 usersACL'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 noexecseç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, mounttü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: /tmpBurada bir örnek olarak kullandım , çünkü çeşitli seçeneklere bağlı kalmak için iyi güvenlik nedenleri var ./tmpnoexec,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?