Aşağıda açıklanan her şey bir Bash betiği ile yapılır.
Tanımlanmış bir uzak ana bilgisayar setindeki tanımlanmış bir dosya setinin durumunu yakalamak istiyorum. Bir dosyanın "durumu", dosya türüne bağlıdır:
- Düzenli dosya: tam yol, dosyanın içeriği, mod, sahip, grup
- Sembolik link: bağlantının tam yolu, sivri yol, mod (daima 777), sahip, grup
- Dizin: tam yol, mod, sahip, grup
Uzak bir dosyanın durumunu temsil etmek için bir yerel dosya oluştururken, aynı tam yoldaki ancak yukarıda belirtilen özelliklerin bir karma değerini yerel dosya adına ekleyerek farklı ana bilgisayarlarda farklı olan dosyaları ayırt ediyorum. Daha sonra uzaktaki dosyayı yukarı katlayın (özyinelemesiz, böylece bir dizin olması durumunda, sadece dizini), SSH'ye bağla, yerel makineme kaldır ve bir dosya eklenmiş olarak dosya adına koy. Katran kullanırım çünkü değer verdiğim özellikleri korur.
HASH=$(ssh -n "$ONE_HOST" "{ cat $ONE_FILE_PATH; stat -c \"%a %u %g %F\" $ONE_FILE_PATH; } | sha512sum")
ONE_HASH=${ONE_HASH:0:20}
TARGET_FILENAME_FOR_COPY="$FILENAME"."$ONE_HASH"
TARGET_PATH_FOR_COPY="$TARGET_DIRECTORY_FOR_COPY"/"$TARGET_FILENAME_FOR_COPY"
ssh -n "$ONE_HOST" \
"tar -C $DIRECTORY --no-recursion -cf - $FILENAME" | \
tar -xf - -C "$TARGET_DIRECTORY_FOR_COPY"
mv "$TARGET_PATH_UNHASHED" "$TARGET_PATH_FOR_COPY"
Bunların hepsi yerinde ve çalışıyor.
Şimdi, durum için normal dosyalar , İçeriği kopyalamak istemediğim hassas dosyaları işlemeye ek bir ihtiyacım var (yine de, içerik karma içinde gösterilmeye devam edecek). Amacım, yukarıda açıklanan süreçte yapacağım aynı yerel dosyayı oluşturmak, ancak uzak dosyanın içeriğini içermek yerine dosyanın boş olması gerekiyor.
Not: Dosyayı kopyalayamıyorum ve ardından içeriğin kopyasını boşaltıyorum. Hassas bir dosya olduğundan, içeriği ağ üzerinden aktarılmamalıdır.
Tar, dosyanın sahibine ve grubuna sahip normal bir dosyanın "kabuğunu" transfer etmek için tar yapmanın bir yolunu bilmiyorum, ancak tarball içerisindeki içeriği ihmal ediyor. Birisi bunu yapmak için katran almanın bir yolunu bilmediği sürece, katran dışındaki bir mekanizmaya bakmak zorunda kalacağımı düşünüyorum.
Bunu en kolay nasıl başarabilirim?
GÜNCELLEME # 1
Deniyorum bir yaklaşım ilk önce dosyanın geçici bir kopyasını yapmaktır (kullanarak cp -p Uzaktaki sistemde umurumda olan dosya özniteliklerini korumak için, söz konusu geçici içerik dosyasını boşaltın. kesmek -s 0 ), ve daha sonra yukarıda tarif edildiği gibi tar / ssh ile yerel makineme kopyalayın. Bu garip ve kararsız. Geçici bir dosya kullanımına başvurmadan bunu yapmanın bir yolunu bulmayı umuyorum.