Bir dosyaya yazma erişimi için invazif olmayan bir şekilde nasıl test edilir?


20

Bir kabuk komut dosyasında, dosyayı gerçekten değiştirmeye çalışmadan bir dosyaya yazma erişimini kolayca ve invazif olmayan bir şekilde nasıl test edebilirim?

Çıktısını ayrıştırabilirim stat, ancak bu gerçekten karmaşık ve belki de kırılgan görünüyor, ancak uygulamaların ve zamanın ne kadar istatistik çıktısının farklı olduğundan emin değilim.

Dosyanın sonuna ekleyebilir ve bunun başarılı olup olmadığını görebilirim, ancak bu potansiyel olarak tehlikeli, iki nedenden dolayı düşünebilirim:

  1. Şimdi eklemeyi kaldırmak zorundayım ve başka bir işlemin dosyaya yazması durumunda, satırım artık sonuncusu olmadığı için bu hemen önemsiz hale geliyor.
  2. Dosyayı okuyan herhangi bir işlem, dosyanın içeriği üzerinde keyfi gereksinimlere sahip olabilir ve ben bu uygulamayı bozmuş olabilirim.

Yanıtlar:


29

Sadece - utillity wbayrağını kullanın test:

[ -w /path/to/file ] && echo "writeable" || echo "write permission denied"

Dosyaya daha sonra yazacaksanız, yine de dosyaya yazamayacağınızı unutmayın. Dosya taşınmış olabilir, izinler değişmiş olabilir, vb. -wYazma izinlerini de algılayabilir, ancak başka bir faktör dosyayı yazılabilir yapmamak için müdahale edebilir .


1
Elbette! Testin kılavuz sayfasını kontrol etmeyi düşünmeliydim. Teşekkür ederim.
user50849

1
@ qweilun bir kabuk yerleşkesidir, ancak adam sayfasını man testveyaman [
kaos

5
@chaos Hem bir kabuk yerleşkesi hem de harici bir çalıştırılabilir - denetype -a
Volker Siegel

1
Kaynak başına testeuidaccessizin izinleri kontrol sadece kullanır . Yazma erişimini engelleyebilecek başka faktörler (örneğin SELinux) yok mu?
zamnuts

2
@BroSlow &&ve ||eşit önceliğe sahiptir. Soldan sağa doğru değerlendirilirler.
Wildcard

11

Başka bir yaklaşım:

if >> /path/to/file
then
    echo "writeable"
else
    echo "write permission denied"
fi

Bu, dosyayı ekleme için açmaya çalışır ve bu başarılı olursa , dosyaya çıktı içeren hiçbir komut çalıştırmaz (yani bir boş komut çalıştır ). 

Varsa, bunun boş bir dosya oluşturduğuna dikkat edin.

-wOperatörü testkomutu sadece yapabiliriz stat ve sonra erişimi olmalıdır gibi görünüyor olmadığını anlamaya çalışın. Alternatifim (yukarıda) testbazı özel koşullarda yaklaşımdan daha güvenilirdir , çünkü erişim kontrolünü kabuk yerine çekirdek tarafından yapılmaya zorlar. Örneğin,

  • dosya Unix olmayan bir dosya sistemindeyse - özellikle Unix olmayan bir dosya sunucusundan uzaktan monte edilmişse - statyanıltıcı bir mod değeri döndürebilir.
  • dosya salt okunur olarak monte edilmiş bir dosya sistemindeyse.
  • dosyanın bir ACL'si varsa ve mod, erişiminizin olması gerektiği gibi görünmesine neden olur, ancak ACL dosyayı reddeder veya tersi.
  • bazı güvenlik çerçeveleri (AppArmor, SELinux,…) dosyaya erişimi reddederse.

3
Ben sadece bu test (Debian üzerinde). Her iki zaman da değiştirilmedi ve bu herhangi bir Unix üzerinde çalışması gereken yöntemdi. Erişim süresi yalnızca dosyadan okuduğunuzda güncellenmelidir, değiştirme süresi yalnızca dosyaya yazılırsa güncellenmelidir. Bu kod da yok. @Schwern: İfadeniz için bir referansınız var mı? Herhangi biriniz denediniz mi?
G-Man

2
PS @muru: Sahip toucholduğum ancak yazma erişimi olmayan bir dosyayı denedim ve başarılı oldu. Sanırım chmoddosya ve chmodgeri döndü. Bu yüzden touchsorunun cevabı olarak kesinlikle işe yaramaz gibi görünüyor.
G-Man

2
@ G-Man ah, bu ilginç. IIRC vim, salt okunur dosyalara yazmak zorunda kaldığında izinleri hızla değiştirme davranışına sahiptir. Kontrol ettim strace, touch' openbaşarısız olur EACCES, ama sonraki çağrı utimensatbaşarılı, bu yüzden touchtüm çıkışları başarıyla düşünüyorum .
muru

2
@muru: Bunu kontrol ettiğin için teşekkürler. utimensat(2)diyor ki, “ İzinler gereksinimleri: 1. yazma erişimi (veya) 2. arayanın etkin kullanıcı kimliği dosyanın sahibiyle eşleşmelidir….”
G-Man 'Eski Monica'yı Geri Yükle'

3
Champignac'ınki gibi diğer problemler: >> filetaşınabilir değildir (örneğin, NULLCMD'yi zsh olarak çalıştırır) true >> fileyerine kullanın. Ve dosya adlandırılmış bir boru ise, kötü yan etkileri vardır.
Stéphane Chazelas

3

G-Man haklı: [ -w ]olmaz hep doğruyu söyle. Mevcut olmayan dosyayla başa çıkmak ve Kabuktan İzin verilmedi mesajı:

( [ -e /path/to/file ] && >> /path/to/file ) 2> /dev/null && 
  echo writable || 
  echo not writable

Güncelleme : Korkutucu görünüyor, değil mi? Evet, öyle. Hmm ... nasıl ifade edilir ... BUNU KULLANMAYIN, beklediğiniz gibi çalışmayı talep ettiği koşullarda olduğunuzu tam olarak bilmiyorsanız. Stephane'nin yorumuna bakın.

Sonuç ne olacak? [ -w ]Gerçeği söylemese bile , işi yapmayı amaçlayan tek komut budur . Olmazsa, suçlayacağız, hata raporları yazacağız ve gelecekte çalışacaktır. Çalışma ve kullanım koşullarını daha iyi kontrol edin [ -w ]; özel durumlar için özel kod yazınız. Geçici çözümlerin kendi koşulları vardır.

[ -w /path/to/file ]

en iyi a priori .


3
Dosya adlandırılmış bir kanalsa, okuma yoksa ve bir okuyucusu olsa bile kötü yan etkilere sahip olacak. test -wçoğu uygulamada kullanımları access(2)izinleri test etmek için yeterli olmalıdır.
Stéphane Chazelas
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.