Decodering van URL-codering (procentcodering)

Ik wil URL-codering decoderen, is er een ingebouwde tool om dit te doen of kan iemand me een sed code die dit zal doen?

Ik heb een beetje gezocht in unix.stackexchange.com en op internet, maar ik kon geen opdrachtregelprogramma vinden voor het decoderen url-codering.

Wat ik wil doen, is gewoon een txt -bestand bewerken zodat:

  • %21 wordt !
  • %23 wordt #
  • %24 wordt $
  • %26 wordt &
  • %27 wordt "
  • %28 wordt (
  • %29 wordt )

Enzovoort.

Reacties

Antwoord

Vond deze Python one liners die doen wat je wilt:

Python2

$ alias urldecode="python -c "import sys, urllib as ul; \ print ul.unquote_plus(sys.argv[1])"" $ alias urlencode="python -c "import sys, urllib as ul; \ print ul.quote_plus(sys.argv[1])"" 

Python3

$ alias urldecode="python3 -c "import sys, urllib.parse as ul; \ print(ul.unquote_plus(sys.argv[1]))"" $ alias urlencode="python3 -c "import sys, urllib.parse as ul; \ print (ul.quote_plus(sys.argv[1]))"" 

Voorbeeld

$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B 

Referenties

Reacties

  • Ik weet dit pas heel laat , maar is er een manier waarop ik dit kan doen met in-place bewerken?
  • @DisplayName – klinkt als een nieuwe Q voor mij. Ik ‘ zou het hebben gevraagd en naar deze hebben verwezen.
  • streaming: cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
  • Zie @DIG mbl ‘ s antwoord voor een die werkt met stdin.

Answer

sed

Probeer de volgende opdrachtregel:

$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b" 

of het volgende alternatief met echo -e:

$ sed -e"s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g" file | xargs echo -e 

Opmerking: de bovenstaande syntaxis kan + niet converteren naar spaties, en kan alle nieuwe regels opeten.


Je kunt het definiëren als alias en het toevoegen aan je shell rc bestanden:

$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"" 

Ga dan, elke keer als je het nodig hebt, gewoon met:

$ echo "http%3A%2F%2Fwww" | urldecode http://www 

Bash

Bij scripting kunt u de volgende syntaxis gebruiken:

input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}") 

Bovenstaande syntaxis zal echter geen “plussen” behandelen (+) correct, dus u” moet ze vervangen door spaties via sed of zoals voorgesteld door @isaac , gebruik de volgende syntaxis:

