• strano problemino con stringhe base64

    From Piviul@21:1/5 to All on Tue Mar 12 14:40:01 2024
    Ciao a tutti, ho uno script che interroga (ldapsearch) alcuni campi di
    un db ldap e aggiunge alcuni altri ammenicoli che poi importa in un
    altro db sempre ldap.

    In particolare nello script ad un certo punto ho questo codice:

    ldapsearch -LLL \
            -D "$bind_ns" \
            -w "$pwd_ns" \
            -b "$baseaddress_ns" \
            -H "ldaps://ad.csaricerche.com" \ '(&(objectClass=user)(!(isCriticalSystemObject=TRUE))(!(logonCount=0))(memberOf=CN=utenti,CN=Users,DC=ad,DC=csaricerche,DC=com))'
    \
            sAMAccountName displayName userPrincipalName | \
            sed -e 's/userPrincipalName:/mail:/' \
                -e "s/$container_ns/$container_ab/" \
                -e "s/sAMAccountName:\ \(.*\)/cn: \1/" \
                -e "s/displayName:\ \(.*\)$/displayName: \1\nsn: \1\nou:
    utenti\nobjectClass: top\nobjectClass: inetOrgPerson/"> $ldap_ns_path

    che in altre parole vorrebbe semplicemente interrogare sAMAccountName displayName userPrincipalName ed aggiungere sn con la stessa cosa che
    trova in userPrincipalName e poi altri ammenicoli necessari per
    l'importazione successiva in un altro db.

    Il tutto ha funzionato bene per anni ma ora in displayName di un record
    è stata inserita un'accentata e questo fa si che il comando sopra, al
    record contenente un'accentata, non venga aggiunto né sn né gli altri ammenicoli mentre compaioni : aggiuntivi al displayName.

    In altre parole per il record in questione viene restituito come

    dn: CN=enicolo,OU=UsersAndGroups,DC=ad,DC=mydomain,DC=ext
    cn: enicolo
    mail: enicolo@mydomain.ext
    displayName:: Tmljb2zDsiBFZG9hcmRv

    dove Tmljb2zDsiBFZG9hcmRv è la stringa contenente una o accentata
    codificata in base64:

    # echo Tmljb2zDsiBFZG9hcmRv | base64 --decode
    Nicolò Edoardo

    Invece sed avrebbe dovuto restituire

    dn: CN=enicolo,OU=UsersAndGroups,DC=ad,DC=mydomain,DC=ext
    cn: enicolo
    mail: enicolo@mydomain.ext
    displayName: Tmljb2zDsiBFZG9hcmRv
    sn: Tmljb2zDsiBFZG9hcmRv
    ou: utenti
    objectClass: top
    objectClass: inetOrgPerson


    Qualcuno ha qualche idea di cosa dabbia fastidio a sed?

    Grazie

    Piviul

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Giuseppe Sacco@21:1/5 to All on Tue Mar 12 18:10:01 2024
    Ciao Piviul,

    Il giorno mar, 12/03/2024 alle 10.18 +0100, Piviul ha scritto:
    Ciao a tutti, ho uno script che interroga (ldapsearch) alcuni campi di
    un db ldap e aggiunge alcuni altri ammenicoli che poi importa in un
    altro db sempre ldap.
    [...]
                -e "s/displayName:\ \(.*\)$/displayName: \1\nsn: \1\nou:
    utenti\nobjectClass: top\nobjectClass: inetOrgPerson/"> $ldap_ns_path
    [...]

    Mi pare di capire che sed sostituisca solo le linee che contengono "displayName:" seguito da uno spazio. Nel tuo caso "displayName:" non è seguito da uno spazio, ma dal secondo ":", sicché sed non lo prende in considerazione. Forse dovresti cambiare l'espressione con le regex estese, così:

    sed -E -e "s/displayName(:|::)\ (.*)$/displayName\1 \2/"

    Ciao,
    Giuseppe

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Piviul@21:1/5 to Diego Zuccato on Wed Mar 13 08:40:01 2024
    On 3/12/24 14:44, Diego Zuccato wrote:
    Mah, ma me pare che funzioni rimuovendo la parte '-e "s/$container_ns/$container_ab/"' che non posso testare in quanto non
    so cosa ci sia nelle variabili container_ns e container_ab . Magari
    c'è qualcosa di strano che interferisce?

    hai ragione, non lo puoi verificare e mi scuso, comunque ho risolto.
    Questo codice ora funziona:

    ldapsearch -LLL \
        -D "$bind_ns" \
        -w "$pwd_ns" \
        -b "$baseaddress_ns" \
        -H "ldaps://ad.mydomain.ext" \ '(&(objectClass=user)(!(isCriticalSystemObject=TRUE))(!(logonCount=0))(memberOf=CN=utenti,CN=Users,DC=ad,DC=mydomain,DC=ext))'
    \
        sAMAccountName displayName userPrincipalName | \
        sed -e 's/userPrincipalName:/mail:/' \
            -e "s/$container_ns/$container_ab/" \
            -e "s/sAMAccountName:\ \(.*\)/cn: \1/" \
            -e "s/displayName:[[:space:]]*\([[:print:]]*\)$/displayName: \1\nsn: \1\nou: utenti\nobjectClass: top\nobjectClass: inetOrgPerson/"> $ldap_ns_path

    in cui mi limito a prendere tutti i caratteri stampabili invece di
    prendere tutti i caratteri dopo displayName:[[:space:]].

    Ora l'utente incriminato viene restituito come:

    dn: CN=enicolo,OU=UsersAndGroups,DC=ad,DC=mydomain,DC=ext
    cn: enicolo
    mail: enicolo@mydomain.ext
    displayName: : Tmljb2zDsiBFZG9hcmRv
    sn: : Tmljb2zDsiBFZG9hcmRv
    ou: utenti
    objectClass: top
    objectClass: inetOrgPerson

    Mi rimane solo da decodificare displayName e sn, stringhe in bas64...
    per fortuna ldapsearch aggiunge ":" alle stringhe codificate in bas64
    così supponendo che non ci siano ":" nei campi restituiti da ldapsearch  (sAMAccountName, displayName e userPrincipalName) l'ho risolto così:

    ifs=$IFS
    IFS="
    "
    for r in $(grep displayName $ldap_ns_path); do
        dn64=$(echo $r | cut -f3 -d: | grep -o "[^[:space:]]*")
        [ -z "$dn64" ] && continue
        dn=$(echo $dn64 | base64 -i --decode)
        sed -i "s/: $dn64/$dn/" $ldap_ns_path
    done
    IFS=$ifs

    Grazie per la pazienza

    Piviul

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Piviul@21:1/5 to Giuseppe Sacco on Wed Mar 13 09:10:01 2024
    On 3/12/24 18:04, Giuseppe Sacco wrote:
    Ciao Piviul,

    Il giorno mar, 12/03/2024 alle 10.18 +0100, Piviul ha scritto:
    Ciao a tutti, ho uno script che interroga (ldapsearch) alcuni campi di
    un db ldap e aggiunge alcuni altri ammenicoli che poi importa in un
    altro db sempre ldap.
    [...]
                -e "s/displayName:\ \(.*\)$/displayName: \1\nsn: \1\nou:
    utenti\nobjectClass: top\nobjectClass: inetOrgPerson/"> $ldap_ns_path
    [...]

    Mi pare di capire che sed sostituisca solo le linee che contengono "displayName:" seguito da uno spazio. Nel tuo caso "displayName:" non è seguito da uno spazio, ma dal secondo ":", sicché sed non lo prende in considerazione. Forse dovresti cambiare l'espressione con le regex estese, così:

    sed -E -e "s/displayName(:|::)\ (.*)$/displayName\1 \2/"

    Grazie Giuseppe, hai ragione, che pataca! Grazie ancora, ora è proprio
    tutto risolto... anzi quasi... per caso in sed, nella sostituzione si
    possono inserire comandi... qualcosa tipo

    echo  "displayName:: Tmljb2zDsiBFZG9hcmRv" | sed -E -e
    "s/(displayName:): (.*)$/\1 $(echo "\2" | base64 -i --decode)/"

    Purtroppo non funziona, restituisce l'errore "base64: input non valido"
    ma non capisco perché; questo però funziona

    echo  "displayName:: Tmljb2zDsiBFZG9hcmRv" |  sed -E -e
    "s/(displayName:): (.*)$/\1 $(echo "\2")/"

    e restituisce

    displayName: Tmljb2zDsiBFZG9hcmRv

    Quindi sembra non venga interpretato correttamente il pipe... hai
    qualche suggerimento?

    Piviul

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marco Ciampa@21:1/5 to All on Wed Mar 13 09:20:01 2024
    Il Tue, Mar 12, 2024 at 10:18:21AM +0100, Piviul ha scritto:
    Ciao a tutti, ho uno script che interroga (ldapsearch) alcuni campi di un db ldap e aggiunge alcuni altri ammenicoli che poi importa in un altro db
    sempre ldap.

    In particolare nello script ad un certo punto ho questo codice:

    ldapsearch -LLL \
            -D "$bind_ns" \
            -w "$pwd_ns" \
            -b "$baseaddress_ns" \
            -H "ldaps://ad.csaricerche.com" \ '(&(objectClass=user)(!(isCriticalSystemObject=TRUE))(!(logonCount=0))(memberOf=CN=utenti,CN=Users,DC=ad,DC=csaricerche,DC=com))'
    \
            sAMAccountName displayName userPrincipalName | \         sed -e 's/userPrincipalName:/mail:/' \
                -e "s/$container_ns/$container_ab/" \             -e "s/sAMAccountName:\ \(.*\)/cn: \1/" \             -e "s/displayName:\ \(.*\)$/displayName: \1\nsn: \1\nou:
    utenti\nobjectClass: top\nobjectClass: inetOrgPerson/"> $ldap_ns_path

    che in altre parole vorrebbe semplicemente interrogare sAMAccountName displayName userPrincipalName ed aggiungere sn con la stessa cosa che trova in userPrincipalName e poi altri ammenicoli necessari per l'importazione successiva in un altro db.

    Il tutto ha funzionato bene per anni ma ora in displayName di un record è stata inserita un'accentata e questo fa si che il comando sopra, al record contenente un'accentata, non venga aggiunto né sn né gli altri ammenicoli mentre compaioni : aggiuntivi al displayName.

    In altre parole per il record in questione viene restituito come

    dn: CN=enicolo,OU=UsersAndGroups,DC=ad,DC=mydomain,DC=ext
    cn: enicolo
    mail: enicolo@mydomain.ext
    displayName:: Tmljb2zDsiBFZG9hcmRv

    dove Tmljb2zDsiBFZG9hcmRv è la stringa contenente una o accentata codificata in base64:

    # echo Tmljb2zDsiBFZG9hcmRv | base64 --decode
    Nicolò Edoardo

    Invece sed avrebbe dovuto restituire

    dn: CN=enicolo,OU=UsersAndGroups,DC=ad,DC=mydomain,DC=ext
    cn: enicolo
    mail: enicolo@mydomain.ext
    displayName: Tmljb2zDsiBFZG9hcmRv
    sn: Tmljb2zDsiBFZG9hcmRv
    ou: utenti
    objectClass: top
    objectClass: inetOrgPerson


    Qualcuno ha qualche idea di cosa dabbia fastidio a sed?

    Grazie

    Piviul

    Non è una soluzione ma è relativo a questo problema in generale:

    There's No Such Thing As Plain Text • Dylan Beattie • YOW! 2023

    https://www.youtube.com/watch?v=ajfb5LSbQVM


    --

    Amike,
    Marco Ciampa

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Davide Prina@21:1/5 to All on Sun Mar 17 11:00:01 2024
    Piviul ha scritto:

    echo  "displayName:: Tmljb2zDsiBFZG9hcmRv" | sed -E -e
    "s/(displayName:): (.*)$/\1 $(echo "\2" | base64 -i --decode)/"

    Purtroppo non funziona, restituisce l'errore "base64: input non valido"

    $ eval $(echo "displayName:: Tmljb2zDsiBFZG9hcmRv" | sed -E -e "s/(displayName:): (.*
    )$/echo \"\1 \$(echo \2 | base64 -i --decode)\"/")

    Ciao
    Davide

    --
    La mia privacy non è affar tuo
    https://noyb.eu/it
    - You do not have my permission to use this email to train an AI -
    If you use this to train your AI than you accept to distribute under AGPL license >= 3.0 all the model trained, all the source you have used to
    training your model and all the source of the program that use that model

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Piviul@21:1/5 to Davide Prina on Mon Mar 18 14:30:01 2024
    On 3/17/24 10:49, Davide Prina wrote:
    Piviul ha scritto:

    echo  "displayName:: Tmljb2zDsiBFZG9hcmRv" | sed -E -e
    "s/(displayName:): (.*)$/\1 $(echo "\2" | base64 -i --decode)/"

    Purtroppo non funziona, restituisce l'errore "base64: input non valido"
    $ eval $(echo "displayName:: Tmljb2zDsiBFZG9hcmRv" | sed -E -e "s/(displayName:): (.*
    )$/echo \"\1 \$(echo \2 | base64 -i --decode)\"/")

    Grazie Davide!

    Piviul

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)