Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Jestem w trakcie tworzenia sobie skryptu, który ma na celu pozbierać modyfikowane przeze mnie pliki w systemie i sprawdzić czy czasem nie zostały zmienione w wyniku różnych zdarzeń np. aktualizacji systemu.
Tak wygląda mój pseudo skrypt:
#/bin/bash DATE=`date +'%Y_%m_%d_%H_%M_%S'` TAR="tar.gz" NAME_OLD="stary" NAME_NEW="nowy" USER="morfik" KATALOG=$(pwd) check_root() { if [ "$(id -u)" -ne '0' ] ; then echo -e "Musisz się zalogować na konto roota." exit 0 fi } pakuj() { tar pczf $NAME_NEW.$TAR \ /boot/extlinux/background_1280x1024.jpg \ /boot/extlinux/chain.c32 \ /boot/extlinux/extlinux.conf \ /boot/extlinux/hdt.c32 \ /boot/extlinux/menu.c32 \ /boot/extlinux/pci.ids \ /boot/extlinux/pl.ktl \ /boot/extlinux/poweroff.com \ /boot/extlinux/reboot.c32 \ /boot/extlinux/usb.ids \ /boot/extlinux/vesamenu.c32 \ /etc/X11/xorg.conf.d/ \ /etc/adjtime \ /etc/apt/apt.conf.d/02periodic \ /etc/apt/apt.conf.d/70debconf \ /etc/apt/preferences \ /etc/apt/sources.list \ /etc/cczerc \ /etc/crypttab \ /etc/cups/cups-files.conf \ /etc/cups/cupsd.conf \ /etc/default/bluetooth \ /etc/default/console-setup \ /etc/default/extlinux \ /etc/default/google-chrome \ /etc/default/hddtemp \ /etc/default/keyboard \ /etc/default/locale \ /etc/default/networking \ /etc/default/rcS \ /etc/default/saned \ /etc/default/smartmontools \ /etc/default/tmpfs \ /etc/default/useradd \ /etc/dhcpcd.conf \ /etc/fancontrol \ /etc/fonts/conf.avail/10-no-antialias.conf \ /etc/fonts/conf.avail/57-arial.conf \ /etc/fonts/conf.avail/57-courier-new.conf \ /etc/fonts/conf.avail/57-times-new-roman.conf \ /etc/fonts/conf.d/10-no-antialias.conf \ /etc/fonts/conf.d/10-no-sub-pixel.conf \ /etc/fonts/conf.d/49-sansserif.conf \ /etc/fonts/conf.d/50-user.conf \ /etc/fonts/conf.d/51-local.conf \ /etc/fonts/conf.d/57-arial.conf \ /etc/fonts/conf.d/57-courier-new.conf \ /etc/fonts/conf.d/57-times-new-roman.conf \ /etc/fstab \ /etc/group \ /etc/hostname \ /etc/hosts \ /etc/init.d/cpufrequtils \ /etc/init.d/dhcpcd \ /etc/init.d/firewall \ /etc/initramfs-tools/conf.d/resume \ /etc/initramfs-tools/initramfs.conf \ /etc/initramfs-tools/modules \ /etc/inittab \ /etc/libao.conf \ /etc/lightdm/lightdm-gtk-greeter.conf \ /etc/lightdm/lightdm.conf \ /etc/lightdm/users.conf \ /etc/localtime \ /etc/modprobe.d/alsa-base.conf \ /etc/modules \ /etc/mplayer/mplayer.conf \ /etc/mtab \ /etc/network/interfaces \ /etc/ntp.conf \ /etc/openvpn/riseup.ovpn \ /etc/pm/sleep.d/ \ /etc/pulse/client.conf \ /etc/pulse/daemon.conf \ /etc/pulse/default.pa \ /etc/resolv.conf \ /etc/resolv.conf.head \ /etc/rsyslog.conf \ /etc/init.d/rsyslog \ /etc/sane.d/plustek.conf \ /etc/timezone \ /etc/udev/rules.d/70-persistent-net.rules \ /etc/udev/rules.d/95-keymap.rules \ /etc/vim/vimrc \ /home/$USER/.Xresources \ /home/$USER/.bashrc \ /home/$USER/.config/Trolltech.conf \ /home/$USER/.config/autostart/blueman.desktop \ /home/$USER/.config/autostart/dropbox.desktop \ /home/$USER/.config/fontconfig/conf.d/ \ /home/$USER/.config/fontconfig/fonts.conf \ /home/$USER/.config/gtk-3.0/settings.ini \ /home/$USER/.config/gtk-3.0/settings.ini.base \ /home/$USER/.config/launchery_apps/ \ /home/$USER/.config/openbox/autostart \ /home/$USER/.config/openbox/environment \ /home/$USER/.config/openbox/menu.xml \ /home/$USER/.config/openbox/rc.xml \ /home/$USER/.fonts.conf \ /home/$USER/.gtkrc-2.0 \ /home/$USER/.gtkrc-2.0.base \ /home/$USER/.themes/ \ /home/$USER/.zshrc \ /home/$USER/.zshrc.base \ /lib/udev/keymaps/logitech-media-keyboard-elite \ /root/.bashrc \ /root/.bash_logout \ /root/.config/Trolltech.conf \ /root/.config/gtk-3.0/settings.ini \ /root/.config/gtk-3.0/settings.ini.base \ /root/.gtkrc-2.0 \ /root/.gtkrc-2.0.base \ /root/.themes/ \ /root/.zshrc \ /root/.zshrc.base \ /usr/bin/hibernacja.sh \ /usr/bin/obex_spacefm.sh \ /usr/pixmaps/tapeta.jpg \ /usr/sbin/alsa \ /usr/share/alsa/pulse-alsa.conf \ /usr/share/i18n/locales/en_US \ /var/lib/AccountsService/icons/morfik.icon \ /var/lib/AccountsService/users/morfik \ /etc/init.d/cgconfig \ /etc/init.d/cgrulesengd \ /etc/cgconfig.conf \ /etc/cgrules.conf \ /etc/default/cgconfig \ /etc/default/cgrulesengd \ /etc/logrotate.conf \ /etc/logrotate.d/ \ /usr/lib/pm-utils/pm-functions \ /etc/apache2/conf.d/security \ /etc/apache2/conf.d/charset \ /etc/apache2/ssl/ \ /etc/apache2/sites-available/ \ /etc/apache2/sites-enabled/ \ /etc/apache2/mods-available/ \ /etc/apache2/mods-enabled/ \ /etc/mime.types \ /etc/php5/apache2/php.ini \ /var/lib/mysql/ \ /etc/default/dnscrypt-proxy \ /etc/init.d/dnscrypt-proxy \ /home/$USER/.kde/share/config/amarokrc \ # /usr/local/sbin/c++ \ # /usr/local/sbin/g++ \ # /usr/local/sbin/cc \ # /usr/local/sbin/gcc \ # /etc/colorgcc/colorgccrc \ /home/$USER/Desktop/backup/backup \ /home/$USER/Desktop/backup/backup.base } check_root if [ -d $KATALOG/$NAME_NEW -a -d $KATALOG/$NAME_OLD ]; then echo "Usuwam stare katalogi backupu" rm -R $KATALOG/{$NAME_NEW,$NAME_OLD} elif [ -e $KATALOG/$NAME_NEW.tar.gz ]; then echo "Nowy plik backupu już istnieje" exit 0 else pakuj fi if [ -e $KATALOG/$NAME_OLD.tar.gz -a -e $KATALOG/$NAME_NEW.tar.gz ]; then mkdir $KATALOG/{$NAME_OLD,$NAME_NEW} mv $KATALOG/$NAME_OLD.tar.gz $KATALOG/$NAME_OLD mv $KATALOG/$NAME_NEW.tar.gz $KATALOG/$NAME_NEW cd $KATALOG/$NAME_OLD tar xfp $KATALOG/$NAME_OLD/$NAME_OLD.tar.gz cd $KATALOG/$NAME_NEW tar xfp $KATALOG/$NAME_NEW/$NAME_NEW.tar.gz cd $KATALOG else echo "Nie ma plików." exit 0 fi meld $KATALOG/$NAME_OLD/ $KATALOG/$NAME_NEW/ if [ -d $KATALOG/$NAME_NEW ]; then if [ -e $KATALOG/$NAME_NEW/$NAME_NEW.tar.gz ]; then rm $KATALOG/$NAME_NEW/$NAME_NEW.tar.gz cd $KATALOG/$NAME_NEW chown -R morfik:morfik $KATALOG/$NAME_NEW/home/$USER chown -R root:root $KATALOG/$NAME_NEW/home/$USER/.themes echo "Pakuję pliki..." tar pczf $NAME_NEW.tar.gz * echo "done!" mv $KATALOG/$NAME_NEW/$NAME_NEW.tar.gz $KATALOG/$NAME_OLD.tar.gz cp $KATALOG/$NAME_OLD.tar.gz $KATALOG/$DATE.tar.gz cd $KATALOG fi fi CZYSC="tak" if [ "$CZYSC" = "nie" ]; then exit 0 else if [ -d $KATALOG/$NAME_NEW ]; then rm -R $KATALOG/$NAME_NEW fi if [ -d $KATALOG/$NAME_OLD ]; then rm -R $KATALOG/$NAME_OLD fi fi exit 0
To ma działać tak:
1. Sprawdzić uprawnienia
2. Sprawdzić czy istnieją śmieci z poprzedniego backupu (katalogi nowy i stary ), jeśli tak to usunąć je
3. Sprawdzić czy istnieje spakowany plik backupu (nowy.tar.gz). On nie powinien zostać usunięty -- może coś w skrypcie nawaliło, etc. Jeśli istnieje, skrypt ma się zakończyć
4. Jeśli nie ma plików i katalogów sprecyzowanych w 2 i 3, rozpocząć pakowanie plików zdefiniowanych w funkcji "pakuj".
5. Po spakowaniu, sprawdzić czy któregoś z plików brakuje (stary.tar.gz , nowy.tar.gz), jesli tak, skrypt ma się zakończyć
6. Przenieść stary i nowy plik backupu (stary.tar.gz , nowy.tar.gz) do odpowiednich folderów (nowy , stary) oraz je wypakować -- ten stary spakowany plik backupu (stary.tar.gz) zrobiłem sobie ręcznie, póki co.
7. Odpalić meld, który porówna zawartość dwóch katalogów (stary , nowy ) i tu właśnie sobie patrze co się gdzie zmieniło, ewentualne niepożądane zmiany w plikach usuwam, etc
8. Po zakończeniu melda, skrypt ma usunąć z folderu (nowy) paczkę (nowy.tar.gz) oraz nadać odpowiednie uprawnienia na poszczególne katalogi (o tym za moment)
9. Zrobić paczkę backupu (nowy.tar.gz)
10. Przenieść plik (nowy.tar.gz) do odpowiedniego folderu (folder główny) oraz zmienić nazwę pliku na stary.tar.gz , który będzie porównywany przy następnym uruchomieniu skryptu. Ma zostać on również skopiowany pod nazwą określającą datę i godzinę robienia backupu, tak by pliki backupu się czasem nie nadpisały i było wiadomo, którego dnia były robione backupy.
11 opcjonalne usuwanie śmieci.
Problemy są trzy:
1. blok:
if [ -d $KATALOG/$NAME_NEW -a -d $KATALOG/$NAME_OLD ]; then echo "Usuwam stare katalogi backupu" rm -R $KATALOG/{$NAME_NEW,$NAME_OLD} elif [ -e $KATALOG/$NAME_NEW.tar.gz ]; then echo "Nowy plik backupu już istnieje" exit 0 else pakuj fi
który to wyświetla w terminalu takie wyjście:
root:/home/morfik/Desktop/backup# ./backup tar: Removing leading `/' from member names Nowy plik backupu już istnieje
Co ciekawe skrypt nie kończy działania tylko przechodzi od razu do pakowania plików. xD Co śmieszniejsze plik nie istnieje do momentu wykonania funkcji pakuj. Próbowałem zmieniać pewne części skryptu by ustalić co powoduje takie dziwne zachowanie i wychodzi na to, że są to zakomentowane linie w funkcji pakuj. Po usunięciu ich wszystko wraca do normy. Chodzi o te wpisy:
# /usr/local/sbin/c++ \ # /usr/local/sbin/g++ \ # /usr/local/sbin/cc \ # /usr/local/sbin/gcc \ # /etc/colorgcc/colorgccrc \
Na dobrą sprawę ten skrypt ma na celu też oznaczenie wszelkich plików, które już sobie zbadałem, oczywiście część z nich może nie istnieć na danym systemie lub nie chciałbym ich uwzględniać w backupie (nie zostały zmienione w żaden sposób) i chciałbym sobie to wykomentować.
Czy ktoś potrafi mi wytłumaczyć, czemu w funkcji nie można korzystać z komentarzy?
2. Prawa pakowanych plików. Dodałem tarowi opcje "p" ale tar i tak po swojemu nadaje prawa do niektórych katalogów i plików w /home/$USER . Część z pakowanych plików ma user:group ustawione na morfik:morfik ale tar zmienia to na root:root i co ciekawe nie we wszystkich. Ktoś wie może o co chodzi i jak temu zapobiec?
3. Chodzi o łamanie linii, konkretnie o ten znak "\" . Czemu w przypadku wystąpienia spacji po tym znaku są problemy typu:
./backup: line 165: /home/morfik/.kde/share/config/amarokrc: Permission denied
Offline
Morfik a jaki masz system? Po co coś takiego? Odnośnie komentarzy w funkcjach basha też bez problemu można je stosować.
Jeżeli używasz Archa ma różne przydatne mechanizmy jak np.
pacman -Qk - pokazuje czy dla danych pakietów nie brakuje jakiś plików. przykładowo u mnie:
18:54 ~/: pacman -Qk | grep -v "0 brakujących" ostrzeżenie: lightdm: /usr/share/polkit-1/rules.d/lightdm.rules (Brak dostępu) ostrzeżenie: lightdm: /var/lib/lightdm/.pam_environment (Brak dostępu) lightdm: w sumie 354 pliki, 2 brakujące pliki ostrzeżenie: pidgin: /usr/share/pixmaps/pidgin/tray/hicolor/16x16/status/pidgin-tray-email.png (Nie ma takiego pliku ani katalogu) ostrzeżenie: pidgin: /usr/share/pixmaps/pidgin/tray/hicolor/22x22/status/pidgin-tray-email.png (Nie ma takiego pliku ani katalogu) ostrzeżenie: polkit: /etc/polkit-1/rules.d/50-default.rules (Brak dostępu) pidgin: w sumie 746 plików, 2 brakujące pliki polkit: w sumie 149 plików, 1 brakujący plik 18:54 ~/: pacman -Qqk lightdm /usr/share/polkit-1/rules.d/lightdm.rules lightdm /var/lib/lightdm/.pam_environment pidgin /usr/share/pixmaps/pidgin/tray/hicolor/16x16/status/pidgin-tray-email.png pidgin /usr/share/pixmaps/pidgin/tray/hicolor/22x22/status/pidgin-tray-email.png polkit /etc/polkit-1/rules.d/50-default.rules
oraz np. taki skrypcik
#!/bin/sh hide='\/usr\/share\/themes\|\/usr\/share\/icons\|\/usr\/share\/silnik\|\/usr\/share\/mime' tmp=${TMPDIR-/tmp}/pacman-disowned-$UID-$$ db=$tmp/db fs=$tmp/fs mkdir "$tmp" trap 'rm -rf "$tmp"' EXIT pacman -Qlq | sort -u > "$db" find /bin /etc /lib /sbin /usr /opt \ ! -name lost+found \ \( -type d -printf '%p/\n' -o -print \) | sort > "$fs" comm -23 "$fs" "$db" | grep -v $hide
wypisze wszystkie pliki z rootfs (pomijając wypisane w hide), które nie są własnością jakiegokolwiek z pakietów. Takie dwa proste skrypciki a pozwalają osiągnąć dużą kontrolę nad śmieciami na rootfs. 5 lat i system nadal może być w dobrej kondycji (mówię o desktopie). Do tego wystarczy backup raz na 2 miesiące (oraz najw, danych), awarie dysku normalnym ludziom nie zdarzają się zbyt często pomijając już abstrakcje w postaci rozwalenia systemu (przynajmniej u ogarniętych userów).
PS Szkoda, że M$ zamiast skupić się na porządnym zunifikowanym mechanizmie instalacja/usunicie programu i scentralizowanym repozytorium wprowadzają tylko marketingowe bajery.
Ostatnio edytowany przez dominbik (2013-07-18 19:11:45)
Offline
Jak sobie zainstalowałem ręcznie debiana to na dobrą sprawę się on bardzo niewiele różnił od archa (chodzi min. o debootstrap), a jechanie na dwóch systemach trochę mnie męczyło i musiałem się zdecydować na jeden z nich, a biorąc pod uwagę, że mi średnio 1 raz w tygodniu arch padał z jakiejś przyczyny, to postanowiłem zostać na debianie i się nauczyć kompletnie tego systemu, a archa zostawić do testów i ew. na czasy jak debian będzie mrożony, choć może do tego czasu już nie będzie to potrzebne.
Po co mi taki skrypt? Bo z każdym tygodniem, plików, które zmieniam lub poznaje przybywa i utrzymanie tego troszeczkę się komplikuje. Chodzi głównie o backup plików konfiguracyjnych — tylko tych zmienianych. Ostatnio miałem sytuację, gdzie pakiet locales został zaktualizowany i to mi trochę namieszało w ustawieniach. Bo ja używam en_US ale domyślnie to ma ustawione pierwszy dzień tygodnia na niedzielę, zamiast na poniedziałek i dziwnie się czuje patrząc na kalendarz. I np. tak jak w tej chwili mogę bez problemu (w oparciu o listę plików) powiedzieć ci w jakim pliku i w którym miejscu dokonałem zmiany — dla przykładu:
plik /usr/share/i18n/locales/en_US
linijki:
first_weekday 2 first_workday 2
No i w przypadku aktualizacji pakietu locales nic mnie nie powiadomiło o podmianie zmienionego przeze mnie pliku, potem robię backup i akurat w tym przypadku prawie natychmiast można odczuć zmianę ale co w przypadku gdy coś zostanie zmienione, a ja się dowiem o tym za xx dni? Ten skrypt przez wywoływanie melda wychwyci zmiany w każdym pliku, który mnie w jakiś sposób interesuje i o to tutaj chodzi.
Lista docelowo będzie zawierać wszystkie zmiany w plikach + nazwy pakietów, z którymi te pliki są dostarczane. To będzie bardzo długa lista ale przy odpowiednim ogarnięciu ctrl+f wszystko będzie dobrze. xD
dominbik napisał(-a):
Odnośnie komentarzy w funkcjach basha też bez problemu można je stosować.
To czemu ja doświadczam takiego dziwnego zjawiska?
Offline
tripwire też chyba może robić migawki
Offline
@morfik looknij jeszcze na strony typu;
http://serverfault.com/questions/90400/how-to-check … debian-system
oraz pakiet http://packages.debian.org/search?keywords=debsums
debsums -ce
wyświetli pliki z pakietów, które zostały zmodyfikowane. Moim zdaniem to i tak droga na około. Aptitue (nie pamiętam dobrze), ale przy aktualizacji chyba pytało co zrobić gdy plik konfiguracyjny na dysku był zedytowany a wchodził nowy update.
Offline
Aptitude pyta ale tylko chyba w przypadku katalogu /etc i też nie zawsze, np. edycja skryptów w /etc/init.d albo innych plików poza /etc , tak jak w przypadku pakietu locales -- podmienia bez powiadamiania. Ja chcę mieć tylko pewność, że jak robię backup plików, to że są one niezmienione. Jak będę miał chwilę to rzucę okiem na linki
Czy ktoś zna odpowiedz na te 3 pytania w pierwszym poście? xD
EDIT:
Przy bawieniu się live penem też zaobserwowałem problemy ze znakami komentarza jeśli linie są łamane. Dodatkowo geany oznacza jako komentarz całą połamaną linijkę od momentu pojawienia się # , także coś tutaj z tym # i \ nie gra. Jak zatem wykomentować część kodu wewnątrz złamanej linii, jest to w ogóle możliwe?
Jak wrzucę ten blok zakomentowany na koniec funkcji, komunikat znika :]
Ostatnio edytowany przez morfik (2013-07-19 21:51:03)
Offline