decoded=$(input=${input//+/ }; printf "${input//%/\\x}") 

U kunt ook de volgende urlencode() en urldecode() functies gebruiken:

urlencode() { # urlencode <string> local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in [a-zA-Z0-9.~_-]) printf "$c" ;; *) printf "%%%02X" ""$c" ;; esac done } urldecode() { # urldecode <string> local url_encoded="${1//+/ }" printf "%b" "${url_encoded//%/\\x}" } 

Merk op dat hierboven urldecode() ervan uitgaat dat de gegevens geen backslash bevatten.

Hier is een vergelijkbare Joel” versie gevonden op: https://github.com/sixarm/urldecode.sh


bash + xxd

Bash-functie met xxd tool:

urlencode() { local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in [a-zA-Z0-9.~_-]) printf "$c" ;; *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done esac done } 

Gevonden in cdown “s gist-bestand , ook op stackoverflow .


PHP

Met PHP kun je het volgende commando proberen:

$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas 

of gewoon:

php -r "echo urldecode("oil+and+gas");" 

Gebruik -R voor invoer van meerdere regels.


Perl

In Perl u kan URI::Escape gebruiken.

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Of om een bestand te verwerken:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

awk

Probeer anon oplossing:

awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%.. 

Opmerking: parameter -n is specifiek voor GNU awk.

Zie: awk printf gebruiken om tekst te urldecoderen .

decodering van bestandsnamen

Als u URL-codering uit de bestandsnamen wilt verwijderen, gebruikt u de tool deurlname van renameutils (bijv deurlname *.*).

Zie ook:


Gerelateerd:

Reacties

  • awk: zoals dit maakt gebruik van een bibliotheekfunctie, chr(), is de kans groot dat het alleen zal werken op GNU awk (gawk). In dit geval zal er echter nauwelijks een equivalent zijn voor POSIX awk, omdat de -n optie (niet-decimale argumenten toestaat) IS een GNU awk specialiteit.
  • Uw oplossingen met printf houden er geen rekening mee dat de url kan procenttekens met escapecodes bevatten, zoals %25. Je geeft deze door aan printf zonder ze te ontsnappen voor printf met een ander procentteken zoals %%.
  • De bash-versie vereist local LC_ALL=C bovenaan, anders worden alle brede tekens (dwz Japans, Chinees, enz.) niet correct in bytes opgesplitst.
  • github.com/SixArm/ urlencode.sh
  • De printf-versies werken niet ‘ niet bij gebruik van de BSD-versie van printf (bijv. macOS), maar het werkt prima bij gebruik van de GNU Coreutils-versie.

Answer

Daar is een ingebouwde functie voor in de Python-standaardbibliotheek. In Python 2 is het “s urllib.unquote .

decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url") 

Of om een bestand te verwerken:

python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file 

In Python 3 is het “s urllib.parse.unquote .

decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url") 

Of om een bestand te verwerken:

python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file 

In Perl kunt u URI::Escape gebruiken.

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Of om een bestand te verwerken:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

Als je bij POSIX draagbare tools wilt blijven, het ” s lastig, omdat de enige serieuze kandidaat awk is, die geen hexadecimale getallen ontleedt. Zie Awk printf gebruiken om tekst te urldecoderen voor voorbeelden met veelgebruikte awk-implementaties, waaronder BusyBox.

Answer

Perl one liner:

$ perl -pe "s/\%(\w\w)/chr hex $1/ge" 

Voorbeeld:

$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !" 

Reacties

  • Dit antwoord is aantrekkelijk als je niet ‘ wilt afhandelen met het installeren van perl-modules.
  • De enige die voor mij elegant werkte op MacOS.
  • Als je alle niveaus van URL-codering in één keer wilt oplossen, is er ‘ s ook perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' die alle %25xx geneste coderingen

antwoord

Als je een eenvoudig sed commando wilt gebruiken, gebruik dan het volgende:

sed -e "s/%21/!/g" -e "s/%23/#/g" -e "s/%24/$/g" -e "s/%26/\&/g" -e "s/%27/"/g" -e "s/%28/(/g" -e "s/%29/)/g" 

Maar het is handiger om een script te maken zoals (zeg sedscript):

 s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g  

Voer vervolgens sed -f sedscript < old > new uit, wat zal worden uitgevoerd zoals je wilt.


Voor het gemak is het commando urlencode ook direct beschikbaar in gridsite-clients pakket kan worden geïnstalleerd vanuit (door sudo apt-get install gridsite-clients in Ubuntu / Debian-systeem).

NAME

    urlencode – converteer strings van of naar URL-gecodeerde vorm

SYNOPSIS

    urlencode [-m|-d] string [string ...]

BESCHRIJVING

    urlencode codeert strings volgens RFC 1738.

    Dat wil zeggen tekens AZ az 09 . _ en - worden ongewijzigd doorgegeven, maar alle andere karakters worden weergegeven als% HH, waarbij HH hun twee-d is igit hexadecimale ASCII-weergave in hoofdletters. De URL http://www.gridpp.ac.uk/ wordt bijvoorbeeld http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode converteert elk teken in alle strings die op de opdrachtregel worden gegeven. Als er meerdere strings worden opgegeven, worden ze vóór de conversie aaneengeschakeld met scheidingsspaties.

OPTIONS

    -m

      In plaats van volledige conversie, gebruik GridSite “milde URL-codering” waarin AZ az 0-9. = – _ @ en / worden ongewijzigd doorlopen. Dit resulteert in iets meer door mensen leesbare strings, maar de toepassing moet voorbereid zijn om de mappen te maken of te simuleren die worden geïmpliceerd door schuine strepen.

    -d

      Doe liever URL-decodering dan coderen, volgens RFC 1738.% HH en% hh strings worden geconverteerd en andere karakters worden ongewijzigd doorgegeven, met de uitzondering dat + wordt geconverteerd naar spatie.

Voorbeeld van decoderings-URL:

$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc 

Opmerkingen

  • Voor tutorial over sed bezoek
  • Dit is een slechte oplossing, omdat elk karakter hard moet worden gecodeerd. Dit probleem wordt geïllustreerd doordat uw code de vaak gebruikte %20 escape-reeks mist.
  • @Overv I ‘ ve zojuist Herzien
  • Je zou ook willen controleren wat s/%26/&/g doet. (Ik heb het opgelost.)

Antwoord

Ik kan “geen commentaar geven op beste antwoord in deze discussie , dus hier is het mijne.

Persoonlijk gebruik ik deze aliassen voor URL-codering en decodering:

alias urlencode="python -c "import urllib, sys; print urllib.quote( sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" alias urldecode="python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" 

Met beide opdrachten kunt u gegevens converteren die zijn doorgegeven als een opdrachtregelargument of lezen uit standaard invoer , omdat beide oneliners controleren of er opdrachtregelargumenten zijn (zelfs lege) en ze verwerken of gewoon lezen anders standaardinvoer.


update 2017-05-23 (slash-codering)

Als reactie op de opmerking van @Bevor.

Als je moet ook de slash coderen, voeg gewoon een leeg tweede argument toe aan de quote-functie, dan wordt de slash ook gecodeerd.

Dus, eindelijk urlencode alias in bash ziet er als volgt uit:

alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"" 

Examen ple

$ urlencode "Проба пера/Pen test" %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ echo "Проба пера/Pen test" | urlencode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test Проба пера/Pen test $ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode Проба пера/Pen test $ urlencode "Проба пера/Pen test" | urldecode Проба пера/Pen test $ echo "Проба пера/Pen test" | urlencode | urldecode Проба пера/Pen test 

Reacties

  • Codeert geen slashes.
  • @Bevor : Voorbeeld?
  • Voeg een schuine streep toe aan urlencode ” Проба пера ” – > resultaat: Slash is niet gecodeerd.
  • @Bevor: Je hebt gelijk. Bedankt voor je reactie. Ik zal mijn antwoord ook wijzigen om jouw opmerking erin weer te geven.

Antwoord

GNU Awk

#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } } 

Antwoord

En een andere Perl-benadering:

 #!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }  

Je moet de URI::Encode module installeren. Op mijn Debian kon ik eenvoudig

sudo apt-get install liburi-encode-perl 

uitvoeren. Vervolgens draaide ik het bovenstaande script op een testbestand met:

 http://foo%21asd%23asd%24%26asd%27asd%28asd%29  

Het resultaat was (ik had het script opgeslagen als foo.pl):

 $ ./foo.pl http://foo!asd#asd$&asd"asd(asd)  

Antwoord

Een antwoord in (meestal Posix) shell:

$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !" 

Uitleg:

  • -e "s/+/ /g transformeert elke + in de ruimte (zoals beschreven in url-coderingsnorm)
  • -e "s/%\(..\)/\\\\x\1/g" transformeer elke %XX in \\xXX. Merk op dat een van \ zal worden verwijderd door regels aan te halen.
  • De binnenste printf is er alleen om invoer door te geven aan sed. We kunnen het vervangen door een ander mechanisme.
  • De buitenste printf interpreteert \\xXX reeksen en geeft het resultaat weer.

Bewerken:

Aangezien % altijd in URLs moet worden geïnterpreteerd, het is mogelijk om dit antwoord te vereenvoudigen. Bovendien denk ik dat het schoner is om xargs te gebruiken in plaats van backquotes (met dank aan @josch).

$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" % 

Helaas, (zoals @josch opmerkte) is geen van deze oplossingen Posix-compatibel aangezien \x escape-reeks niet is gedefinieerd in Posix.

Reacties

  • Welkom bij U & L. Misschien kunt u dit antwoord uitleggen en hoe het werkt. Over het algemeen geven we er de voorkeur aan dat onze antwoorden lang zijn met details, niet alleen codefragmenten.
  • Ik vind dit antwoord echt leuk omdat het ‘ uitgebreid, draagbaar is en ‘ t vereisen extra zwaardere externe programmas zoals perl of python. Werkt goed voor mij.
  • Geweldige oplossing. En nog korter en slimmer: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. De -e optie kan hier in feite worden weggelaten …
  • @josch Je hebt gelijk, printf is een ingebouwd in dash en ‘ herkent \x escaping niet. U kunt /usr/bin/printf gebruiken in plaats van printf om het te laten werken. Normaal gesproken zou u command printf moeten kunnen gebruiken, maar het lijkt niet te werken zoals het zou moeten. Het blijft het ingebouwde gebruiken.
  • @Jezz inderdaad ondersteuning voor \x ontsnapping maakt geen deel uit van POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Tijdens mijn tests zag ik een ander probleem. Misschien wilt u uw .. regex vervangen door [a-zA-Z0-9][a-zA-Z0-9] omdat anders invoer als ‘ %% % ‘ zal mislukken. Ik heb ook s/%/%%/g aan het einde toegevoegd om ervoor te zorgen dat de percentages voor printf ontsnappen.

Antwoord

Een andere oplossing die ruby gebruikt (geaccepteerd python-antwoord werkte niet voor mij)

 alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""  

Voorbeeld

 $ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B  

Reacties

  • Gewoon gewend aan ruby, en deze uitspraken zien er kleiner uit. Ook ben ik overgestapt op ARGF.read zodat ik het kan gebruiken zoals ik doe met veel andere hulpprogrammas!

Antwoord

Hier is een BASH-functie om precies dat te doen:

function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") } 

Reacties

  • werkt als charme
  • Als je + tekens wilt converteren naar spaties en geen processen spawnen, kunt u dit gebruiken: : "${1//+/ }" && echo -e "${_//%/\\x}"

Antwoord

Alleen shell:

 $ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ  

Voeg -- of %b om te voorkomen dat argumenten die beginnen met een liggend streepje, als opties worden behandeld.

In zsh ${x//%/a} voegt a toe aan het einde maar ${x//\%/a} vervangt % door a.

Antwoord

Hier zijn de relevante stukjes uit een ander script (dat ik gewoon schaamteloos gestolen van mijn youtube.com downloadscript van een ander antwoord) heb ik eerder geschreven. Het gebruikt sed en de shell om een werkende urldecode op te bouwen.

set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )" 

Ik zweer niet dat het allesomvattend is – en eigenlijk betwijfel ik het – maar het behandelde youtube zeker genoeg.

Antwoord

De eenvoudige oplossing voor korte strings (shell is slowwww):

$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/; 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *