Die meisten Skripte, die / proc / cmdline analysieren, teilen sie in Wörter auf und filtern dann Argumente mit einer case-Anweisung aus, Beispiel:
%Vor% Das Problem liegt vor, wenn die WLAN ESSID Leerzeichen hat. Benutzer erwarten, wlan='FOO
zu setzen
BAR '(wie eine Shell-Variable) und dann das unerwartete Ergebnis von 'FOO
mit dem obigen Code erhalten, da die for-Schleife auf Leerzeichen aufgeteilt wird.
Gibt es eine bessere Möglichkeit, das /proc/cmdline
von einem Shell-Skript zu analysieren, das es fast nicht testet?
Oder gibt es ein paar Tricks? Ich dachte, ich könnte vielleicht Benutzer bitten, Leerzeichen zu entziffern und so zu dekodieren: /bin/busybox httpd -d "FOO%20BAR"
. Oder ist das eine schlechte Lösung?
Es gibt einige Möglichkeiten:
cat /proc/PID/cmdline | tr '
cat /proc/PID/cmdline | xargs -0 echo
0' ' '
/proc/PID/cmdline
Dies funktioniert in den meisten Fällen, wird aber fehlschlagen, wenn Argumente Leerzeichen enthalten. Ich denke jedoch, dass es bessere Ansätze als die Verwendung von %code% geben würde.
Sie könnten etwas wie das folgende mit bash machen, das diese Argumente in Variablen wie $ cmdline_union und $ cmdline_wlan:
umwandelt %Vor%Dann würden Sie Dinge zitieren und / oder entziehen, wie Sie es in einer normalen Shell tun würden.
Da Sie möchten, dass die Shell den Inhalt von / proc / cmdline analysiert, ist es schwierig, die Überprüfung zu vermeiden.
%Vor% Dies ist natürlich gefährlich, da es blindlings alles ausführen würde, was in der Kernel-Befehlszeile wie quiet union=aufs wlan=FOO ) ; touch EVIL ; q=( q
angegeben wurde.
Escape-Leerzeichen (\ x20) klingen nach dem einfachsten und sichersten Weg.
Eine schwere Alternative ist die Verwendung eines Parsers, der Shell-ähnliche Syntax versteht. In diesem Fall brauchen Sie die Shell möglicherweise nicht einmal mehr. Zum Beispiel mit Python:
%Vor%In posh:
%Vor%Sie können eine Funktion definieren und Ihre $ CMDLINE nicht-quoted als Argument für die Funktion angeben. Dann rufen Sie die Parsing-Mechanismen der Shell auf. Beachten Sie, dass Sie dies auf der Shell testen sollten, in der es arbeiten wird - zsh macht einige lustige Dinge mit Zitat; -).
Dann können Sie dem Benutzer einfach sagen, wie in der Shell zu quotieren:
%Vor%(posh - richtlinienkonforme gewöhnliche SHell, eine Shell, die von allen Funktionen abgesehen von POSIX-Standard ausgenommen ist)
Gefunden hier eine nette Möglichkeit, es mit awk zu tun, Leider funktioniert es nur mit doppelten Zahlen:
%Vor%Die Verwendung von / proc / cmdline aus einem Shell-Skript für den Zugriff auf die Befehlszeile ist der falsche Weg. Warum nicht $ @ benutzen?
%Vor%BEARBEITEN: Anführungszeichen um $ @ hinzugefügt.
EDIT: die Frage falsch gelesen; / proc / cmdline ist die Kernel Befehlszeile.
Tags und Links parsing split shell argument-passing word