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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-07-18 15:04:13

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Dziwne zachowanie basha

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:

Kod:

#/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:

Kod:

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:

Kod:

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:

Kod:

# /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:

Kod:

./backup: line 165: /home/morfik/.kde/share/config/amarokrc: Permission denied

Offline

 

#2  2013-07-18 19:07:46

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: Dziwne zachowanie basha

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:

Kod:

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

Kod:

#!/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)


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

#3  2013-07-18 19:36:30

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Dziwne zachowanie basha

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:

Kod:

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

 

#4  2013-07-18 21:09:42

  lx - Użytkownik

lx
Użytkownik
Zarejestrowany: 2010-06-22

Re: Dziwne zachowanie basha

A interesowałeś się pakietem etckeeper?

Offline

 

#5  2013-07-18 21:15:31

  rulezdc - Członek DUG

rulezdc
Członek DUG
Skąd: Tarnowskie Góry
Zarejestrowany: 2007-05-22

Re: Dziwne zachowanie basha

tripwire też chyba może robić migawki

Offline

 

#6  2013-07-18 21:34:02

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Dziwne zachowanie basha

etckeeper -- na to rzucę okiem, ale to nie jest to czego szukam.

Offline

 

#7  2013-07-19 11:22:19

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: Dziwne zachowanie basha

@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

Kod:

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.


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

#8  2013-07-19 11:37:45

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Dziwne zachowanie basha

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)