Çalıştır ./script.sh vs bash script.sh - izin verilmedi


43

Koşmaya çalıştığımda ./script.shanladım Permission deniedama koşarken bash script.shher şey yolunda.

Neyi yanlış yaptım?


Shebang çizgisinin içeriğini ve çıktısını dahil etmek için soruyu düzenleyebilir misiniz getfacl script.sh?
Anthony G - Monica adaleti

Yanıtlar:


49

Yanlış POSIX izinleri

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.

Erişim Kontrol Listeleri

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:

Noexec seçeneğiyle monte edilmiş dosya sistemi

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


2
Chmod 777'yi ayarladım ve hala bu hatayı alıyorum.
Piotr Stapp

2
Bölüm konusunda hiçbir idam yoktu.
Piotr Stapp

bu yüzden hiçbir idam yok lan ve fstab'da listelenmemiş. neden bunu benim sahip olduğum tmp olmayan bölümlerime yapıyor?
Deryck

1
Bu / etc / fstab içindeki noexec seçeneğiydi.
user208145,

Ayrıca betiği içeren klasörün "çalıştırılabilir" olup olmadığını kontrol etmenin akıllıca olduğunu da eklemek isterim (yani X bayrağına sahip olup olmadığını). Olmazsa, komut dosyası yalnızca kök kullanıcı tarafından çalıştırılabilir.
Letokteren

30

Deneyin

chmod 755 script.sh

bu dosyayı çalıştırılabilir yapar. O zaman dene,

./script.sh

Umarım bu işe yarar.


2
U&L’ye gelince, konvansiyona göre yeniden biçimleniyorum, ancak bu önceki cevaba bir şey eklemiyor.
Archemar

8
bazen en kısa cevap en iyisidir :)
Sameera Kumarasingha

1

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.