Tips en Trucs 2025

URL's ontleden en manipuleren met trurl

trurl is een eenvoudige opdracht die kan worden gebruikt om de URL te ontleden en te manipuleren. Het is oorspronkelijk ontworpen voor shell scripting om het makkelijk te maken om met URL's te werken vanuit scripts of in de terminal.

Het ondersteunt verschillende bewerkingen, zoals het wijzigen of toevoegen van parameters, het decoderen van URL's en het opvragen van specifieke URL-onderdelen, zoals schema, gebruiker, wachtwoord, opties, host, poort, pad, query, fragment en zoneid.

Bovendien kun je invoer aanleveren vanuit een bestand of vanuit de reguliere STDIN, en het staat je ook toe om uitvoer in JSON formaat te verkrijgen.

Trurl installeren

Onder de motorkap gebruikt het dezelfde libcurl URL-parser die wordt gebruikt in de curl opdracht voor het parsen van URL's.

Dus voordat je verder gaat, moet je een minimale C ontwikkelomgeving en de libcurl4-openssl-dev of libcurl4-gnutls-dev afhankelijkheid op je systeem installeren om trurl te kunnen compileren en gebruiken.

dany@pindabook:~$ sudo apt install libcurl4-openssl-dev make gcc
[sudo] wachtwoord voor root: 
Pakketlijsten worden ingelezen... Klaar
Boom van vereisten wordt opgebouwd... Klaar
De statusinformatie wordt gelezen... Klaar 
De volgende extra pakketten zullen geïnstalleerd worden:
  gcc-12 libasan8 libatomic1 libc-dev-bin libc-devtools libc6-dev libcc1-0 libcrypt-dev libgcc-12-dev libitm1
  liblsan0 libnsl-dev libtirpc-dev libtsan2 libubsan1 linux-libc-dev manpages-dev rpcsvc-proto
Voorgestelde pakketten:
  gcc-multilib autoconf automake libtool flex bison gcc-doc gcc-12-multilib gcc-12-doc gcc-12-locales glibc-doc
  libcurl4-doc libidn-dev libkrb5-dev libldap2-dev librtmp-dev libssh2-1-dev libssl-dev pkg-config zlib1g-dev
  make-doc
De volgende NIEUWE pakketten zullen geïnstalleerd worden:
  gcc gcc-12 libasan8 libatomic1 libc-dev-bin libc-devtools libc6-dev libcc1-0 libcrypt-dev libcurl4-openssl-dev
  libgcc-12-dev libitm1 liblsan0 libnsl-dev libtirpc-dev libtsan2 libubsan1 linux-libc-dev make manpages-dev
  rpcsvc-proto
0 opgewaardeerd, 21 nieuw geïnstalleerd, 0 te verwijderen en 0 niet opgewaardeerd.
Er moeten 35,5 MB aan archieven opgehaald worden.
Na deze bewerking zal er 135 MB extra schijfruimte gebruikt worden.
Wilt u doorgaan? [J/n] 
Ophalen:1 http://deb.debian.org/debian bookworm/main amd64 libcc1-0 amd64 12.2.0-14+deb12u1 [41,7 kB]
Ophalen:2 http://security.debian.org/debian-security bookworm-security/main amd64 linux-libc-dev amd64 6.1.140-1 [2.145 kB]
Ophalen:3 http://deb.debian.org/debian bookworm/main amd64 libitm1 amd64 12.2.0-14+deb12u1 [26,1 kB]
...
Ophalen:19 http://deb.debian.org/debian bookworm/main amd64 libcurl4-openssl-dev amd64 7.88.1-10+deb12u12 [492 kB]
Ophalen:20 http://deb.debian.org/debian bookworm/main amd64 make amd64 4.3-4.1 [396 kB]
Ophalen:21 http://deb.debian.org/debian bookworm/main amd64 manpages-dev all 6.03-2 [2.030 kB]
35,5 MB opgehaald in 2s (16,0 MB/s)      
Voorheen niet geselecteerd pakket libcc1-0:amd64 wordt geselecteerd.
(Database wordt ingelezen ... 174438 bestanden en mappen momenteel geïnstalleerd.)
Uitpakken van .../00-libcc1-0_12.2.0-14+deb12u1_amd64.deb wordt voorbereid...
Bezig met uitpakken van libcc1-0:amd64 (12.2.0-14+deb12u1) ...
...
Voorheen niet geselecteerd pakket manpages-dev wordt geselecteerd.
Uitpakken van .../20-manpages-dev_6.03-2_all.deb wordt voorbereid...
Bezig met uitpakken van manpages-dev (6.03-2) ...
Instellen van manpages-dev (6.03-2) ...
Instellen van linux-libc-dev:amd64 (6.1.140-1) ...
Instellen van libtirpc-dev:amd64 (1.3.3+ds-1) ...
...
Instellen van libc6-dev:amd64 (2.36-9+deb12u10) ...
Instellen van gcc-12 (12.2.0-14+deb12u1) ...
Instellen van gcc (4:12.2.0-3) ...
Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...
Bezig met afhandelen van triggers voor libc-bin (2.36-9+deb12u10) ...

Na het installeren van deze onderdelen kloon je het project naar je huidige map:

dany@pindabook:~$ git clone https://github.com/curl/trurl.git
Cloning into 'trurl'...
remote: Enumerating objects: 1426, done.
remote: Counting objects: 100% (750/750), done.
remote: Compressing objects: 100% (198/198), done.
remote: Total 1426 (delta 595), reused 565 (delta 551), pack-reused 676 (from 3)
Receiving objects: 100% (1426/1426), 454.19 KiB | 7.97 MiB/s, done.
Resolving deltas: 100% (877/877), done.

