Andreas Ernst schrieb:
Hallo Thomas,
teste mal: 'Ich bin''s' mit 2x '
Hallo, sorry aber leider kann ich den eigentlichen String nicht mehr so leicht manipulieren! Er isr schon mit den Sonderzeichen in der Variable schon drin! gruss tomek
Thomas Lewandowski schrieb:
Andreas Ernst schrieb:
Hallo Thomas,
teste mal: 'Ich bin''s' mit 2x '
Hallo,
sorry aber leider kann ich den eigentlichen String nicht mehr so leicht manipulieren! Er isr schon mit den Sonderzeichen in der Variable schon drin!
gruss tomek
...dann wirst Du wahrscheinlich schlechte Karten haben, denn die Sonderzeichen solltest Du vorher ersetzen, sonst führen sie nachher zu Fehlern. Hast Du zugriff auf den String 'Ich bin es'? Grüße Andreas
Andreas Ernst schrieb:
...dann wirst Du wahrscheinlich schlechte Karten haben, denn die Sonderzeichen solltest Du vorher ersetzen, sonst führen sie nachher zu Fehlern.
Hast Du zugriff auf den String 'Ich bin es'?
Ja ich habe zu griff auf den String! Ich weiß aber nicht was für Sonderzeichen in dem String sind und eigentlich sollen die Sonderzeichen auch bleiben. Das Liegt einfach an der Bash und der Form von "inser into" .... aber da muss man doch was machen können! Damit ist deutlicher wird hier noch mal ein Ausschnitt aus meinem Skript: ################################################################################################# ABSENDER=`cat /root/Suse_Mails/msg.4Ge | grep -o 'From:[^^]*' | sed s/"<"// | sed s/">"// | sed s/From://` BETREFF=`cat /root/Suse_Mails/msg.4Ge | grep -o 'Subject:[^^]*' | sed s/Subject://` DATUM=`cat /root/Suse_Mails/msg.4Ge | grep -o 'Date:[^^]*' | sed s/Date://` INHALT=`grep "^$" -A 100 msg.4Ge` datenbank="use suse;" echo "$datenbank INSERT INTO mailliste VALUES ('','"$ABSENDER"','"$BETREFF"','"$DATUM"','"$INHALT"');" | mysql ################################################################################################# Kann man da was machen? gruss tomek
Thomas Lewandowski schrieb:
Andreas Ernst schrieb:
...dann wirst Du wahrscheinlich schlechte Karten haben, denn die Sonderzeichen solltest Du vorher ersetzen, sonst führen sie nachher zu Fehlern.
Hast Du zugriff auf den String 'Ich bin es'?
Ja ich habe zu griff auf den String! Ich weiß aber nicht was für Sonderzeichen in dem String sind und eigentlich sollen die Sonderzeichen auch bleiben.
Bleiben sie auch. Das ' - Zeichen ist die Begrenzung für Strings in SQL, ähnlich wie in Deinen Script das " - Zeichen. insert into mailliste values ('ich@dot.com', 'SQL', '2004-01-06', 'Ich bin es') Hier erkennt SQL den String 'Ich bin es' für das Feld inhalt. insert into mailliste values ('ich@dot.com', 'SQL', '2004-01-06', 'Ich bin's') Hier erkennt SQL den String 'Ich bin' für das Feld inhalt, somit bleibt
s'< übrig und das ist keiné SQL-Syntax, somit führt Dein insert-Befehl zu einem Fehler.
Das Liegt einfach an der Bash und der Form von "inser into" .... aber da muss man doch was machen können! Damit ist deutlicher wird hier noch mal ein Ausschnitt aus meinem Skript:
#################################################################################################
ABSENDER=`cat /root/Suse_Mails/msg.4Ge | grep -o 'From:[^^]*' | sed s/"<"// | sed s/">"// | sed s/From://` BETREFF=`cat /root/Suse_Mails/msg.4Ge | grep -o 'Subject:[^^]*' | sed s/Subject://` DATUM=`cat /root/Suse_Mails/msg.4Ge | grep -o 'Date:[^^]*' | sed s/Date://` INHALT=`grep "^$" -A 100 msg.4Ge`
Hier mußt Du $INHALT und $BETREFF" auf das Zeichen >'< durch >''< ersetzen.
datenbank="use suse;" echo "$datenbank INSERT INTO mailliste VALUES ('','"$ABSENDER"','"$BETREFF"','"$DATUM"','"$INHALT"');" | mysql #################################################################################################
Kann man da was machen?
gruss tomek
Gruß Andreas
Andreas Ernst schrieb:
Bleiben sie auch. Das ' - Zeichen ist die Begrenzung für Strings in SQL, ähnlich wie in Deinen Script das " - Zeichen.
insert into mailliste values ('ich@dot.com', 'SQL', '2004-01-06', 'Ich bin es')
Hier erkennt SQL den String 'Ich bin es' für das Feld inhalt.
insert into mailliste values ('ich@dot.com', 'SQL', '2004-01-06', 'Ich bin's')
Hier erkennt SQL den String 'Ich bin' für das Feld inhalt, somit bleibt >s'< übrig und das ist keiné SQL-Syntax, somit führt Dein insert-Befehl zu einem Fehler.
Hier mußt Du $INHALT und $BETREFF" auf das Zeichen >'< durch >''< ersetzen.
datenbank="use suse;" echo "$datenbank INSERT INTO mailliste VALUES ('','"$ABSENDER"','"$BETREFF"','"$DATUM"','"$INHALT"');" | mysql #################################################################################################
Hallo Andreas, leider klappt es auch nicht. Oder ich habe es nicht verstanden wie du das genau meinst! Könntest du mir mal einfach die echo Zeile schicken -> also wie du es meinst! Denn bei mir will es einfach nicht klappen! gruss tomek
Thomas Lewandowski schrieb:
Andreas Ernst schrieb:
Bleiben sie auch. Das ' - Zeichen ist die Begrenzung für Strings in SQL, ähnlich wie in Deinen Script das " - Zeichen.
insert into mailliste values ('ich@dot.com', 'SQL', '2004-01-06', 'Ich bin es')
Hier erkennt SQL den String 'Ich bin es' für das Feld inhalt.
insert into mailliste values ('ich@dot.com', 'SQL', '2004-01-06', 'Ich bin's')
Hier erkennt SQL den String 'Ich bin' für das Feld inhalt, somit bleibt >s'< übrig und das ist keiné SQL-Syntax, somit führt Dein insert-Befehl zu einem Fehler.
Hier mußt Du $INHALT und $BETREFF" auf das Zeichen >'< durch >''< ersetzen.
datenbank="use suse;" echo "$datenbank INSERT INTO mailliste VALUES ('','"$ABSENDER"','"$BETREFF"','"$DATUM"','"$INHALT"');" | mysql #################################################################################################
Hallo Andreas,
leider klappt es auch nicht. Oder ich habe es nicht verstanden wie du das genau meinst! Könntest du mir mal einfach die echo Zeile schicken -> also wie du es meinst! Denn bei mir will es einfach nicht klappen!
gruss tomek
Hallo Thomas, bin zwar kein Bash-Programmierer, aber das hier klappt bei mir. echo "Ich bin's, und draussen schneit's" | sed "s/'/''/g" Grüße Andreas
Andreas Ernst schrieb:
Thomas Lewandowski schrieb:
Andreas Ernst schrieb: [..]
insert into mailliste values ('ich@dot.com', 'SQL', '2004-01-06', 'Ich bin's')
Hier erkennt SQL den String 'Ich bin' für das Feld inhalt, somit bleibt >s'< übrig und das ist keiné SQL-Syntax, somit führt Dein insert-Befehl zu einem Fehler.
Hier mußt Du $INHALT und $BETREFF" auf das Zeichen >'< durch >''< ersetzen.
datenbank="use suse;" echo "$datenbank INSERT INTO mailliste VALUES ('','"$ABSENDER"','"$BETREFF"','"$DATUM"','"$INHALT"');" | mysql #################################################################################################
Hallo Andreas,
leider klappt es auch nicht. Oder ich habe es nicht verstanden wie du das genau meinst! Könntest du mir mal einfach die echo Zeile schicken -> also wie du es meinst! Denn bei mir will es einfach nicht klappen!
*g* Na klar, so gehts auch nicht. Tatsächlich mischt da die bash noch mit. echo 'ich bin's' = Fehler weil ein ' fehlt echo 'ich bin''s' ist dasselbe wie echo 'ich bins' echo 'ich bin'\''s' ich bin's oder echo -e "'ich bin\x27s'" 'ich bin's' oder echo -e 'ich bin\x27s' ich bin's So mag die bash das, ob mysql das dann auch mag weiss ich nicht. Ich vermute mal, am ehesten wird mysql das escapen mögen: 'ich bin\'s' echo "$datenbank INSERT INTO mailliste VALUES ('','"$ABSENDER"','"$BETREFF"','"$DATUM"','ich bin\'s');" | mysql oder vieleicht auch echo "$datenbank INSERT INTO mailliste VALUES ('','"$ABSENDER"','"$BETREFF"','"$DATUM"','ich bin\x27s');" -----8<----- datenbank="use suse;" DATUM='2005-01-05' ABSENDER='Me' BETREFF='Test' INHALT='ich bin\x27s' echo "$datenbank INSERT INTO mailliste VALUES ('','$ABSENDER','$BETREFF','$DATUM','$INHALT');" use suse; INSERT INTO mailliste VALUES ('','Me','Test','2005-01-05','ich bin\x27s'); INHALT="ich bin\'s" echo "$datenbank INSERT INTO mailliste VALUES ('','$ABSENDER','$BETREFF','$DATUM','$INHALT');" use suse; INSERT INTO mailliste VALUES ('','Me','Test','2005-01-05','ich bin\'s'); -----8<------ Wie Du siehst, habe ich die " um $ABSENDER etc weggelassen, die braucht's nicht.
Hallo Thomas,
bin zwar kein Bash-Programmierer, aber das hier klappt bei mir.
echo "Ich bin's, und draussen schneit's" | sed "s/'/''/g"
Ja, ich glaube aber, das nützt hier nix ;) echo "Ich bin's, und draussen schneit's" | sed "s/'/\\\'/g" Ich bin\'s, und draussen schneit\'s -- Gruss Bernd
Hallo Thomas, hallo Leute, Am Donnerstag, 6. Januar 2005 00:10 schrieb Thomas Lewandowski:
Andreas Ernst schrieb:
...dann wirst Du wahrscheinlich schlechte Karten haben, denn die Sonderzeichen solltest Du vorher ersetzen, sonst führen sie nachher zu Fehlern.
Hast Du zugriff auf den String 'Ich bin es'?
Ja ich habe zu griff auf den String! Ich weiß aber nicht was für Sonderzeichen in dem String sind und eigentlich sollen die Sonderzeichen auch bleiben.
Es können also auch "überraschend" andere Sonderzeichen auftreten? Dann hast Du kurz gesagt ein Sicherheitsproblem... Probier mal, was passiert, wenn als Subject reingelegt \'; DROP * FROM tabelle auftaucht. Achtung, könnte ins Auge gehen! Ich würde für sowas die Verwendung von Perl _dringend_ empfehlen. Vorteil: Du kannst über $dbh->prepare() die Abfrage mit Platzhaltern vorbereiten ("SELECT * FROM tabelle WHERE name=?"). Anschließend rufst Du $dbh->execute("Fritz Muster") auf - dabei wird das Fragezeichen in der Abfrage durch den Parameter ersetzt und sämtliche Sonderzeichen automatisch entschärft. Hört sich vielleicht umständlich an, aber Probleme mit Sonderzeichen aller Art kannst Du zu 100% ausschließen, wenn die Werte erst beim ->execute mit angegeben werden. Falls Du den Rest des Scripts weiterhin in der Bash erledigen willst, nutze wenigstens das folgende kleine Perl-Script. Das war gerade eine 10-Minuten-Entwicklung von mir und sollte MySQL-Befehle mit variabler Parameteranzahl ermöglichen. #!/usr/bin/perl -w use strict; use warnings; use DBI; use DBD::mysql; my $dbh; my $sth; my $mysqlquery = $ARGV[0]; shift @ARGV; $dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost", "username", "password" ) || die "Cannot connect to database"; $sth = $dbh->prepare($mysqlquery); $sth->execute(@ARGV); # Falls Du Daten (Ergebnis von SELECT) ausgeben willst, brauchst Du noch # etwas in der Art von while($row_hash = $sth->fetchrow_hashref) { print "$row_hash->{name}\n"; } # Das darfst Du aber selbst als Parameter verpacken oder als Schleife # einrichten (foreach $feld in $row_hash oder so ;-) Das speicherst Du als mysql-simple-perl ab und machst es ausführbar. Der Aufruf erfolgt dann mit mysql-simple-perl \ "INSERT INTO table (name,ort) values(?,?)" \ "Fritz Muster" \ "Testhausen" oder allgemein ausgedrückt mysql-simple-perl "MySQL-Query" [ Param1 [ Param2 [ Param3 [...] ] ] ] Und schon bist Du die Sicherheitsprobleme bei Sonderzeichen in den SQL-Werten los.
Das Liegt einfach an der Bash und der Form von "inser into" ....
In diesem Fall eher an der Bash - der INSERT-Befehl selbst ist OK ;-)
aber da muss man doch was machen können!
Diverse Lösungen mit sed hast Du ja schon gesehen. Trotzdem würde ich für sowas definitiv nicht die Bash verwenden.
ABSENDER=`cat /root/Suse_Mails/msg.4Ge | grep -o 'From:[^^]*' | sed s/"<"// | sed s/">"// | sed s/From://`
Darf ich Dir noch ein paar Awards hinterherwerfen? Da wären - der useless-use-of-cat-Award - der useless-use-of-grep-Award - sowie der useless-use-of-multiple-sed-Award ;-) Noch da? Dann guck mal, wie das besser geht: ABSENDER=`sed -n '/From:/ s/\(From:\|<\|>\)//p' /root/Suse_Mails/msg.4Ge` Das ersetzt das cat (sed kann selber lesen ;-)), das grep (siehe /From:/ [1]) sowie die drei sed-Befehle am Stück. Gruß Christian Boltz, keine Zufallssig! [1] Das [^^]* ist nutzlos, da * auch für null Vorkommen stehen kann. -- Zeichenverarbeitung in der Shell ist _evil_. Verwende eine P-Sprache (Perl, PHP, Python) für Dein Problem. Das ist _sehr_ viel effektiver. Deine Frage zeigt an, daß Du gerade das Programmieräquivalent zu einem Hammer für Schrauben verwendest. [Kristian Köhntopp in suse-linux]
Hallo Christian ... Christian Boltz schrieb:
Es können also auch "überraschend" andere Sonderzeichen auftreten? Dann hast Du kurz gesagt ein Sicherheitsproblem... Probier mal, was passiert, wenn als Subject reingelegt \'; DROP * FROM tabelle auftaucht. Achtung, könnte ins Auge gehen!
Ich würde für sowas die Verwendung von Perl _dringend_ empfehlen.
Ich habe da als erstes an PHP gedacht wusste aber leider nicht wie ich mit PHP die Email bearbeiten soll. Also wie ich den Betreff usw. raus filtern soll. Da fiel mir halt nur die bash ein. Aber du hast recht ... ich sollte es mal mit Perl Probieren. Kennst du da mal vielleicht paar Online Quellen wo ich mir paar Beispiele bezüglich Perl und myslq nachlesen kann.
Vorteil: Du kannst über $dbh->prepare() die Abfrage mit Platzhaltern vorbereiten ("SELECT * FROM tabelle WHERE name=?"). Anschließend rufst Du $dbh->execute("Fritz Muster") auf - dabei wird das Fragezeichen in der Abfrage durch den Parameter ersetzt und sämtliche Sonderzeichen automatisch entschärft.
Hört sich vielleicht umständlich an, aber Probleme mit Sonderzeichen aller Art kannst Du zu 100% ausschließen, wenn die Werte erst beim ->execute mit angegeben werden.
Falls Du den Rest des Scripts weiterhin in der Bash erledigen willst, nutze wenigstens das folgende kleine Perl-Script. Das war gerade eine 10-Minuten-Entwicklung von mir und sollte MySQL-Befehle mit variabler Parameteranzahl ermöglichen.
#!/usr/bin/perl -w use strict; use warnings; use DBI; use DBD::mysql;
my $dbh; my $sth;
my $mysqlquery = $ARGV[0]; shift @ARGV;
$dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost", "username", "password" ) || die "Cannot connect to database";
$sth = $dbh->prepare($mysqlquery);
$sth->execute(@ARGV);
# Falls Du Daten (Ergebnis von SELECT) ausgeben willst, brauchst Du noch # etwas in der Art von while($row_hash = $sth->fetchrow_hashref) { print "$row_hash->{name}\n"; } # Das darfst Du aber selbst als Parameter verpacken oder als Schleife # einrichten (foreach $feld in $row_hash oder so ;-)
Das speicherst Du als mysql-simple-perl ab und machst es ausführbar.
Der Aufruf erfolgt dann mit mysql-simple-perl \ "INSERT INTO table (name,ort) values(?,?)" \ "Fritz Muster" \ "Testhausen" oder allgemein ausgedrückt mysql-simple-perl "MySQL-Query" [ Param1 [ Param2 [ Param3 [...] ] ] ]
Und schon bist Du die Sicherheitsprobleme bei Sonderzeichen in den SQL-Werten los.
In diesem Fall eher an der Bash - der INSERT-Befehl selbst ist OK ;-)
Ja, der INSERT Befehl ist auch ok ... hast recht...
Diverse Lösungen mit sed hast Du ja schon gesehen. Trotzdem würde ich für sowas definitiv nicht die Bash verwenden.
So siehst aus!
ABSENDER=`cat /root/Suse_Mails/msg.4Ge | grep -o 'From:[^^]*' | sed s/"<"// | sed s/">"// | sed s/From://`
Darf ich Dir noch ein paar Awards hinterherwerfen? Da wären - der useless-use-of-cat-Award - der useless-use-of-grep-Award - sowie der useless-use-of-multiple-sed-Award ;-)
Darum bitte ich doch. :) Ich weiss selbst das es blödsinnig ist aber was soll ich machen wenn ich mich mit den anderen ausdrücken nicht auskenne. Was bleibt mir da übrig!
Noch da? Dann guck mal, wie das besser geht: ABSENDER=`sed -n '/From:/ s/\(From:\|<\|>\)//p' /root/Suse_Mails/msg.4Ge`
Das ersetzt das cat (sed kann selber lesen ;-)), das grep (siehe /From:/ [1]) sowie die drei sed-Befehle am Stück.
Das ist natürlich die bessere Lösung ... danke .. Da hätte ich da noch ein paar Fragen. Wie kann ich an Perl aus der Bash Variablen übergeben? Kennt da jemand paar Informative Links damit ich es nach lesen kann? gruss tomek
Am Freitag, 7. Januar 2005 17:12 schrieb Thomas Lewandowski:
Ich habe da als erstes an PHP gedacht wusste aber leider nicht wie ich mit PHP die Email bearbeiten soll.
evtl. hilft Dir das hier weiter: http://lists.suse.com/archive/suse-linux/2003-Jun/4799.html Gruss Andreas
Hallo Thomas, hallo Leute, Am Freitag, 7. Januar 2005 17:12 schrieb Thomas Lewandowski:
Christian Boltz schrieb:
Ich würde für sowas die Verwendung von Perl _dringend_ empfehlen.
Ich habe da als erstes an PHP gedacht wusste aber leider nicht wie ich mit PHP die Email bearbeiten soll.
PHP kann das auch, siehe beispielsweise folgende Mail:
From: Kristian Koehntopp
Da hätte ich da noch ein paar Fragen. Wie kann ich an Perl aus der Bash Variablen übergeben? Kennt da jemand paar Informative Links damit ich es nach lesen kann?
In diesem Fall: man perlvar und nach "env" suchen. Kurzfassung: - in der Bash export FOO=xy - im Perlscript print $ENV{'FOO'}; Alternativ kannst Du die Variablen als Parameter übergeben, dafür ist dann $ARGV[x] zuständig (x durch eine Zahl, beginnend mit 0, ersetzen). Siehe ebenfalls man perlvar ;-) Für längere Parameterlisten, insbesondere bei Verwendung von --optionen, ist übrigens die Verwendung von Getopt::Long ganz praktisch. Gruß Christian Boltz -- [ X-Mailer: Microsoft Outlook Express 6.00.2800.1106 ] Damit ist deinem Kmail der Preis für die gruseligste Halloween-Maske dieses Jahres sicher. [Andreas Koenecke zu Martin Mewes in suse-linux]
Hallo Christian... Erst mal Danke für den Tipp! Christian Boltz schrieb:
PHP kann das auch, siehe beispielsweise folgende Mail:
From: Kristian Koehntopp
Cc: suse-linux@lists.suse.com Subject: Re: suse ml-archiv durchsuchen Date: Fri, 27 Jun 2003 17:27:30 +0200 Message-ID: <20030627152730.GA1686@p15104972.pureserver.info> Ich bin gewohnt, PHP nur für Webseiten zu verwenden - das heißt aber nicht, dass es nicht von der Shell aus geht ;-)
[...] In diesem Fall: man perlvar und nach "env" suchen. Kurzfassung: - in der Bash export FOO=xy - im Perlscript print $ENV{'FOO'};
Mir ist aber aufgefallen das es "in der Bash export FOO=$xy" heißen muss oder besser gesagt so funktioniert es nur bei mir. Ist mir nur so eingefallen.
Alternativ kannst Du die Variablen als Parameter übergeben, dafür ist dann $ARGV[x] zuständig (x durch eine Zahl, beginnend mit 0, ersetzen). Siehe ebenfalls man perlvar ;-)
Für längere Parameterlisten, insbesondere bei Verwendung von --optionen, ist übrigens die Verwendung von Getopt::Long ganz praktisch.
Worum ich dich noch bitten würde, hast du mal paar Links bezüglich Perl und Mysql? gruss tomek
participants (5)
-
Andreas Ernst
-
Andreas Loesch
-
Christian Boltz
-
Illuminatus@t-online.de
-
Thomas Lewandowski