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/.
Zbanowany

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
Użytkownik
Zbanowany

To wtedy pozostaje problem, jak user używa " w haśle
Offline

Stały bywalec


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
Zbanowany

Niestety nie zastępuje. Zarówno jak przekieruję potok do pliku jak i na stdout.
Offline
Zbanowany

Jak dam samo
echo "has'o" | sed "s/\x27/\\\'/"
to owszem, zwraca has\'o ale w skrypcie już nie
Offline

Stały bywalec


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
Zbanowany

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

Użytkownik


echo -e "my'pas'\$sword"|sed "s/'/\\\'/g"
mi np to działa
Offline

Stały bywalec


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
Zbanowany

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

Stały bywalec


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
Zbanowany

#!/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 < $1Przykładowa zawartośc pliku:
poltergeist:1^#CK:2f_c'MO<.p}hP"n\I4kt/_"p
Offline

Użytkownik


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
Zbanowany

Nareszcie zadziałało. Wielkie dzięki!
Offline