'Rm. *' Hiç üst dizini siler mi?


53

İfade .*, geçerli ve üst dizinleri içerecek şekilde bash ile genişletilir:

$ ls -la
total 2600
drwxrwxrwx   2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon  491520 Sep 10 15:34 ..
-rw-r--r--   1 terdon terdon       0 Sep 10 16:22 foo
$ echo .*
. ..

Koşarsam rm -rf .*benim Debian kullanarak GNU bash, version 4.2.36(1)-releaseve rmgelen rm (GNU coreutils) 8.13, bu mesaj çıktı:

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

Bu bir GNU mu yoksa POSIX mi? Yukarıdaki komutun sessizce silineceği herhangi bir * nix sistemi var mı .ve ..?

Ayrıca, bu kabuğun veya rmkomutun kendisinin güvenlik özelliği midir?


4
Bu soru bağlamında olduğunu biliyorum rm, ama yine de beklenmedik sonuçlara sahip olabileceğini kayda değer olduğunu düşündüm chmod, chowneşleştirme yaparken, vb .*.
Aaron Copley

Yanıtlar:


59

İçin POSIX spec son (2017 itibariyle) versiyonu rmyardımcı olan burada (ve önceki bir orada ) ve silinmesini yasaklayan .ve ...

Dosya noktalarından veya nokta noktalarından biri bir işlenenin temel adı (yani, son yol adı bileşeni) olarak belirtilirse veya bir işlenen kök dizine çözümlenirse, rm standart hataya bir tanılama mesajı yazmalı ve hiçbir şey yapmamalı Bu tür operandlarla daha fazlası.

@Jlliagre tarafından belirtildiği gibi, yaklaşık kısmı /SUSv4'te bir eklemedir.

GNU fileutils changelog'daki yorumların eski POSIX özelliklerinde zaten geçerli olduğunu öne sürmesine rağmen, bulabildiğim ve piyasada bulunan en eski Unix özelliği ( XPF4 CAE rev2 (1994)) zaten belirtilmiş .ve ..kaldırılamıyor.

O uygulandığını unutmayın dir/..ve ../de ancak (Solaris 11 ve MacOS gibi UNIX sertifikalı olanlar dahil) bazı uygulamalar hala karşı korumak yok rm -rf ../ya rm -rf .*/).

Tarih

Erken birlik

Unix V3'te (1973) eklenmiş olan -rseçenek rmyalnızca dizinlerin içeriğini siliyor olmasına rağmen, dizinleri rmdirkaldırmak için kullanmanız gerekir .

Bu, Unix V7'de değişti (1979, aynı zamanda Bourne kabuğunu da tanıtan ve çoğu Unicesinin türetildiği sürüm). rm -rşimdi dizinleri de kaldırdık ve ..dizin ağacını silmedik. Adam sayfa devletler:

..Yanlışlıkla böyle bir şey yapmanın antisosyal sonuçlarından kaçınmak için dosyayı kaldırmak yasaktır rm -r .*.

(kişi dahil olduğu için her şeyi sildiğirm -r .* için hala antisosyal olduğunu iddia edebilir .).

Hala kaldırmak için kabul etmedi .o bağlantısını kaldırmak olmaz gerçi .veya ..girdileri. Öyleyse rm -r ., geçerli dizini boşaltmanın etkili bir yoluydu.

Ayrıca, korumanın yalnızca veya ..değil , yalnızca bir argüman için olduğunu unutmayın . Yani, yine de ana dizindeki her şeyi yinelemeli olarak kaldıracaktı.dir/.../..rm -rf ./.*

Bunun, dünyaların içerebilecekleri .ve ..genişlemelerinde kullanabilecekleri hatayı / kötümseriliği gidermek için zaten olduğunu görmek ilginçtir . Yani Forsyth kabuk 80'lerin sonunda (orijinal Minix kabuk ve pdksh temeli), giderilmiştir zsh(1990) ve fish(2005) ancak diğer kabukları ve POSIX özellikle shgenişlemesini gerektirir dil .*dahil etmek .ve ..eğer onlar tarafından döndürülen readdir()( bashsadece kısmen sorunu giderir shopt -s dotglobhariç globs (burada .xxxolanlar) dahil değildir .ya ..ve birlikte ksh, aşağıdakileri yaparak düzeltebilirsiniz FIGNORE='@(.|..)').

