Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Wel schrijven, niet verwijderen  (gelezen 2547 keer)

Offline Grieteke

  • Lid
Wel schrijven, niet verwijderen
« Gepost op: 2008/03/21, 17:42:32 »
Ik zit nog bij te komen van een ontzettend domme actie. Ik was wat mappen aan het kopieren mbv de terminal:
cp -r map1 map2 doelmapOmdat deze mappen al bestaan in de doelmap en omdat ik graag eerst wil controleren of de mappen goed zijn overgezet gebruik ik cp ipv mv. Als alles goed is wil ik natuurlijk de mappen verwijderen, dus ik druk op 'pijltje omhoog', vervang cp door rm en druk op enter. Later wil ik weer wat kopieren naar de doelmap maar die is verdwenen :s, en dan pas besef ik dat ik een map met meer dan 100 gig aan data heb verwijderd :(. Gelukkig heb ik de afgelopen maanden in het buitenland gezeten (zonder deze computer) en had ik daardoor nog een redelijk recente versie van die map op een externe hd staan.

Maar ik ken mezelf, dit zou zo nog eens kunnen gebeuren. Dus ik vraag me af of er een methode is bepaalde mappen te beschermen zo dat je er wel naar kan schrijven maar ze niet kan verwijden?

Wel schrijven, niet verwijderen
« Reactie #1 Gepost op: 2008/03/21, 18:06:11 »
Dit zou moeten werken:
Maak een nieuwe gebruiker en groep aan:
useradd -s/bin/false -n -d/nonexistent mydummy
sudo chown mydummy:mydummy mijnbelangrijkemap
sudo chmod 1777 mijnbelangrijkemap

Ik weet niet zeker of dit er ook voor zorgt dat je de inhoud van de map niet kan verwijderen, maar zo kan je de map toch al niet verwijderen...

En anders es coreutils patchen.

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Wel schrijven, niet verwijderen
« Reactie #2 Gepost op: 2008/03/21, 18:43:07 »
Okee, betere versie, werkt wel alleen met mappen.

sudo bash
mv /bin/rm /bin/rm.real
cat > /bin/rm << EOF
#!/bin/bash
fullpath () {
tmp=$PWD
cd $1
echo $PWD
cd $tmp
}

rmopts=""

echo $@ | grep -i '\-.*r' > /dev/null || exec rm.real $@
for x in $@; do
  if echo $x | grep '^\-.*' > /dev/null ;then
    rmopts+=$x
    continue
  fi
  if [ -d $x ];then
    if grep `fullpath $x` /etc/rm.conf > /dev/null ; then
      echo "You cannot remove `fullpath $x`."
    else
      rm.real $rmopts $x
    fi
  else
  rm.real $rmopts $x
  fi
done
EOF
echo /pad/naar/beschermde/map >> /etc/rm.conf
echo /pad/naar/beschermde/andere/map >> /etc/rm.conf
exit
Probeer nu maar eens een beschermde map te verwijderen. Je voegt ze gewoon toe aan /etc/rm.conf, en je kan ze niet meer recursief verwijderen. Weet je heel zeker dat je ze wilt recursief verwijderen, gebruik dan rm.real /pad/naar/beschermde/map

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Grieteke

  • Lid
Wel schrijven, niet verwijderen
« Reactie #3 Gepost op: 2008/03/21, 19:14:07 »
Hartstikke bedankt! Dit is precies wat ik wilde (maar niet zelf kon bedenken). Helaas werkt het nog niet helemaal.
Ik heb geprobeerd om dit te runnen als een shell script en door het gewoon te palkken in de terminal. Bij beide methodes krijg ik:
bash: fullpath: command not foundOmdat ik niet helemaal snap hoe deze code werkt en wat het precies doet heb ik geen idee waroom het hier fout gaat.
Zou je misschien de code iets kunnen toelichten zodat ik snap wat er gebeurt? Ik heb redelijk ervaring met programmeren, maar niet zo heel veel met shell scripts ed.

Wel schrijven, niet verwijderen
« Reactie #4 Gepost op: 2008/03/21, 19:46:25 »
Dit gebeurt er (kan je dus zelf stap voor stap doen, evt met een gui) -- alles als root doen:
verplaats /bin/rm naar /bin/rm.real
maak een nieuw bestand genaamd rm in /bin (leeg tekstbestand)
voer het volgende er in in:
#!/bin/bash
fullpath () {
tmp=$PWD
cd $1
echo $PWD
cd $tmp
}

rmopts=""

echo $@ | grep -i '\-.*r' > /dev/null || exec rm.real $@
for x in $@; do
  if echo $x | grep '^\-.*' > /dev/null ;then
    rmopts+=$x
    continue
  fi
  if [ -d $x ];then
    if grep `fullpath $x` /etc/rm.conf > /dev/null ; then
      echo "You cannot remove `fullpath $x`."
    else
      rm.real $rmopts $x
    fi
  else
  rm.real $rmopts $x
  fi
done
maak dit bestand uitvoerbaar voor iedereen (chmod a+x)
maak een bestand genaamd /etc/rm.conf
zet het pad van iedere map die niet verwijderd mag worden hierin.

Dat is het

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Grieteke

  • Lid
Wel schrijven, niet verwijderen
« Reactie #5 Gepost op: 2008/03/21, 20:09:36 »
Het werkt :D.
SeySayux, nogmaals hartstikke bedankt.

Offline Grieteke

  • Lid
Wel schrijven, niet verwijderen
« Reactie #6 Gepost op: 2008/03/21, 21:25:32 »
Jammer, te vroeg gejuiched. Het werkt prima zolang er geen spaties in namen van mappen zitten. Op het moment dat er een spatie inzit worden alle woorden als losse argumenten ingelezen. Toevoegen van 1 of meerdere aanhalingstekens helpt niet.
Ik heb nog gekeken of ik zelf een shell script kon schrijven om te controleren of het laatste teken van argurment n een '\' is, en als dat zo is argument n+1 toevoegen aan argument n. Echter, het lijkt erop dat de argumenten als 'formatted strings' worden ingelezen, en dus is er geen '\' meer te vinden.

Wel schrijven, niet verwijderen
« Reactie #7 Gepost op: 2008/03/22, 11:30:26 »
Dit is dan ook maar een snelle, kleine hack. Als je een echte functionaliteit zoals dit wilt, zal je een aanpassing aan coreutils (waar rm deel van uitmaakt) moeten maken.

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Wel schrijven, niet verwijderen
« Reactie #8 Gepost op: 2008/03/22, 12:01:20 »
Wel kunnen schrijven, maar niet verwijderen is volgens mij niet mogelijk.
Als je kan schrijven, dan kan je de bestanden ook (onbedoeld misschien) leeg of onleesbaar maken. Dan heb je er nog niet heel veel aan.

Regelmatig backups maken is dus sowieso handig. Verder kan je bij het kopiƫren en verwijderen de volgende opties meegeven: -v om precies te laten zien wat er gebeurt, en -i om bij elk bestand te vragen of je het wel zeker weet.

Ook is het gebruik van rsync en de grafische variant grsync wel handig om mappen te kopiƫren en synchroon te houden. In een terminalvenster kan je ook het programma mc gebruiken.

Offline vanadium

  • Lid
Wel schrijven, niet verwijderen
« Reactie #9 Gepost op: 2008/03/22, 13:22:20 »
Het script kan wellicht vlug aangepast worden om ook met spaties in de bestandsnamen te werken door de variabelen te quoten, vb.

rm.real $rmopts "$x"

Wel schrijven, niet verwijderen
« Reactie #10 Gepost op: 2008/03/22, 13:43:11 »
@vanadium: zou kunnen. ik heb het nog niet geprobeerd, m'n persoonlijke bestanden zijn toch nihil/van root (broncode en zo ;) )

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net