Sprawdzone metody aliasu polecenia rm i uczynienia go bezpieczniejszym

21

Jakiś czas temu błędnie usunąłem folder domowy, ponieważ uruchomiłem rm -rf *niewłaściwy terminal, którego katalogiem roboczym był folder domowy!

Chciałbym mieć pseudonim dla rmpolecenia, ale tak nie było.

Teraz planuję stworzyć skrypt jako alias rm.

Czy masz jakieś najlepsze praktyki do zasugerowania?

Dzięki.

Vincenzo Pii
źródło
7
Nie dlatego, że nie mam współczucia, ale nie sądzę, że rmjest to niebezpieczne polecenie wymagające aliasu dla bezpieczeństwa. Korzystając z opcji ri f, mówisz powłoce, że wiem, że jest to niebezpieczne, a ja dokładnie się nad tym zastanowiłem i naprawdę chcę to zrobić . Jeśli nie skorzystasz z tych opcji, nie możesz usunąć całego folderu domowego.
user26512,
Czy to pytanie obejmuje te same informacje, co stackoverflow.com/questions/373156/... ?
David Harris,
1
@grossvogel bez obrazy :)! Jednak aliasing tego polecenia jest powszechną praktyką. Wiele osób korzysta z opcji -f, aby uniknąć potwierdzania każdego usunięcia.
23
Pamiętaj, że jeśli użyjesz aliasu rm, przyzwyczaisz się do tego aliasu. Pewnego dnia będziesz w systemie, w którym alias nie istnieje, i zrobisz coś złego, gdy najmniej się tego spodziewasz. I prawdopodobnie nie będzie to twój system.
Stefan Lasiewski
2
@puller Tylko w systemach takich jak RHEL, które są głupio aliasami rmdo rm -i.
Daniel Beck

Odpowiedzi:

30

Jeśli chcesz dostosować rm, nie nazywaj go, rmale swoim imieniem myrm, deleteczy jakkolwiek.

rm='rm -i'Alias jest horror, ponieważ po pewnym czasie używania, można spodziewać rmsię monit domyślnie przed usunięciem plików. Oczywiście, pewnego dnia uruchomisz go z kontem, na którym nie ma ustawionego aliasu, a zanim zrozumiesz, co się dzieje, jest już za późno.

W każdym razie dobrym sposobem na przygotowanie się na utratę lub uszkodzenie pliku jest tworzenie kopii zapasowych.

Szybką alternatywą, która ochroni Cię przed przypadkowym usunięciem lub zastąpieniem pliku, jest użycie systemu plików obsługującego nieograniczoną liczbę migawek, takich jak ZFS. Jeśli częste migawki są wykonywane automatycznie, możesz odzyskać pliki w stanie, w jakim były podczas ostatniej migawki przed zdarzeniem.  

jlliagre
źródło
3
Słyszałem tę historię grozy osobiście od jednego z tych, którzy jej doświadczyli.
Dan D.
Zgadzam się, ale większość ludzi nie ma możliwości przejścia na zupełnie inny system plików.
Peon
Rzeczywiście, to jest powód, dla którego najpierw sugeruję tworzenie kopii zapasowych, funkcja której nie zabrania żaden system plików.
jlliagre
12

Jeśli chcesz zapisać aliasy, ale nie chcesz ryzykować przyzwyczajenia się do poleceń działających w systemie inaczej niż na innych, możesz wyłączyć w rmten sposób

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

Następnie możesz utworzyć własny bezpieczny alias, np

alias remove='/bin/rm -irv'

lub użyj trashzamiast tego.

Dario Seidl
źródło
2
Pamiętaj, że (przynajmniej w niektórych wersjach) musisz zdefiniować aliasy w innej kolejności. Robiąc to w kolejności, którą prezentujesz, określa się removejako echo "rm is disabled, use trash or /bin/rm instead." -irv. I, dla zachowania zdrowego rozsądku, czy nie chciałbyś, aby wiadomość rmodsyła do twojego bezpiecznego removepolecenia?
Scott
Masz rację, odpowiednio zaktualizuję odpowiedź.
Dario Seidl
5

Możesz spróbować użyć trashzamiast tego. Pamiętaj tylko, aby raz na jakiś czas go opróżniać ...

l0b0
źródło
3

Bez konieczności zmiany profilu wszystkich, możesz umieścić plik o nazwie -i w katalogu.

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 
Ciemne serce
źródło
Nie będzie działać, jeśli użytkownik zdecyduje się użyć *. * zamiast tylko *. Ale wciąż fajna sztuczka.
Peon
1
afaik rm -rf. ani rm -rf .. nie może się powieść, ponieważ jesteś obecnie w katalogu.
Peon
@Peon: Wierzę, że masz na myśli .* *raczej niż * .*(co uważam za bardziej powszechne) lub * . *(co powiedziałeś). …………………………………………………………………… Aby ta technika była prawdziwie globalna, musisz to zrobić w każdym katalogu, w którym masz uprawnienia do zapisu . Ale zgadzam się, to fajna sztuczka.
Scott
1

Używam następującego skryptu.

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

Jeśli przypadkowo usuniesz plik, odzyskaj go z $HOME/tmp.

Skrypt przenosi usunięte pliki do tmpkatalogu i usuwa je przy następnym uruchomieniu skryptu usuwania, jeśli czas dostępu upłynie 7 dni później (półautomatyczne czyszczenie $HOME/tmpkatalogu).

użytkownik580224
źródło
-2

W Twoim profilu,

alias rm="rm -i"

źródło
3
Aliasing rm jest, moim zdaniem, dość kiepską radą i tak czy inaczej nie pomoże w przypadku ściągacza.
jlliagre
rm -Idaje to, co najlepsze z obu światów, @jlliagre.
Tamara Wijsman,
@Tom Wijsman, częściowo rzeczywiście. Zmiana zachowania krytycznego standardowego polecenia Unix nadal stanowi potencjalne ryzyko. Jeśli chcesz, aby był interaktywny, nadaj aliasowi inną nazwę.
jlliagre
@jlliagre: Hmm, więc masz na myśli, że skrypty łapią tę zmianę?
Tamara Wijsman,
Proszę przeczytać moją odpowiedź superuser.com/a/382498/19279, aby uzyskać mój punkt widzenia.
jlliagre
-2

Wywołany skrypt dz zawartością mv $* /tmp.

edycja: To zły pomysł; patrz poniżej. Obecnie mam alias d='mv -t /tmp'w sobie .profilezamiast tego.

stek
źródło
2
Ta sugestia jest niebezpieczna i mogłaby a) zastąpić już zniszczone pliki o tej samej nazwie lub b) usunąć całkowicie niepoprawne pliki ( d "foo bar"usunie pliki fooi bar). Prawdopodobnie jest coś bezpieczniejszego #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempa mvskładnia zależy od systemu, ten działa w systemie Linux).
Daniel Beck
2
Dziękuję za wyjaśnienie. Nie mam problemu z problemem a), ale problem b) jest dużym problemem. Zmieniłem dpolecenie alias d='mv -t /tmp'w swoim .profile; Myślę, że to było proste rozwiązanie, którego szukałem.
beefus
-2

Ten kod bash dodaje funkcję rmdo ~/.bash_profilepliku konfiguracyjnego. Po uruchomieniu tego, jeśli napiszesz rm file, przeniesiesz ten plik do/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF
Vicente Gonzalez
źródło
1
Co robi ten skrypt / kod? Wyjaśnij, aby mniej techniczni użytkownicy mogli zrozumieć twoją odpowiedź.
Vylix,
2
Chociaż może to odpowiedzieć na pytanie, lepszym rozwiązaniem byłoby wyjaśnienie, dlaczego tak się dzieje.
DavidPostill
1
To daje odpowiedź na pytanie, ale jest bardzo słabe. Dwie lepsze wersje tej odpowiedzi zostały już opublikowane.
Scott
Ten kod bash dodaje funkcję rmdo ~/.bash_profilepliku konfiguracyjnego. Po uruchomieniu tego pliku, jeśli napiszesz rm file, przeniesiesz ten plik do /tmp.
Vicente Gonzalez
Dziękuję za wyjaśnienie. Czy możesz edytować swoją odpowiedź, aby umieścić ją w samym poście?
Ben N