En verander je de werkmap naar trurl met de volgende opdracht:

dany@pindabook:~$ cd trurl

Compileer vervolgens trurl:

dany@pindabook:~/trurl$ make
cc $(curl-config --cflags) -W -Wall -Wshadow -pedantic -Wconversion -Wmissing-prototypes -Wwrite-strings -Wsign-compare -Wno-sign-conversion -Werror -g   -c -o trurl.o trurl.c
cc  trurl.o -o trurl $(curl-config --libs)
./scripts/cd2nroff trurl.md > trurl.1

En verplaats deze naar de /bin map.

dany@pindabook:~/trurl$ sudo mv trurl /bin

De installatie van trurl is daarmee afgelopen. Je kunt de map met de broncode dan ook verlaten met:

dany@pindabook:~/trurl$ cd

De trurl opdracht gebruiken

Nu is het tijd om trurl te verkennen door het uit te voeren met de beschikbare opties om URL's te ontleden en te manipuleren.

Het eerste wat we testen is hoe trurl unicode karakters in de URL ontcijfert en ons de gedecodeerde URL toont.

dany@pindabook:~$ trurl v%6Forbeeld.org
http://voorbeeld.org/

Is het je opgevallen dat trurl automatisch het http-protocol aan de URL toevoegt.

Maar als je de url aanpast zoals hieronder, dan zie je dat het de protocolnaam toevoegt die je voor de hostnaam hebt geplaatst.

dany@pindabook:~$ trurl smtp.voorbeeld.org
smtp://smtp.voorbeeld.org/

Laten we nu eens kijken hoe je een pad aan de basis url kunt toevoegen.

Om een pad toe te voegen, moet je de --append optie gebruiken en padcomponenten gebruiken uit de beschikbare url-componenten, zoals url, scheme, user, password, options, host, port, path, query, fragment en zoneid.

Nu we de beschikbare componenten kennen, kunnen we het pad nl toevoegen aan de basis URL met:

dany@pindabook:~$ trurl voorbeeld.org --append path="nl"
http://voorbeeld.org/nl

Plaats het pad tussen aanhalingstekens, anders voegt het %20 toe als het een spatie in het pad vindt.

Als je een zoekopdracht wilt toevoegen, kun je de volgende opdracht gebruiken om bar toe te voegen na foo.

dany@pindabook:~$ trurl voorbeeld.org/?s=foo --append query=bar
http://voorbeeld.org/?s=foo&bar

Merk op dat --append alleen werkt met pad en query componenten.

Hierboven hebben we gezien hoe we de componenten path en query aan de URL kunt toevoegen. Nu bekijken we hoe we het pad van de basis URL met de optie --redirect kunen omleiden.

dany@pindabook:~$ trurl voorbeeld.org/contact --redirect "/about/voorbeeld.html"
http://voorbeeld.org/about/voorbeeld.html

Als je een specifieke URL component wilt toevoegen of aanpassen, dan kun je de -s of --set optie gebruiken:

dany@pindabook:~$ trurl https://voorbeeld.org --set host="pindanet.be"
https://pindanet.be/
dany@pindabook:~$ trurl https://voorbeeld.org --set port="8080"
https://voorbeeld.org:8080/
dany@pindabook:~$ trurl https://voorbeeld.org --set fragment="test"
https://voorbeeld.org/#test

Je kunt trurl ook gebruiken om bepaalde URL componenten te extraheren uit de respectievelijke URL door gebruik te maken van de -g of --get opties.

dany@pindabook:~$ trurl --url https://voorbeeld.org:8080 -g '{port}'
8080
dany@pindabook:~$ trurl --url https://voorbeeld.org:8080 -g '{port} {host}'
8080 voorbeeld.org
trurl

Om de informatie in het JSON formaat op te vragen, gebruik je:

dany@pindabook:~$ trurl https://voorbeeld.org:8080 --json
[
  {
    "url": "https://voorbeeld.org:8080/",
    "parts": {
      "scheme": "https",
      "host": "voorbeeld.org",
      "port": "8080",
      "path": "/"
    }
  }
]

Als je wilt, kun je ook een lijst met url's manipuleren door het pad met de bestandsnaam op te geven waarin je de url's hebt opgeslagen. Dit maakt het veel gemakkelijker voor je om het bestand te manipuleren en te ontleden.

Laten we als voorbeeld met de nano teksteditor een lijst met URS's aanmaken:

dany@pindabook:~$ nano urllijst

Plaats in dit bestand bijvoorbeeld de volgende URL's:

 GNU nano 7.2                        urllijst                                   
https://voorbeeld.org
https://test.org
https://www.debian.org
sftp://sftp.voorbeeld.org


                             [ Nieuw bestand ]
^G Hulp      ^O Opslaan   ^W Zoeken    ^K Knippen   ^T Opdracht  ^C Positie
^X Afsluiten ^R Inlezen   ^\ Vervangen ^U Plakken   ^J Uitvullen ^/ Naar regel

Sla de urllijst op met de sneltoets Ctrl+o, gevolgd door Return. Verlaat de nano editor met de sneltoets Ctrl+x.

Om de URL's uit het bestand te lezen, gebruik je de optie --url-file of -f en geef je het pad op naar het bestand met de URL's.

dany@pindabook:~$ trurl --url-file ./urllijst 
https://voorbeeld.org/
https://test.org/
https://www.debian.org/
sftp://sftp.voorbeeld.org/

Als je enkel het protocol en de hostnaam wilt:

dany@pindabook:~$ trurl --url-file ./urllijst -g '{scheme} {host}'
https voorbeeld.org
https test.org
https www.debian.org
sftp sftp.voorbeeld.org

Afsluiten doen we met een tutorial van één van de ontwikkelaars.

Opruimen