ds-mod und debug.cfg

Im dsmod sollte das Home-Verzeichnis von root nicht / sein!?
Code:
/var/mod/root $ cat /etc/passwd
root:x:0:0:root:/mod/root:/bin/sh
...
MfG Oliver
 
Unterschiedliche Home-Verzeichnisse für Telnet und SSH

olistudent schrieb:
Im dsmod sollte das Home-Verzeichnis von root nicht / sein!?
Code:
/var/mod/root $ cat /etc/passwd
root:x:0:0:root:/mod/root:/bin/sh
...

Das ist so eine Sache, Oliver. Wenn ich mit SSH auf der Box bin, gilt USER=root und HOME=/mod/root. Gehe ich über Telnet drauf, ist zwar auch USER=root, aber HOME=/. D.h., wenn man in Telnet screen starten möchte, hat man ohne gesetztes SCREENDIR ein Problem. Ich nehme an, man könnte den Mod so patchen, daß er den Benutzer auch via Telnet ins richtige Home-Verzeichnis legt.

Edit: Die Alternative zum Setzen von SCREENDIR ist natürlich schlicht und ergreifend das Ändern von HOME, bevor screen gestartet wird.
 
Zuletzt bearbeitet:
danke, aber dass sich hier noch was tut nach der langen Zeit hätte ich garnicht gedacht :) Wenn ich das nächste Mal wieder bei der betroffenen Box bin, teste ich das mal!
 
Umgebungsvariable in debug.cfg definieren

Hallo,

