3 votes

mod_sed - apache+sed - problèmes avec les antislashs

Je viens de commencer à utiliser sed et j'ai un problème lorsque j'utilise sed depuis Apache mod_seq. La tâche consiste à transformer un message de service web en message de téléchargement de fichiers. Le Content-Type a déjà été modifié à l'aide de mod_headers et la tâche ici est de modifier le corps de la requête.

Corps de la demande :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://tracx.de/pkp/interfaces/msg/1.0" xmlns:ns1="http://tracx.de/pkp/interfaces/core/1.0"><soapenv:Header/><soapenv:Body><ns:test>Hello World</ns:test></soapenv:Body></soapenv:Envelope>

1) ok test avec sed depuis l'invite de commande :

sed "s/^.\*$/--AaB03x\\nContent-disposition: form-data; name=\\"xmlfile\\"; filename=\\"myfile.xml\\"\\nContent-Type: text\\/xml\\n\\n&\\n--AaB03x--\\n/" request.xml

Sortie comme prévu avec les nouvelles lignes :

\--AaB03x
Content-disposition: form-data; name="xmlfile"; filename="myfile.xml"
Content-Type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://tracx.de/pkp/interfaces/msg/1.0" xmlns:ns1="http://tracx.de/pkp/interfaces/core/1.0"><soapenv:Header/><soapenv:Body><ns:test>Hello World</ns:test></soapenv:Body></soapenv:Envelope>
--AaB03x--

2) Appel Sed avec Apache mod_sed :

InputSed "s/^.\*$/--AaB03x\\nContent-disposition: form-data; name=\\"xmlfile\\"; filename=\\"myfile.xml\\"\\nContent-Type: text\\/xml\\n\\n&\\n--AaB03x--\\n/"

Sortie du mod_sed lorsque la requête entre dans mon application web. Notez le "n" au lieu de la nouvelle ligne.

\--AaB03xnContent-disposition: form-data; name="xmlfile"; filename="myfile.xml"nContent-Type: text/xmlnn<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://tracx.de/pkp/interfaces/msg/1.0" xmlns:ns1="http://tracx.de/pkp/interfaces/core/1.0"><soapenv:Header/><soapenv:Body><ns:test>monday</ns:test></soapenv:Body></soapenv:Envelope>n--AaB03x--n

J'ai essayé avec '' et "" dans la commande InputSed. Et j'ai essayé avec 1, 2, 3 et 4 espaces avant mes caractères de contrôle ( \r y \n ). Il semble qu'Apache ou le mod_sed ignorent le caractère backslash.

Quelqu'un sait-il s'il y a des problèmes particuliers avec le mod_sed et le backslash ?

2voto

guest-vm Points 3164

Contournement laid testé sur Ubuntu Apache/2.4.18, en utilisant le sous-ensemble supporté de sed :

$ cat tmp
line3
$ sed "h;s/.\*/line1/;p;s/.\*/line2/;G;p;s/.\*/line4/" tmp
line1
line2
line3
line4
$ cat week
sunday
wednesday
friday
$ sed "2{h;s/.\*/monday/;p;s/.\*/tuesday/;G;p;s/.\*/thursday/;n;p;s/.\*/saturday/;}" week
sunday
monday
tuesday
wednesday
thursday
friday
saturday
    these work too as \\n is still recognised in search string
"G;H;g;s/\\n/line1&line2&/;s/\\n$/&line4/"
"2{G;H;g;s/\\n/monday&tuesday&/;s/\\n$/&thursday/;n;p;s/.\*/saturday/;}"
    $ #sudo a2enmod sed
$ #apache2.conf
<Location /txt/>
    AddOutputFilter Sed txt
    OutputSed "G;H;g;s/\\n/line1&line2&/;s/\\n$/&line4/"
</Location>
$ service apache2 reload
$ wget localhost/txt/tmp.txt -qO -
line1
line2
line3
line4
    $ #sudo a2enmod ext\_filter
$ #apache2.conf
ExtFilterDefine external\_sed mode=output intype=text/plain cmd="/bin/sed :0;N;$!b0;s/\\\\n//g"
<Location /txt/>
    SetOutputFilter external\_sed
</Location>
$ service apache2 reload
$ wget localhost/txt/week.txt -qO -
sundaywednesdayfriday

Voir aussi : #1 , #2

0voto

Zimmi Points 351

Si vous voulez remplacer une seule ligne de texte par plusieurs lignes de texte, vous pouvez essayer la réponse suivante ici .

Je n'ai pas d'expérience avec le mod_sed, mais le doc États :

mod_sed peut être utilisé comme un filtre d'entrée ou de sortie. mod_sed est un filtre de contenu. ce qui signifie qu'il ne peut pas être utilisé pour modifier les en-têtes http du client ou du serveur. client ou serveur.

mod_headers peut être plus adapté à ce que vous voulez faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X