Gå til innhold

charset fra shellscript til MySQL


Anbefalte innlegg

Hei

 

Har problemer med charset når jeg setter inn i db fra shellscript. Har søkt en del på nettet, og finner mange svar når det skal gjøres fra php, men ikke fra shellscript.

 

Her er scriptet:

Kode

 

 

#!/bin/bash

SQL_HOST=localhost
SQL_USER=root
SQL_PASSWORD=1234
SQL_DATABASE=smsd
SQL_TABLE=sms_log


#Set some SQL parameters
if [ "$SQL_PASSWORD" != "" ]; then
SQL_ARGS="-p$SQL_PASSWORD";
else
SQL_ARGS="";
fi
SQL_ARGS="-h $SQL_HOST -u $SQL_USER $SQL_ARGS -D $SQL_DATABASE -s -e"
mysql $SQL_ARGS "SET NAMES utf8;"
#Insert a new entry into the SQL table

if [ "$1" = "FAILED" ] || [ "$1" = "SENT" ]; then
mysql $SQL_ARGS "insert into $SQL_TABLE (type,sent,sender,receiver,msgid,text) values (\"$1\",\"$DATE\",\"$FROM\",\"$TO\",\"$3\",\"$TEXTSQLS\");";
elif [ "$1" = "RECEIVED" ]; then
mysql $SQL_ARGS "insert into $SQL_TABLE (type,sent,received,sender,receiver,kodeord,text) values (\"RECEIVED\",\"$SENT\",\"$DATE\",\"$FROM\",\"$SUBJECT\",\"$KODEORD\",\"$TEXTSQLR\");";
elif [ "$1" = "REPORT" ]; then
#Extract more data from the status report file
DISCHARGE=`sed -e 1,/SMS\ STATUS/d < $2 | formail -zx Discharge_timestamp:`
MSGID=`sed -e 1,/SMS\ STATUS/d < $2 | formail -zx Message_id:`
STATUS=`sed -e 1,/SMS\ STATUS/d < $2 | formail -zx Status: | cut -f1 -d,`

if [ "$MSGID" != "" ]; then
ID=`mysql $SQL_ARGS "select id from $SQL_TABLE where receiver=\"$FROM\" and type=\"SENT\" and msgid=\"$MSGID\" order by id desc limit 1;"`
mysql $SQL_ARGS "update $SQL_TABLE set received=\"$DISCHARGE\",status=\"$STATUS\" where id=\"$ID\";"
fi

 

 

Når jeg legger manuellt inn i db, så kommer det inn med æ, ø og å. Men når det kommer inn via shellscriptet så fungerer ikke æ,ø og å.

 

post-376070-0-94565700-1426454476_thumb.png

 

Så vidt jeg har skjønt så må du sette charset pr connection i MySQL, men er usikker på hvordan dette kan gjøres fra scriptet. Noen ideer?

Endret av fjusk1
Lenke til kommentar
Videoannonse
Annonse

Dette er litt komplisert, siden det er så mange forskjellige steder charsets spiller inn, ikke bare koblingen mot mysql.

Hvilke charset er ting opprinnelig i?

MySQL-session har eget charset.

Data hentet fra MySQL-session har eget charset.

osv.

 

 

Det er også to store sikkerhetsutfordringer med å gjøre disse tingene på måten du skisserer. Passord til MySQL er i environment-variabel, som i mange tilfeller kan sees av andre brukere. På den måten kan de koble seg til databasen som brukeren, og gjøre ugang.

 

I tillegg er det risiko rundt SQL-injection. Hvis $SUBJECT settes til "); DROP TABLE sms_log;" f.eks, så kan det slå ganske uheldig ut.

 

 

Hadde jeg vært i dine sko, så ville jeg lagt selve SQL-delen inn i et annet script, i favorittspråket ditt (jeg ville brukt python, ruby og php burde fungere like fint), og så heller brukt det scriptet i shellscriptet, om du ønsker å kunne bruke det i shellscripts.

 

På den måten kan du få skikkelig input-validation, du kan skrive til databasen på en trygg måte, du trenger ikke passord i environment-variabel, og samtidig får du løsning rundt charsets gratis med på kjøpet.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...