manchmal klappen die einfachsten Sachen nicht:( Ich habe, wie in #20 beschrieben, in der debug.cfg Umgebungsvariablen gesetzt:

Code:
export SCREENDIR=/var/tmp/.screen
export XYZ=123

Wenn ich die Box neu starte und im Terminal dann

Code:
echo $SCREENDIR

oder

Code:
echo $XYZ

eingebe, ist die Variable aber nicht definiert.

Nun habe ich in den letzten Tagen diverse ds-mod Pakete erfolgreich konfiguriert, aber eine Variable definieren kann ich offensichtlich nicht! :noidea:

Was mache ich falsch?

Grüße,
DSLFritze
 
Um Umgebungsvariablen zu setzen musst du Skripte mit ". /var/tmp/script" aufrufen. Der "." ist wichtig...

MfG Oliver
 
@Oliver: Kannst du bitte detailierter erklären, wie es zu machen wäre? Soll debug.cfg dann ein Skript mit "." davor aufrufen? Wird dann die Variable wirklich global gesetzt, oder bleibt es nur innerhalb des Elternprozesses (hier debug.cfg) gültig? Ich hatte mich mit meinem Downloader damals auch stundenlang zum Tode ausprobiert und durchgegoogelt, bis ich es irgendwann mal aufgegeben hatte und die Variable in einer Datei in /tmp abgespeichert. Mag sein, dass ich mich jetzt irre und meine Situation etwas anders war. So ein richtiger Script-Experte bin ich auf keinen Fall.

MfG
 
Einen Schritt weiter...

Hallo olistudent,

Danke! Also ist die debug.cfg kein Skript, sondern ruft nur Skripte auf. Mit diesem Hinweis habe ich die Sache wie folgt geändert:

/var/flash/debug.cfg:
Code:
. /var/tmp/flash/start

Und hier das Skipt /var/tmp/flash/start:
Code:
export SCREENDIR=/var/tmp/.screen
export XYZ=123
cpmaccfg ssm split
/var/tmp/flash/start habe ich ausführbar gesetzt:
Code:
chmod +x /var/tmp/flash/start

Und die gesamte Konfiguration in /var/tmp/flash gesichert:
Code:
modsave flash

Damit habe ich die Box neu gestartet und mich schon gefreut, das Problem mit Deiner Hilfe gelöst zu haben. Dann die Überraschung im Terminal:

Code:
echo $SCREENDIR

zeigt leider, dass die Umgebungsvariable weiterhin nicht bekannt ist :noidea:

Das Skript wird aber ausgeführt, denn der andere Inhalt 'zeigt Wirkung', also hier ein von cpmaccfg richtig umgeschalteter Switch.

Grüße,
DSLFritze
 
Unix-Basics:
  • Ausführbares Skript aufrufen nur mit Skript-Name = neuer Prozeß wird gestartet, definierte Variablen gelten nur in diesem Prozeß.
  • Skript innerhalb des Eltern-Skripts ausführen, indem man schreibt ". Skript-Name" (muß kein Ausühren-Bit "x" gesetzt haben) = Skript wird innerhalb des Eltern-Skripts interpretiert, dort und für von dort später gestartete weitere Kindprozesse gelten auch exportierte Variablen.
  • ABER in beiden Fällen endet die Lebensdauer der Variablen, wenn das Skript endet.
Was bedeutet Punkt 3 im Zusammenhang mit der debug.cfg? Der beim Starten der Box aktive Prozeß "init" startet im Normalfall auf der Box /etc/init.d/rc.S, sozusagen das "Ur-Skript". Dieses wiederum ruft nacheinander die ganzen anderen rc.X-Skripte auf und auch irgendwann die debug.cfg, diese wiederum mit der Aufrufvariante 2, d.h. dort exportierte Variablen gelten dann im Rest des Ur-Skripts und allem, was davon anschließend noch aufgerufen wird. Bereits beendet sind die Aufrufe der AVM-Dienste, was aber noch kommt, sind die DS-Mod-Dienste und am Ende die rc.custom, wo man auch nochmal eigene Sachen hinterlegen kann. Dort sind die in debug.cfg definierten Variablen also nutzbar.

Was passiert nun, wenn man sich auf der Box einloggt mit Telnet oder SSH? Dann hat man diese Variablen nicht, denn man startet ja einen völlig neuen Prozeß. Woher kommen also die gesetzten Variablen, wenn man sich das Environment von der Shell aus anschaut nach dem Login? Von sog. Shell-Profilen. Bei jedem Login wird /etc/profile ausgeführt. Alles, was dort an Variablen direkt oder von wiederum ausgerufenen Unter-Skripten gesetzt wird, sieht der Benutzer bzw. der Shell-Prozeß. Zusätzlich gibt es noch ein benutzerspezifisches Profil, das bei der ash, unserer Shell, aufgerufen wird, sofern es im Benutzer-Home-Verzeichnis existiert: .profile (der Pubnkt gehört zum Dateinamen). Was man also machen kann, ist, in der debug.cfg die Datei /mod/root/.profile zu erzeugen mit dem gewünschten Inhalt (exportierte Variablen). Die sind dann verfügbar. Aber Achtung, ein Problem gibt es: Per SSH-Login funktioniert das, per Telnet momentan nicht, weil der Telnet-Dämon (telnetd) von AVM so gestartet wird, daß nicht der normale Login mit Name und PW aufgerufen wird, sondern der mit Web-Paßwort. Dementsprechend setzt dieser auch nicht das Home-Verzeichnis korrekt (es bleibt bei "/"). Startet man telnetd aber neu ohne Parameter, kann man sich auch über Telnet normal einloggen und landet anschließend im richtigen Home-Verzeichnis, das Profil wird ausgeführt.

Ausblick: Ich habe mir vor einigen Tagen etwas einfallen lassen, um den Telnetd in Zukunft immer mit normalem Login zu starten, so daß auch das Benutzer-Profil funktioniert. Kommt mit dem nächsten Patch.

Alternative 1: Vor dem Flashen schon dafür sorgen, daß /etc/profile gepatcht wird, so daß die gewünschten Befehle fest dort verankert sind.

Alternative 2: Aus der debug.cfg heraus /etc/profile z.B. nach /var/tmp/profile kopieren, gewünschte Befehle anhängen und per
Code:
mount -o bind /var/tmp/profile /etc/profile
dafür sorgen, daß die modifizierte Version die in der Firmware überdeckt und für alle Benutzer ausgeführt wird. In dem Fall braucht man, genau wie in Alternative 1, kein Benutzerprofil, das globale wird ja immer ausgeführt.

Ihr seht, es gibt viele Möglichkeiten. Wem das jetzt zu hoch war, weil zu viel Shell-Kauderwelsch drin ist, muß sich wohl oder übel ein bißchen einlesen. Wie immer an dieser der Verweis auf Unix/Linux-Grundlagen.
 
Da haben sich die Beiträge zeitlich überschnitten. Ein paar Kommentare zusätzlich zu oben Geschriebenem: Erstens, lies Dir bitte unbedingt Grundlagen an, siehe Link weiter oben. Dort steht auch alles, was ich zusammengefaßt habe. Weiter mit Deinen Fragen bzw. Aussagen:

DSLFritze schrieb:
Also ist die debug.cfg kein Skript, sondern ruft nur Skripte auf.
Doch, sie ist ein Skript. Daß sie andere Skripten aufrufen kann, ist aber richtig.

DSLFritze schrieb:
Code:
echo $SCREENDIR
zeigt leider, dass die Umgebungsvariable weiterhin nicht bekannt ist :noidea:
Des Rätsels Lösung steht ja im vorigen Beitrag. Die Variable wird nicht im Profil gesetzt, sondern nur einmal beim Ausführen des Skripts beim Startvorgang, wo sie aber gar nicht verwendet wird. Das nützt Dir nichts.

DSLFritze schrieb:
Das Skript wird aber ausgeführt, denn der andere Inhalt 'zeigt Wirkung', also hier ein von cpmaccfg richtig umgeschalteter Switch.
Ja, wie gesagt, einmal explizit von Dir beim Start der Box. Du willst aber nichts Einmaliges (außer vielleicht, den Schalter zu setzen), sondern zusätzlich noch etwas Wiederkehrendes, nämlich Umgebungsvariablen bei jedem Shell-Login setzen. Das muß ins globale oder Benutzerprofil.

Eigentlich wollte ich keinen Unix-Kurs geben...
 
Danke!

Hallo kriegaex,

mir ist nun klar, warum ich mit einem EXPORT nicht die globalen Umgebungsvariablen erreiche - und mir ist auch klar, dass das Unix-Basiswissen ist, dass ich eigentlich hierher schon mitbringen müßte. Daher ein extra-großes Dankeschön für Deine ausführliche Erläuterung. :)

