[gelöst] Globale Variablen setzen?

Joe_57

IPPF-Promi
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
 
Zuletzt bearbeitet:
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
 
Hallo Marco,

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

Joe
 
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" ;-)
 
Zuletzt bearbeitet:
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.
 
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
 
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
 
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
    374 Bytes · Aufrufe: 6
Zuletzt bearbeitet:
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
 
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
 
Zurück
Oben