Script zum kopieren von Dateien

  • Hi,


    ich brauch mal eure Hilfe. Die meisten von euch werden jetzt sicherlich lachen aber mir ist zum heulen zumute da ich es nicht einmal schaffe das Verzeichnis per Script zu wechseln.



    Wenn ich per Telnet eingeloggt bin wechsele ich per "cd /usr/script" in das Verzeichnis wo sich auch die backup.sh, mit 755 Rechten, befindet.
    Wenn ich jetzt per "./backup.sh" starte bekomme ich folgende Meldung:


    Code
    root@dm7080:/usr/script# ./backup.sh
    cp: can't stat '/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/_init_.py_gepatcht': No such file or directory
    cp: can't create '/media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor': No such file or directory
    cp: can't create '/media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor': No such file or directory
    cp: can't create '/media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/NameZap': No such file or directory
    root@dm7080:/usr/script#


    Was mache ich falsch? Wie ihr sicher gemerkt habt habe ich keine Ahnung von Scripten.

  • 1) Wenn du absolut kopierst brauchst Du kein "cd /" ;)
    PS: Er wechselt zur Laufzeit schon das Verzeichnis, nach der Ausführung bist du aber wieder dort, wo du das Script gestartet hast.


    2) Heißt die Datei wirklich _init_.... oder doch __init__... (je 2 Unterstriche)?


    3) Existieren die Zielverzeichnisse?

    Grüße
    ...jp


    DM900 / OE2.5 Experimental ... und sehr glücklich damit :)

    Edited 2 times, last by juanito_perez ().

  • Hi,


    oh, du hast recht da sind zwei Unterstriche. Die Zielverzeichnisse haben nicht existiert. Auf was man alles achten muß. Ich dachte cp legt das automatisch an.
    Nachdem ich alles korrigiert habe klappt das Backup anlegen jetzt schonmal. :hurra: Vermutlich könnte man das Script noch etwas verfeinern mit Statusmeldungen?


    Jetzt macht das restore.sh natürlich auch Probleme. Die Fehlermeldung habe ich jetzt nicht mehr parat, es war so etwas wie "bash interpreter Fehler" und kopiert wurde nichts.


    Code
    #!bin/sh
    #Restore
    cp /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/__init__.py_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/__init__.py
    cp /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/plugin.py_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/plugin.py
    cp /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/keymap.xml_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/keymap.xml
    cp /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/NameZap/plugin.py_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/NameZap/plugin.py

    MfG
    latte

    Edited once, last by latte ().

  • Versuch's mal mit cp -f ... für ausdrückliches Überschreiben.


    Wg. Status kannst Du auch ein -v einfügen.


    PS: "cp -?" zeigt dir die Parameter ;)

    Grüße
    ...jp


    DM900 / OE2.5 Experimental ... und sehr glücklich damit :)

  • Um Pfadangaben fehlerfrei in ein Script zu übertragen, gehe ich immer erst mit cd in das Arbeitsverzeichnis und lasse mir den Pfad mit pwd anzeigen, kopiere ihn in die Zwischenablage und füge ihn ins Script ein.

    DM920UHD FBC Sat, DM900UHD Triple-TunerDVB-S/S2/C/T/T2, DM500HD S, Kathrein CAS 75, Kathrein VWS 2551, Kathrein EXD-1532 Unicable Multischalter, PHILIPS55POS9002/12 OLED TV

  • Hi,


    ich bekomme die restore.sh einfach nicht zum laufen. Kann mir mal bitte jemand schreiben was nicht stimmt!
    Das seltsame ist wenn ich jeden Befehl in die Konsole tippe klappt es wunderbar. Sowie ich das Script starte gibt es die Fehlermeldung. Das Script habe ich in vi geladen und gespeichert.


    Code
    root@dm7080:~# ./restore.sh
    -bash: ./restore.sh: No such file or directory
    root@dm7080:~#


    Script


    Code
    #!bin/sh
    cp -f /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/__init__.py_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/__init__.py
    cp -f /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/plugin.py_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/plugin.py
    cp -f /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/keymap.xml_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/keymap.xml
    cp -f /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/NameZap/plugin.py_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/NameZap/plugin.py
  • Hast du das script ausführbar gemacht? Rechte sollten auf 0755 stehen.


    Zweitens startet man ein script mit


    sh ./scriptname.sh


    wenn man sich im Verzeichnis befindet, in dem das script steht.

  • das sh davor muss nicht sein, eigentlich nur dann, wenn keine shebang im script vorhanden ist, damit das OS weiß, mit welchem Program das Script ausgeführt werden soll. Es könnte ja auch ein python script sein.


    A propos shebang? Steht da so in deinem Script?


    Quote

    Original von latte


    Script


    Code
    #!bin/sh
    cp -f /media/hdd/save/usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/__init__.py_gepatcht /usr/lib/enigma2/python/Plugins/Extensions/CutListEditor/__init__.py
    .
    .


    wenn ja, ist klar dass es nicht klappt. Die shebang sollte so aussehen


    Bash
    #!/bin/sh

    Gruß Fred


    Die Dreambox ist tot, es lebe die Dreambox

    Edited 3 times, last by Fred Bogus Trumper ().

  • ist eigentlich einfach zu merken,


    das "#!" sorgt dafür, dass das Script mit dem nachfolgende Programm ausgeführt werden solll - angegeben mit absolutem Pfad zu dem Programm, die globale PATH Variable zieht da nicht.
    https://de.wikipedia.org/wiki/Shebang

    sh liegt im directory /bin - also "#!/bin/sh"


    pyhton:



    \\Edit


    waum dein "restore.sh" nicht funktioniert hat, mit "./restore" aber schon:


    Das script liegt im homeverzeichnis von root. Wenn du dann "restore.sh" eingibst, sucht die shell das Programm oder script in den Verzeichnissen der PATH Variable


    Code
    root@dm7020hd:~# echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
    root@dm7020hd:~#


    Das Homeverzeichnis ist da nicht dabei, deshalb funktionert "restore.sh" nicht
    ./restore.sh sucht das Programm nur in dem Verzeichnis, in dem du dich gerade befindest und führt es aus, wenn es dort gefunden wird


    wenn du das scricpt z.B. nach /usr/local/bin legst, wird es mit "restore.sh" ausgeführt, egal in welchem Verzeichnis du dich gerade befindest.
    Alternativ einfach den absoluten pfad zum script angeben


    /home/root/restore.sh


    oder (glaub' im DreamOS ist das anders als im OE2.0)


    /root/restore.sh


    btw:
    im DreamOS 2.5 ist die bash die Standard shell, sh funkitoniert aber weiterhin

    Gruß Fred


    Die Dreambox ist tot, es lebe die Dreambox

    Edited 7 times, last by Fred Bogus Trumper ().

  • Hi,


    was ist denn der Unterschied zwischen bash und sh? Ich habe nämlich den Unterschied in den Scripten wo anstelle von "#!/bin/sh" dann "#!/bin/bash" steht nicht so richtig verstanden.
    Geht es da um die Ausführbaren Befehle?

  • das sind zwei verschiedene shells


    bash ist mehr oder weniger eine weiterentwicklung von sh (bash = born again shell)


    bash konnte man zwar im OE2.0 nachinstallieren, aber Standard war noch immer sh bzw. ash (eine weitere shell)


    kann man aber auch nachlesen: https://wiki.ubuntuusers.de/Shell/ oder "linux shell" googlen


    Die shell ist nur die Benutzerschnittstelle zum Betriebssystem. D.h. wenn du dich per ssh oder telnet verbindest, wird die standard shell geladen und du kannst Befehle (= installiertes Programm) aufrufen, die dann vom Betriebssystem ausgeführt werden.


    Die shells unterscheiden sich hautpsächlich in den Konfigurationsdateien, in denen man das Aussehen und die Einstellungen der shell definiert (Standard Editor, Sprache usw.)


    bash und sh sind am weitersten verbreiteten (debian und debian basierende Distributionen) und unterscheiden sich kaum. Es kann nur sein, dass es gar nicht ausgeführt werden kann weil die geforderte shell nicht installiert ist. Dann kann man die shebang ändern und hoffen dass alles funktioniert. Wenn nicht die geforderte shell wenn möglich nachinstallieren. Das war im Enigma2 bis OE2.0 nur bedingt möglich, deshalb waren das alles sh scripte, weil es keine bash für das E2 gab.


    Man findet auch einfach raus, welche shell als standard shell auf einem System eingerichtet ist, wenn man nicht sicher ist


    Code
    root@dm7020hd:~# echo $SHELL
    /bin/sh
    root@dm7020hd:~#


    oder so, da sieht man, welche shell geladen wurde (2. Zeile)

    Code
    root@dm7020hd:~# ps
    PID TTY TIME CMD
    21053 pts/2 00:00:00 sh
    21060 pts/2 00:00:00 ps
    root@dm7020hd:~#


    debian zum Vergleich

    Code
    fred@debian:~$ ps
    PID TTY TIME CMD
    26074 pts/1 00:00:00 bash
    26102 pts/1 00:00:00 ps
    fred@debian:~$


    es können aber auch mehre shells installiert sein, d.h. ein bash script funktioniert dann auch, ohne die shebang zu ändern, und man kann auch die shell wechseln, wenn man will


    Code
    root@dm7020hd:~# which bash
    /bin/bash
    root@dm7020hd:~# bash
    root@dm7020hd:~#


    im OE2.0 ist die bash zur busybox verlinkt, da ist nicht so viel Unterschied, man kann aber auch eine vollwertige Version nachinstallieren




    weiter *klugscheiss*
    In der shell bzw. im Script gibt es keine "Befehle" wie oft behauptet wird, es werden einfach installierte binaries (Programme) aufgerufen. echo ist auch nur ein Programm, das im System vorinstalliert ist.


    Wenn ein aus dem Internet gezogenes script nicht gleich funktioniert, liegt es meist am aufgerufenen Programm im script und nicht an der shell. Es ist entweder nicht installiert oder hat den geforderten Schalter nicht. Auf der Dreambox sind viele "Befehle" kein eigenständiges Programm, sondern zur busybox verlinkt (toolbox in der mehre Programme zusammengefasst sind). Diese busybox commands sind oft weniger mächtig oder haben weniger Optionen/Schalter aus dem einfachen Grund weil die Optionen nicht für den Betrieb notwendig sind oder um Platz zu sparen - die alten Boxen hatten nur begrenzten Flash Speicherplatz.


    Wenn ein script nicht funktioniert, kann man es bei der Ausführung debuggen, dann werden detailierte Ausgaben gemacht und findet den Fehler einfacher



    sh -x /usr/script/script.sh
    oder
    bash -x /usr/script/script.sh

    Gruß Fred


    Die Dreambox ist tot, es lebe die Dreambox

    Edited 13 times, last by Fred Bogus Trumper ().

  • Vielleicht zum einfacheren Verständnis.


    Wenn du dich per ssh/telnet auf die Box befindest, wird automatisch die Standard shell geladen und du kannst Befehle eingeben und erhälst sofort Ausgaben (Rückmeldungen vom Betriebssystem).


    Ein Script ist nur eine Abfolge von Programmaufrufen (ähnlich einem Batch Script unter Windows) und die shebang Zeile gibt an, in welcher shell oder mit welchem Programm es ausgeführt werden soll.



    Wenn du etwas in Python machen willst, kannst du auch python starten, und dann python Befehle eingeben und Ausgaben erhalten. D.h. du hast die Benutzerschnittstelle zum Programm python gestartet, und Befehle wie echo in der Shell funktioneren nicht



    Man kann aber in python wiederum die shell aufrufen und den echo Befehl absetzen

    Code
    root@dm7020hd:~# python
    Python 2.7.2 (default, Jan 7 2014, 11:35:16)
    [GCC 4.6.4 20120303 (prerelease)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> os.system('echo "Hello World!"')
    Hello World!
    0
    >>>
    root@dm7020hd:~#



    Wenn du dann ein pyhton script schreibst, weiß das Betriebssystem das es mit python ausgeführt werden muss:

    Code
    #!/usr/bin/python
    print "hello world!"


    Und man erhält die gleiche Ausgabe wie direkt in python ausgeführt.



    Die shebang im Script bestimmt also in welcher shell bzw. mit welchem Programm das Script ausgeführt werden soll - die Standard shell wird dabei nicht automatisch geladen. Wenn die shebang Zeile fehlt oder fehlerhaft ist wird es auch nicht ausgeführt! D.h. heisst es wird auch nur dann gestartet, wenn die angegeben shell bzw. das Programm auch installiert ist

    Gruß Fred


    Die Dreambox ist tot, es lebe die Dreambox

    Edited 2 times, last by Fred Bogus Trumper ().

  • Ich setz noch ein ein einfaches Bespiel zum Verständnis drauf!


    Du findest folgendes script im Netz, dass das Homeverzeichnis von root auf /media/hdd/root_Bu sichern soll. Die Option -u bewirkt, dass eine Datei nur dann überschrieben ist, wenn die Quelldatei neuer ist als die Zieldatei oder die Zieldatei nicht existiert. Macht Sinn wenn große Datenmengen kopiert werden sollen, dann werden nur die geänderten Dateien kopiert.


    /usr/script/root_backup.sh

    Code
    #!/bin/ksh
    [ ! -d /media/hdd/root_bu ] && mkdir /media/hdd/root_bu
    cp -u /root/* /media/hdd/root_bu/
    exit 0


    und willst es auf der dm7020 ausführen, Rechte sind auf 755 gesetzt


    Code
    root@dm7020hd:~# /usr/script/root_backup.sh
    -sh: /usr/script/root_backup.sh: not found
    root@dm7020hd:~#


    nach Überprüfung stelklen wir fest, dass die Korn Shell (ksh) nicht installiert ist, und ändern die shebang auf eine shell die auf der Box installiert ist, nehmen wir die mal sh


    Bash
    #!/bin/sh


    dann führen wir es erneut aus:


    wir bekommen einen Fehler der besagt, dass es den Schalter mit -u nicht gibt. Der Fehler hat nun weder etwas mit der Shell noch mit dem Script zu tun, sondern am Programm, das aufgerufen wird. Das busybox Programm cp auf der DM7020HD kennt den Schalter -u einfach nicht, deshalb spuckt das Script einen Fehler aus. Dummerweise kann man auch kein vollwertiges cp online nachinstallieren.


    Also ändern wir den Befehl im script auf auf den Schalter -a, dann werden immer alle Dateien rekursiv kopiert und die Dateiattribute bleiben erhalten, dauert nur länger, weil immer alles kopiert wird.


    Bash
    #!/bin/sh
    [ ! -d /media/hdd/root_bu ] && mkdir /media/hdd/root_bu
    cp -a /root/* /media/hdd/root_bu/
    exit 0


    In open embedded System kommt das öfters vor, weil oft wg. Speicherplatzmangel gespart wird und die Befehle beschnitten werden.


    Man muss dann immer zwischen verwendeter shell, falscher syntax im script oder vorhandenen oder nicht vorhandenen Programm bzw. Programm Optionen unterscheiden. Aber wenn man sich ein wenig damit beschäftigt hat man schnell den Dreh raus. Man kann die einzelnen Befehle/Programm Aufrufe im Script auch direkt im Terminal vorher testen um syntax error oder falsche Programmaufrufe zu unterbinden

  • Hi,


    Fred Bogus Trumper


    ich merke schon du bist voll in deinem Element, was ich wirklich super finde wenn jemand so brennt vor Begeisterung denn so kann auch ich und andere etwas lernen. :hurra:


    Du hast ja jetzt schon einiges sehr verständlich erklärt. Ich glaube dieser Thread wird bald noch etwas länger da ich das Script jetzt nach und nach noch etwas "verfeinern" würde.


    Als erstes würde mich interessieren ob man beim Restore die Zieldatei prüfen kann ob sie eine bestimmte Größe hat und nur wenn das zutrifft das die Datei durch die gepatchte ersetzt wird und wenn nicht eine Anzeige erfolgt im Sinne von "Neue Originaldatei vorhanden, es wurde nicht gepatcht"?

  • Klar geht das ;)


    Gegenfrage:


    Möchtest Du eine fertige Lösung oder lernen und selber machen?


    Bash ist ungemein mächtig und man kann endlos viel machen.
    Schau' mal z.B. hier


    So als Anregung:

    Code
    FS=$(ls -l /deine_datei_mit_Pfad | tr -s " " | cut -d " " -f 5)
    oder
    FS=$(stat -c%s /deine_datei_mit_Pfad)

    ergiben beide eine gefüllte Variable FS mit der Dateigröße, die du dann weiter verwenden kannst.
    Vorher aber prüfen, ob die Datei überhaupt vorhanden ist...


    Und das ist nur ein Beispiel. Es gibt noch viele andere Wege an die Dateigröße zu kommen...

    Grüße
    ...jp


    DM900 / OE2.5 Experimental ... und sehr glücklich damit :)

    Edited 5 times, last by juanito_perez ().

  • Hi,


    eine fertige Lösung ist natürlich immer gut damit man gleich loslegen kann.
    Lernen würde ich natürlich auch gern etwas aber das Problem ist wenn dann das Script mal irgendwann fertig ist habe ich 5Minuten später das meiste schon wieder vergessen.
    Ich vermute mal das ich für das Script garantiert Monate bräuchte da ich eigentlich keine Vorkenntnisse habe.
    Ein bisschen gegoogelt habe ich schon aber wenn es an schleifen geht, puhhh. Wenn ich mal ein paar Ausgaben per Echo hingebracht habe und den cp Befehl, war das wie Weihnachten für mich.

  • Quote

    Original von latte


    Als erstes würde mich interessieren ob man beim Restore die Zieldatei prüfen kann ob sie eine bestimmte Größe hat und nur wenn das zutrifft das die Datei durch die gepatchte ersetzt wird und wenn nicht eine Anzeige erfolgt im Sinne von "Neue Originaldatei vorhanden, es wurde nicht gepatcht"?


    Das macht eigentlich der Schalter -u des cp Befehles. Leider ist meine dm900 noch immer nicht von der Reparatur und kann es nicht testen, ob der Schalter -u im cp Befehl im Dream OS mittlerweise vorhanden ist.


    Alternativ könnstest du nachsehen, ob rsync am feed gibt. Das ist ein backup programm, dass auch inkrementell kopiert, d.h. es werden nur die Daten gesichert bzw. wiederhergestellt, die verändert wurden.



    Wenn du es verfeinern willst, hätte ich da noch ein paar Varianten, z.B. das ganze in eine Schleife zu packen, dann wird das Script mal schnell halbiert.


    Wie man sieht, gibt es für so etwas viele Lösungen, welche man nimmt, hängt dann von Vorlieben und den vorhandenen Anwendungen ab.

    Gruß Fred


    Die Dreambox ist tot, es lebe die Dreambox

    Edited 4 times, last by Fred Bogus Trumper ().

  • latte:


    Nach meiner Erfahrung ist das Lernergebnis bei fertigen Sachen sehr, sehr gering.... Wenn's klappt ist prima, wenn man ehrlich ist, dann weiß man aber nicht warum es funktioniert und erweitern/ändern wird zum Glücksspiel.


    Mach' doch ein Miniprojekt daraus und frage hier nach, wenn es du nicht weiterkommst ;)


    Du brauchst doch eigentlich nur:
    Prüfen, ob die Zieldatei da ist?
    Wenn nein, dann kopieren
    Wenn ja, dann prüfen, ob es der richtige Stand ist und ggf. überschreiben.


    Das Ganze als Schleife, mit den unterschiedlichen Dateien, damit es übersichtlich bleibt und der Code nicht etliche Male wiederholt wird.


    Kommt das so hin? Nur Mut, dass ist halb so wild, wie es sich anhört ;)



    Fred:
    cp -u geht doch nach dem Zeitstempel der Dateien (kopieren, wenn älter). Das könnte in diesem Fall schlecht sein, wenn er gerade nach Updates seinen gepatchten Stand "restoren" möchte. Möglicherweise ist dann die gepatchte Quelldatei älter als die zu überschreibende Zieldatei.
    Ist RSYNC für sowas nicht etwas überdimensioniert? Es geht in diesem Fall ja nicht um einen Regeljob ;) latte muss hoffentlich nicht täglich restoren :D

    Grüße
    ...jp


    DM900 / OE2.5 Experimental ... und sehr glücklich damit :)

    Edited 2 times, last by juanito_perez ().