Ich habe nun die /etc/profile vor dem Flashen so verändert, dass sie ein Skript in /var/tmp/flash aufruft, in dem ich dann die globalen Umgebungsvariablen setzen kann.

Ich hatte Folgendes vor: Einige FritzBoxen sind über OpenVPN verbunden. Wenn ich die über den Browser konfiguriere, steht auf allen Tabs im Browser "Fritz!Box", "DS-MOD Konfiguration" oder "DS-MOD Wake on LAN". Dort wollte ich einen individuellen Boxnamen anzeigen, z.B. den Common Name aus dem OpenSSL-Zertifikat, damit ich nicht irgendwann die Übersicht verliere und aus Versehen mal die falsche Box konfiguriere und sie dann nicht mehr erreichen kann.

Also erst den Boxnamen in eine Umgebungsvariable BOXNAME speichern und diese dann im HTML-GUI-Code auslesen und anzeigen, dachte ich. Die Stellen in /usr/www habe ich identifiziert, aber vom Zugriff aus HTML-Code auf die Umgebungsvariablen habe ich offensichtlich noch weniger Ahnung als von den Umgebungsvariablen selbst, denn mein Versuch

Code:
<? setvariable var:BoxName <? query env:BOXNAME ?> ?>

funktioniert nicht. Also erstmal Grundlagen anlesen und weiter experimentieren :)

Grüße,
DSLFritze
 
Wieder das gleiche Spiel: Es gibt keine globalen Environment-Variablen, sondern nur welche pro Prozeß, die ggf. an Sub-Prozesse exportiert werden können. In dem Fall soll die Variable dem Webserver bzw. einem seiner aufgerufenen Prozesse bekannt gemacht werden. Dann nützt sie wiederum nichts im Shell-Profil, das ja nur in interaktiven Sitzungen gilt.

Davon abgesehen, funktioniert die Expansion von "env:bla" wohl nicht so, wie Du es vermutest. Ich finde auf die Schnelle auch kein Beispiel in einem AVM-Template, wo eine Shell-Environment-Variable abgefragt würde. Du könntest einfach eine passende *.inc, z.B. global.inc, beim Start der Box kopieren, die gewünschte Variablendefinition dynamisch anhängen und dann mit
Code:
mount -o bind kopie original
das Original überdecken. Dann sollte es funktionieren, ich habe es mal eben schnell probiert.
 
In der /etc/init.d/rc.conf sollte sowas zu sehen sein.

MfG Oliver
 
Hallo kriegaex,

danke für die zusätzlichen Hinweise!

Davon abgesehen, funktioniert die Expansion von "env:bla" wohl nicht so, wie Du es vermutest.

Das ist mein generelles Problem: Die Dinge funktionieren nicht so, wie ich es vermute... ;)

Grüße,
DSLFritze
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.