.titleBar { margin-bottom: 5px!important; }

[gelöst] Globale Variablen setzen?

Dieses Thema im Forum "FRITZ!Box Fon: Modifikationen" wurde erstellt von Joe_57, 4 Jan. 2009.

  1. Joe_57

    Joe_57 IPPF-Promi

    Registriert seit:
    5 März 2006
    Beiträge:
    5,089
    Zustimmungen:
    49
    Punkte für Erfolge:
    48
    #1 Joe_57, 4 Jan. 2009
    Zuletzt bearbeitet: 4 Jan. 2009
    Hallo zusammen,

    ich habe versucht, die (globale) Variable PS1 über einen Eintrag in der debug.cfg zu setzen:
    Code:
    export PS1='$PWD # '
    Wenn ich diesen Befehl direkt in der Console eingebe, funktioniert er (der Pfad wird damit am Prompt angezeigt).
    Nun hatte ich versucht, diese Kommando in die debug.cfg zu schreiben.
    Leider wird das Kommando bei einem Reboot der Box wohl nicht ausgeführt. :mad:

    Was mache ich da falsch?

    Joe
     
  2. bodega

    bodega Aktives Mitglied

    Registriert seit:
    6 Juni 2006
    Beiträge:
    1,980
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Ort:
    NRW
    Du müsstest Telnet neu starten, nachdem du die Variablen gesetzt hast (falls du dich über telnet einloggst):

    Code:
    export PS1='$PWD # '
    killall -15 telnetd
    sleep 2
    killall -9 telnetd
    telnetd -l /sbin/ar7login
    
     
  3. Joe_57

    Joe_57 IPPF-Promi

    Registriert seit:
    5 März 2006
    Beiträge:
    5,089
    Zustimmungen:
    49
    Punkte für Erfolge:
    48
    Hallo Marco,

    ich wolte das eigentlich über die debug.cfg lösen.
    Macht da das Neustarten der Telnet-Daemon einen Sinn? :noidea:

    Joe
     
  4. MaxMuster

    MaxMuster IPPF-Promi

    Registriert seit:
    1 Feb. 2005
    Beiträge:
    6,923
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    #4 MaxMuster, 4 Jan. 2009
    Zuletzt bearbeitet: 4 Jan. 2009
    Das gilt immer nur für die Shell und deren "Kinder". Wenn du das z.B. direkt eingibst, werden auch nur alle weiteren Aufrufe von "sh" den Prompt haben. Machst du aber parallel ein Telnet auf die Box, hast du den Default...

    Ändere das ganze z.B. in der "profile" Datei ab:
    Code:
    cp /etc/profile /var/tmp
    mount -o bind /var/tmp/profile /etc/profile
    # jetzt an passender Stelle einfügen, ggf. per sed oder auch
    echo "export PS1='$PWD # '" >> /var/tmp/profile
    
    Jörg

    EDIT Das Schreiben hat etwas länger gedauert, es bezieht sich auf das "export" ;-)
     
  5. bodega

    bodega Aktives Mitglied

    Registriert seit:
    6 Juni 2006
    Beiträge:
    1,980
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Ort:
    NRW
    Ja macht Sinn, da wie MaxMuster bereits schrieb, der export für die Kind-Prozesse gilt.

    Ich starte telnet auch deswegen neu, da ich meine busybox mit 'mount -o bind' austausche.
     
  6. MaxMuster

    MaxMuster IPPF-Promi

    Registriert seit:
    1 Feb. 2005
    Beiträge:
    6,923
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Gibt aus meiner Sicht zwei Möglichkeiten:

    - "export" + Neustart (damit telnet child ist und die Variable übernimmt)
    - oder profile-Datei ändern, dann geht es auch ohne Neustart, weil beim Login die Einstellungen in der Shell gemacht werden...

    Jörg
     
  7. Joe_57

    Joe_57 IPPF-Promi

    Registriert seit:
    5 März 2006
    Beiträge:
    5,089
    Zustimmungen:
    49
    Punkte für Erfolge:
    48
    Vielen Dank euch beiden!

    ich habe mir eine Kopie der /etc/profile auf meinem USB-Stick gelegt und das am Ende eingefügt:
    Code:
    # # # # # Globale Variablen setzen
    PS1='$PWD # '
    #
    # # # # # ENDE Variablen setzen
    Über die debug.cfg wird nun die profile ersetzt:
    Code:
    # # # # # Profil ersetzten
    MyStick=$(mount | grep /var/media/ftp/ | sed -e "s|^.*ftp/||g" -e "s/ .*$//")
    cp $MyStick/profile /var/profile
    mount -o bind /var/profile /etc/profile
    #
    # # # # # ENDE Profil ersetzen
    Funktioniert einwandfrei! :dance:

    Joe
     
  8. Neyk

    Neyk Neuer User

    Registriert seit:
    30 Sep. 2006
    Beiträge:
    14
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #8 Neyk, 25 Jan. 2009
    Zuletzt bearbeitet: 25 Jan. 2009
    Hallo,

    in der Zeile
    echo "export PS1='$PWD # '" >> /var/tmp/profile
    steckt ein kleiner Fehler. Damit die Variable $PWD nicht schon beim umleiten in die profile-Datei expandiert und dort als fester Text ausgeschrieben wird, muss noch ein Backslash ("\") vor $PWD gesetzt werden.
    Das Beispiel von MaxMuster sieht korrigiert dann so aus:

    Code:
    cp /etc/profile /var/tmp/profile
    mount -o bind /var/tmp/profile /etc/profile
    echo "export PS1='\$PWD # '" >> /var/tmp/profile
    @Joe_57
    Deine "$MyStick" Funktion hat mich auf die Idee gebracht den Pfad zu meinen USB-Speicher auf gleicher Weise zur PATH-Umgebungsvariablen hinzuzufügen, damit ich die Scripte die ich auf einen USB-Stick abgelegt habe auch direkt von dort aus starten kann.

    Ebenso kann man auch hilfreiche Shell-Funktionen und einige alias in die "profile"-Datei schreiben, die "debug.cfg" könnte dann etwa so aussehen:

    Code:
    #!/bin/sh
    sleep 60
    cp /etc/profile /var/tmp/profile
    mount -o bind /var/tmp/profile /etc/profile
    echo "export PS1='\$PWD # '" >> /var/tmp/profile
    
    MyFtpPath=$(mount | grep /var/media/ftp/ | sed -e "s|^.* on ||g" -e "s/ .*$//")
    if [ "$MyFtpPath" != "" ] ; then
    	echo "export PATH=$PATH:$MyFtpPath" >> /var/tmp/profile
    fi
    
    echo alias cls=\'clear\' >> /var/tmp/profile
    echo 'dir() { if [[ "$1" = "" ]] ; then ls -al ; else ls -al | grep -i "$1" ; fi }' >> /var/tmp/profile
    einige Erklärungen zum Code:

    sleep 60
    ... stellt sicher, dass die Box vollständig gebootet wurde, damit der mount zum USB-Stick auch gefunden wird.

    cp /etc/profile /var/tmp/profile
    ... kopiert die originale /etc/profile nach /var/tmp/ damit sie dort editiert werden kann,
    anschließend wird die profile-Datei mit der Ausgabeumleitung ">>" zeilenweise ergänzt.

    mount -o bind /var/tmp/profile /etc/profile
    ... mountet die zu ändernde Kopie der "profile"-Datei anstelle der originalen unter /etc/profile

    echo "export PS1='\$PWD # '" >> /var/tmp/profile
    ... ändert die Umgebungsvariable "PS1" in der "profile"-Datei, damit der aktuelle Verzeichnispfad an der Eingabeaufforderung angezeigt wird.

    if [ "$MyFtpPath" != "" ]
    ... prüft ob ein entsprechender Pfad zum USB-Stick gefunden wurde, ansonsten braucht die PATH-Variable erst gar nicht erweitert zu werden.

    echo "export PATH=$PATH:$MyFtpPath" >> /var/tmp/profile
    ... erweitert die vorhandene Umgebungsvariable PATH um meine Variable MyFtpPath, die den Pfad zum USB-Speicherstick enthält.

    echo alias cls=\'clear\' >> /var/tmp/profile
    ... definiert einen alias "cls" in der profile
    Der Alias für "cls" ist natürlich nur ein simples Bespiel, für alle die sich nicht von dem DOS-Befehl "cls" umgewöhnen wollen ;)

    echo 'dir() { if [[ "$1" = "" ]] ; then ls -al ; else ls -al | grep -i "$1" ; fi }' >> /var/tmp/profile
    ... definiert eine Shell-Funktion "dir" in der profile
    Die so definierte "dir" Funktion kann als Ersatz für den "ls" Befehl benutzt werden und unterscheidet, ähnlich
    wie der namensgleiche DOS-Befehl, nicht zwischen Groß-/Kleinschreibung (Sternchen sind jedoch nicht erforderlich).
    Sollte man mit dieser "dir"-Funktion alle Links in einem Verzeichnis anzeigen lassen wollen, kann man einfach dir ">" eingeben.

    Anmerkungen:
    Im Gegensatz zu den Umgebungsvariablen, sind die alias und die Shell-Funktionen, die in der profile Datei der FritzBox definiert werden, jedoch nur für die Telnet-Eingabeaufforderung gültig. Beim Aufruf von Script-Dateien aus der Eingabeaufforderung sind sie innerhalb des Scriptes nicht bekannt.
    Sollen alias und Shell-Funktionen innerhalb von Scripten verwendet werden, muss man sie in dem Script selbst definierten.

    (getestet mit der Fritz!Box 7170, Firmware 29.04.67)


    Danke auch für eure Anregungen :)

    Schöne Grüße
    Neyk
     

    Anhänge:

    • debug.zip
      Dateigröße:
      374 Bytes
      Aufrufe:
      6
  9. Joe_57

    Joe_57 IPPF-Promi

    Registriert seit:
    5 März 2006
    Beiträge:
    5,089
    Zustimmungen:
    49
    Punkte für Erfolge:
    48
    Hallo Neyk,

    vielen Dank für das Script und die äusserst detaillieten Erklärungen dazu. :dance:
    Die einzige Zeile, die mir darin nicht so gut gefällt, ist
    Code:
    sleep 60
    Das sollte man besser damit ersetzen:
    Code:
    # # # # # Warten bis USB-Stick gemountet ist
    grep -q " /var/media/ftp/" /proc/mounts && break
    Joe
     
  10. Neyk

    Neyk Neuer User

    Registriert seit:
    30 Sep. 2006
    Beiträge:
    14
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo Joe_57,

    bei mir funktioniert die Zeile
    grep -q " /var/media/ftp/" /proc/mounts && break
    zum Warten auf den USB mount nicht!

    Ist dieser Code firmwareabhängig? Ehrlich gesagt verstehe ich auch nicht, wie dieser Code ohne eine while-Schleife auskommen soll!

    Wenn man vor und hinter dieser Zeile eine System-Ereignisausgabemeldung einfügt, sieht man auch wie lange sich die FritzBox an dem Code aufhält.

    Code:
    #!/bin/sh
    eventadd 1 "====================== debug.cfg gestartet ======================"
    grep -q " /var/media/ftp/" /proc/mounts && break
    eventadd 1 "========================= test point 2 ========================="
    # ...
    Bei mir fällt er einfach durch, das sieht im Ereignis-Log nach einen Restart dann so aus:
    25.01.09 15:41:15 WLAN-Station angemeldet. Name: [...]
    25.01.09 15:40:54 Internetverbindung wurde erfolgreich hergestellt. [...]
    25.01.09 15:40:47 DSL ist verfügbar (DSL-Synchronisierung besteht mit [...] kbit/s).
    25.01.09 15:40:43 Partition unter Generic-Storage-01 eingebunden
    25.01.09 15:40:41 ========================= test point 2 =========================
    25.01.09 15:40:41 ====================== debug.cfg gestartet ======================
    25.01.09 15:40:38 DSL-Synchronisierung beginnt (Training).
    25.01.09 15:40:32 DSL-Synchronisierung beginnt (Training).
    25.01.09 15:40:30 USB-Gerät 003, Klasse 'USB 2.0 (full-speed) storage', angesteckt
    25.01.09 15:40:29 USB-Gerät 002, Klasse 'USB 2.0 (full-speed) hub', angesteckt
    25.01.09 15:40:15 USB-Fernanschluss für Klasse 'bulk' gestartet.


    (man beachte, dass die zweite Ausgabemeldung vor dem mount der Partition Generic-Storage-01 erfolgt!)


    Gruß
    Neyk