Bash'te oluşturulan geçici dosyayı okumaya çalışırken izin verilmedi


2

Bir veya daha fazla dosyayı argüman olarak alan ve büyük harfleri küçük harflere dönüştüren bir komut dosyası yazmaya çalışıyorum. Orijinal dosyanın içeriği sadece küçük harflerle değiştirilir.

Argümanlarda verilen bir dosya bulunmalı, normal bir dosya olmalı, okuma / yazma işlemine izin verilmeli ve yürütmede izin verilemez ve boş bırakılamaz.

# We assume the current file is valid.
declare valide="true"

if (("$#" < 1)) ; then
   # Error, you must enter at least one parameter.
   echo -e "Erreur. Vous devez entrer au moins un parametre."
fi

for param in "$@" ; do

   if [ ! -e $param ] ; then
      $valide="false"
   elif [ ! -f $param ] ; then
      $valide="false"
   elif [ ! -r $param ] ; then
      $valide="false"
   elif [ ! -w $param ] ; then
      $valide="false"
   elif [ -x $param ] ; then
      $valide="false"
   elif [ -s $param ] ; then
      $valide="false"
   fi

   if [ $valide=="true" ] ; then
      # Create temporary file.

      ficTemp=$(/usr/bin/mktemp)

      $(tr '[:upper:]' '[:lower:]' < $param > $ficTemp)
      $($ficTemp > $param)
   else
      # Error, the file $param is invalid for this script.

      echo -e "Erreur. Le fichier $param est invalide pour ce script."
   fi

done

Benim sorunum komut dosyasını normal bir kabukta çalıştırdığımda (root değil) şu hatayı alıyorum:

line 45: /tmp/tmp.xxx: Permission denied

İşte bir ls -ld / tmp sonucudur:

drwxrwxrwt. 12 root root 380 May 14 18:35 /tmp

O zaman tüm senaryoyu unutun ve bu izin hatasına odaklanın. Bu kullanıcı / tmp içinde başka dosyalar oluşturabilir mi?
Julie Pelletier

Çıktısını görmek de yararlı olabilir sestatus.
Julie Pelletier

Evet yapabilirim touch /tmp/fileve dosya problem yaratmadı. sestatus, SE Linux'un etkin olduğunu döndürür. Daha fazla bilgiye mi ihtiyacınız var? @JuliePelletier
bestinthewest

AFH ayrıca, senin sorunun doğru cevabı vardır, ancak: (1) Her zaman kabuk değişken referanslar (örn anlatmalısın "$param", "$ficTemp"ve, gerçekten güvenli olması için "$valide") iyi bir nedeniniz olmadıkça, ve sen değil Ne yaptığını bildiğinden eminim. Açıkçası, sen yok gerek gibi basit sabit dizeleri alıntı yapmak "true"ve "false"tabii ki, bu zarar vermez, ancak. Ve do tutmak [:upper:]ve [:lower:]tırnak içinde - [özel bir karakter olduğunu ve aktardığı gerekmektedir. … (Devam ediyor)
G-Man

(Devam)… (2) Test etmek zorunda değilsiniz -e ve -f farklı hata mesajları vermek istemiyorsanız - -ftest başarılı olursa , dosyanın var olduğunu ve -etestin gereksiz olduğunu biliyorsunuzdur . (3) Sebepiniz echo -eolmadıkça kullanmayın - dosya adı ters eğik çizgi içeriyorsa sorun çıkarır. (4) özel bir durum olarak, kısaltabilirsiniz for param in "$@"; doiçin for param do. (5) AFD'nin yanıt ek olarak: İhtiyacınız olmayan (ve olmamalıdır ) $(ve )çevresindeki tr '[:upper:]' '[:lower:]' < "$param" > "$ficTemp"komuta.
G-Man

Yanıtlar:


3

Hangi satırın 45 olduğunu bilmiyorum ama satır $($ficTemp > $param)yanlıştır ve muhtemelen şu hatayı verir: geçici dosyayı bir komut dosyası olarak çalıştırmaya ve çıktısını yazmaya çalışır $param, sonra döndürülen dizeyi çalıştırmaya çalışır.

Yanlış iki açık şey var: -

  1. Alışılmadık bir durum umaskyoksa, geçici dosyayı çalıştırılabilir hale getirmediniz, bu nedenle hatayı.
  2. Komut dosyasının çıktısı yeniden yönlendirilir, bu nedenle hiçbir zaman geri döndürülecek bir şey $()olmaz ve amaç yoktur.

Ne yapmaya çalışıyorsun? Geçici dosyayı orijinalin üzerine geri kopyalamak istiyorsanız, aşağıdakilerden herhangi biri yapacaktır: -

cat $ficTemp > "$param"
cp $ficTemp "$param"
mv $ficTemp "$param"

Bunlardan sonuncusu daha verimlidir, çünkü verilere erişmesi gerekmez ve geçici dosyayı aynı anda kaldırır, ancak orijinal sahip ve erişim izinleri değiştirilir (bunu işaret ettiği için G-Man sayesinde).

Ne yaparsanız yapın "$param", dosya adı veya yoldaki gömülü boşluklara izin vermek için kullanmalısınız .


Harika cevap, hatamı anlıyorum. 45. satır, belirttiğiniz çizgidir. Çok teşekkür ederim!
bestinthewest

cat "$ficTemp" > "$param"veya cp "$ficTemp" "$param"kaynak dosyanın kimliğini ve niteliklerini korumanın iyi yolları olabilir.
G-Man

@ G-Man - Yorumunuz için teşekkürler: Kullanımının niteliği dahil olmak üzere cevabımı güncelledim mv.
AFH
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.