Split / proc / cmdline Argumente mit Leerzeichen

8

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?

    
hendry 14.06.2009, 18:38
quelle

8 Antworten

12

Es gibt einige Möglichkeiten:

  1. cat /proc/PID/cmdline | tr 'cat /proc/PID/cmdline | xargs -0 echo0' ' '

  2. /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.

    
Shriram V 26.05.2011 03:01
quelle
8
%Vor%     
Natanael Copa 22.02.2013 15:47
quelle
3

Am häufigsten werden printfctal Escape-Sequenzen verwendet, wenn Leerzeichen nicht akzeptabel sind.

In Bash kann %code% verwendet werden, um sie zu entschlüsseln, z. B.

%Vor%     
ephemient 17.06.2009 17:47
quelle
1

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.

    
codemonkeyjohn 02.06.2011 02:59
quelle
1

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%     
Andrey 16.03.2017 21:21
quelle
0

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)

    
liori 17.06.2009 11:00
quelle
-1

Gefunden hier eine nette Möglichkeit, es mit awk zu tun, Leider funktioniert es nur mit doppelten Zahlen:

%Vor%     
RedRampage 26.04.2013 09:21
quelle
-4

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.

    
JesperE 14.06.2009 19:20
quelle