Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witajcie. Mam sobie plik z userami. Ma on strukturę:
user:hasło
Niestety czasami w haśle pojawiają się apostrofy '
Chcę je zamienić na \' bo muszę przygotować kwerendę SQL. Mam taki fragment kodu:
haslo=`echo $line | cut -f2 -d ":" | sed "s/'/\\\'/"` echo "UPDATE dbname SET pass = '$haslo' WHERE username = '$user';"
Niestety zamiast
UPDATE dbname SET pass = 'h$asl\'0' WHERE username = 'potok';
mam
UPDATE dbname SET pass = 'h$asl'0' WHERE username = 'potok';
Co robię nie tak?
Offline
To wtedy pozostaje problem, jak user używa " w haśle
Offline
bakao napisał(-a):
Kod:
haslo=`echo $line | cut -f2 -d ":" | sed "s/'/\\\'/"`
Powinno zadziałać u Ciebie.
haslo=`echo $line | cut -f2 -d ":" | sed "s/\x27/\\\'/"
Offline
Niestety nie zastępuje. Zarówno jak przekieruję potok do pliku jak i na stdout.
Offline
Jak dam samo
echo "has'o" | sed "s/\x27/\\\'/"
to owszem, zwraca has\'o ale w skrypcie już nie
Offline
Którego interpretera powłoki masz zdefiniowanego w skrypcie?
#!/bin/sh
czy
#!/usr/bin/env bash
/bin/sh
sed "s/'/\\\'/"
/usr/bin/env bash
sed "s/x27/\\\'/"
Ostatnio edytowany przez samu (2020-11-16 13:01:28)
Offline
ZAuważyłem, że nie ważne, czy użyję x27 czy ' to zawsze prawidłoo mi ten ciag znakow znajdje ale zastepuje na ' a nie \'
Offline
echo -e "my'pas'\$sword"|sed "s/'/\\\'/g"
mi np to działa
Offline
Gotowe ;)
haslo=`echo $line | cut -f2 -d ":" | sed "s/'/\\\'/"`
Zamień na:
haslo=$(echo "$line" | cut -f2 -d ":" | sed "s/'/\\\'/g")
alternatywy zapis wzorca dla seda
haslo=$(echo "$line" | cut -f2 -d ":" | sed "s/\x27/\\\'/g")
Ostatnio edytowany przez samu (2020-11-19 11:24:56)
Offline
Niestety i to nie podziałało. Ja nie wiem, co mam z tym bashem... Póki co zastosowaqłem obejście w postaci tr -d "'" ale jak ktoś chciałby się przyjrzeć temu blizej to mogę udostępnić skrypt i dane źródłowe
Offline
U mnie na archu skrypt działa poprawnie z zapisem wyjścia komendy do zmiennej w sposób:
zmienna=$(...)
Nie działa poprawnie z zapisem:
zmienna=`...`
Możesz podrzucić skrypt do analizy problemu.
Edit post:
@bakao
Spróbuj z poniższymi zapisami. Może któryś u Ciebie zadziała.
sed 's/'\''/\\&/g' sed 's/\('"'"'\)/\\\1/g' sed 's/'"'"'/\\&/g' sed s/\'/\\\\\'/g sed s/\'/"\\\'"/
Ostatnio edytowany przez samu (2020-11-19 12:34:52)
Offline
#!/bin/bash while IFS= read -r line; do user=`echo $line | cut -f1 -d ":"` haslo=$(echo "$line" | cut -f2 -d ":" | sed "s/'/\\\'/g") echo "UPDATE IGNORE users SET pass = '$haslo' WHERE username = '$user';" done < $1
Przykładowa zawartośc pliku:
poltergeist:1^#CK:2f_c'MO<.p}hP"n\I4kt/_"p
Offline
przede wszystkim w haśle może być dwukropek, więc żeby nie rozcięło hasła powinno być:
cut -d ':' -f 2-
A z tą zmianą wszystko działa ok (dodałem spację do hasła):
$ cat shadow poltergeist:1^#CK:2f_c'MO <.p}hP"n\I4kt/_"p
$ cat skrypt #!/bin/bash while IFS= read -r line; do user=`echo $line | cut -f1 -d ":"` haslo_before="$(echo "$line" | cut -f2- -d ":" )" haslo_after="$(echo "$haslo_before" | sed "s/'/\\\'/g")" for k in "$haslo_before" "$haslo_after"; do echo "UPDATE IGNORE users SET pass = '$k' WHERE username = '$user';" done done < $1
$ ./skrypt shadow UPDATE IGNORE users SET pass = '1^#CK:2f_c'MO <.p}hP"n\I4kt/_"p' WHERE username = 'poltergeist'; UPDATE IGNORE users SET pass = '1^#CK:2f_c\'MO <.p}hP"n\I4kt/_"p' WHERE username = 'poltergeist';
Offline
Nareszcie zadziałało. Wielkie dzięki!
Offline