Aynı zamanda tam olarak yasaklayan .ne zaman eklendiği her zaman net değildir ve her Unix ile değişir. Aşağıdaki birkaç bulgu.

BSD

Yasaklayıcı .2.9BSD (1983) ve 2.10BSD (1987) ile 4.2BSD (1983) ve 4.3 BSD (1986) arasına bazen eklendi (bkz bu değişiklik unix-tarih-repo 1985 timestamped ).

$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");

İçin dir/.ve dir/..bakın 1988 yılında bu değişikliği (BSD 4.3 Net / 1).

Bu tarihe kadar, rmFreeBSD'nin (ve macOS gibi türevleri) halen geçerli ya da ana dizini üzerine rm -rf ./ya da rm -rf ../olsa boşaltır (bunun için önemlidir rm -rf .*/).

Sistem V

V7'den sonra AT&T Unix türevleri için ne kaynak ne de ikili olarak halka açık bir bilgim yok. Onun çevrimiçi kılavuzda, (Sistem III dayanarak) HPUX hala sadece yasaklar bahseder ..etkili bir muhtemelen en az SysIII silinmesini engel olmazsa bir gösterge olan hem yasaklamaktadır iken .( düzenlemek Şimdi bakarak: SysIII rmkaynak kodu , bu kadar Unix V7'den bu yana neredeyse hiç değişmedi).

Kontrol ettiğim diğer tüm çevrimiçi kılavuzlar siliniyor .veya ..POSIX uyumlu olması beklenen yasak.

Solaris rm, geçerli veya ana dizini rm -rf ./veya üzerine hala boşaltır rm -rf ../.

GNU

GNU fileutils için erken değişiklik günlüğü tüm tarihi bilgiler.

Başlangıçta ne silme iken .veya ..yasaktı, ..ilk yasaklandı ve daha sonra her ikisi (dahil dir/.tüm 1990 ve 1991 yılları arasında,).

diğer

Gördüğümüz gibi, içinde (veya herhangi bir kürenin) zshgenişlemesi .*hiçbir zaman .veya ..( shemülasyon modunda bile) içermez. rm(Eğer eğer olsun yerleşik zmodload zsh/files) bu nedenle tedavi etmez .veya ..özel olarak. Yani, bununla zshyerleşiğini yapabilirsiniz rm -rf .veya rm -rf ..boşaltmak .veya ..ancak rm -rf .*kaldırmaz .ya ...

Meşgul kutusunda rm, silme yasağı .ve ..0.52 (2001) 'de eklenmiştir.


Tuhaf, bunun rm -rf . /(boşluğun notunun) iki uyarı ( .ve için /) yazıp çıkması gerektiğini belirtiyor gibi göründüğü görülüyor;
Kevin,

6
@Kevin Tüm sistemler POSIX uyumlu değil ve kök dizini kısıtlaması yalnızca son POSIX sürümüne açıkça eklendi.
jlliagre 10:13

@jlliagre görüyorum. GNU genellikle POSIX'i (+ uzantılar, tabii ki) uygulamaya çalışır ve bunu koymak istediklerini düşünürdüm, ancak bunu açıklayacak oldukça yeni olsaydı.
Kevin

2
@Stephane: haklısın, ama cevabın başında hala büyük bir "Evet, olabilir! Ama ..." eklerdim. -POSIX uyumlu) sistemler, üst dizinleri silebilirler. Her zaman bu olasılığı belirtmeye çalışıyorum (yani, cevabı bazen okumayı / hatırlamayı zorlaştırsa bile, güvenli tarafta kalmaya çalışıyorum) ^^
Olivier Dulac

1
@ MartinSchröder, BSD'lerde, 2.8BSD ile 2.10BSD arasında (sadece ".." UnixV7'deki gibi yasaklanmadan önce) ve 3BSD ile 4.3RENO arasında bir yere eklenmiştir. SysV sistemlerinde daha az açıktır. Örneğin, HPUX el kitabı yalnızca ".." 'ı yasakladığını ancak gerçekte ikisini de "yasakladığını" iddia ediyor. ve "..", sadece güncel olmayan kılavuzdur.
Stéphane Chazelas 11:13
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.