1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#!/usr/bin/perl use strict; use CGI; use IO::Socket::INET; # CONFIG OPTIONS: my $irc_server="irc.somewhere.net"; my $server_port="6667"; my $nick=sprintf("MSG-%05d",rand(100000)); my $channel="chat"; my $s=IO::Socket::INET->new( PeerAddr=>$irc_server, PeerPort=>$server_port, Timeout=>1); my $q = new CGI; my $text = $q->param('Text'); # connected to server ($s)?(print ""):(print $q->redirect('https://example.net/test/err.html') and exit); # sending nickname $s->print("user $nick B C D\r\n"); $s->print("nick $nick\r\n"); # join to channel $s->print("JOIN #$channel\r\n"); # submit message $s->print("PRIVMSG #$channel :$text\r\n"); # quit from channel $s->print("QUIT\n"); die (print $q->redirect('https://example.net/test/err.html')) unless $s; while (<$s>) { chomp; # response to server if send us PING request $s->print("PONG :$1\r\n") && print STDERR "pong $1...\n" if /^PING :(.*?)/; } # disconnect from server $s->print("DISCONNECT\r\n"); ($s->close)?(print $q->redirect('https://example.net/test/ok.html')):(print $q->redirect('https://example.net/test/err.html'));
2021-08-03T16:48:29 MiLeREDEDas ist sicherlich wahr, weil sich auch bei freenode.net einiges geändert hat.
2021-08-03T16:48:29 MiLeREDELokal weiß ich nicht, wie ich den Parameter setzen soll. Ist das so richtig?
2021-08-03T15:20:36 MiLeREDE"Most of the time when this error appears, the PHP script is failing to process data and returning an empty result instead. This empty output from PHP due to an error that was encountered results in the "error reading data from FastCGI server" followed by "End of script ...".
2021-08-03T16:50:53 MiLeREDEQUERY_STRING="m=2&n=4" ./mult.cgi
So geht's!
2021-08-04T07:30:05 MiLeREDEWie interpretiere ich denn jetzt die Ausgabe des Scriptes? Auf dem IRC-Server habe ich das Posting nicht gesehen.
2021-08-04T08:11:48 biancaUnd du bist ganz sicher, dass es hier um FastCGI geht und nicht um Standard CGI? Gibt es in Plesk auf deinem Server eine Konfiguration für FastCGI? Könntest du davon was zeigen?
Hast du den Hoster schon gefragt?
2021-08-04T08:11:48 biancaAber du fragst das Feld "Text" im Script ab, nicht m und nicht n. Was genau "geht" denn hiermit?
2021-08-04T08:11:48 bianca
- Funktioniert das Script in deiner Testumgebung nur per Kommandozeile oder auch mit Webserver?
- Läuft dort CGI oder FastCGI?
- Sind die Zugangsdaten zum Server und zum Kanal korrekt?
- Geht das alles ohne Passwort oder sehe ich das nur nicht?
2021-08-04T09:19:04 MiLeREDEHalt, Stopp! Nur nicht verwirren lassen.
2021-08-04T09:19:04 MiLeREDEDas weiß ich nicht! Ich sehe im Plesk folgendes
CGI-Unterstützung An
Perl-Unterstützung Aus
FastCGI-Unterstützung An
2021-08-04T09:19:04 MiLeREDEWas mich schon etwas verwundert. Geht denn überhaupt beides?
2021-08-04T09:19:04 MiLeREDEDas ist nur copy & paste von der Stelle, die ich gefunden habe, um meine eigene Frage
"Lokal weiß ich nicht, wie ich den Parameter setzen soll. Ist das so richtig?"
zu beantworten.
2021-08-04T09:19:04 MiLeREDEIch denke mal, das lokal nur die CGI.pm installiert ist.
2021-08-04T09:39:53 biancaWenn auf dem Hosting nicht noch was anderes läuft was wir kaputt machen könnten schalte mal FastCGI aus und Perl ein.
2021-08-04T09:39:53 biancaAber was genau geht denn mit diesem Aufruf? Meinst du damit, dass nur keine Fehlermeldung mehr kommt?
2021-08-04T09:39:53 biancaWarum denkst du das nur und weißt es nicht? Über die Testumgebung solltest du die Hoheit und Klarheit haben sonst ist es als solche nicht tauglich. Ich nehme mal an, du kommst da im Moment nur nicht drauf weil du nicht dort bist.
Lass dir Zeit mit der Antwort. Wir sind nicht auf der Flucht.
2021-08-04T12:16:21 hajImmer mal langsam... da geht ein bisschen was durcheinander.
2021-08-04T12:16:21 haj[*] Du benutzt [mod]CGI[/mod], und Plesk sagt [c]CGI-Unterstützung An[/c].
- FastCGI spielt in Deinem Programm keine Rolle.
- "Perl-Unterstützung" ist beim Apache Webserver ein mit einkompiliertes Perl, mit dem man dann mod_perl benutzen kann.
2021-08-04T12:16:21 hajIn Deinem Programm leitest Du an drei verschiedenen Stellen auf die Fehlerseite weiter.
2021-08-04T12:16:21 hajDein Skript feuert dann einen Sack von Kommandos an den IRC-Server ab, ohne zwischendrin auch mal die Antworten einzusammeln. Vielleicht teilt Dir der Server etwas mit, was eine konkrete Antwort erfordert.
2021-08-04T12:16:21 hajMöglicherweise hast Du auch mit einem Antispam-Programm des IRC-Servers zu tun.
2021-08-04T13:26:56 MiLeREDEMein Fehler! Ich hatte halluziniert, dass das Skript auf die Fehlerseite weiterleitet.2021-08-04T12:16:21 hajIn Deinem Programm leitest Du an drei verschiedenen Stellen auf die Fehlerseite weiter.
DASCH'S DR FÄHLR!!! Mein Script leitet immer nur nach "ok.html" weiter und diese Weiterleitung gibt's nur an einer Stelle. Da ist es ja, was mich irre macht.
2021-08-04T13:26:56 MiLeREDEJa!Ich hoffe, dass das mein Vorgehen ausreichend erklärt.
2021-08-04T09:19:04 MiLeREDEWas heißt "geht". ;-)Ich sehe im Plesk folgendes
CGI-Unterstützung An
Perl-Unterstützung Aus
FastCGI-Unterstützung An
Was mich schon etwas verwundert. Geht denn überhaupt beides?
2021-08-04T08:11:48 biancaIch meine du müsstest noch ein paar Fehlerabfragen einbauen.
Mache doch schon mal hinter das my $s=IO::Socket::INET->new(...) ein or die "Can't bind : $IO::Socket::errstr\n"
1
2
3
4
my $s=IO::Socket::INET->new(
PeerAddr=>$irc_server,
PeerPort=>$server_port,
Timeout=>1) or die (print "Can't bind : $IO::Socket::errstr\r\n");
2021-08-05T06:17:23 MiLeREDEDas leitet ohne Meldung und ohne Eintrag im error_log auf ok.html weiter. Im IRC-Chat passiert nix.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/perl
use strict;
use CGI;
use IO::Socket::INET;
# CONFIG OPTIONS:
my $irc_server="irc.somewhere.net";
my $server_port="6667";
my $nick=sprintf("MSG-%05d",rand(100000));
my $channel="chat";
my $s=IO::Socket::INET->new(
PeerAddr=>$irc_server,
PeerPort=>$server_port,
Timeout=>1);
my $q = new CGI;
my $bitte = $q->param('Text');
# connected to server
die (print $q->redirect('https://example.net/test/err.html') and exit) unless $s;
# sending nickname
print $s "user ",$nick," B C D\r\n";
print $s "nick ",$nick,"\r\n";
while( my $buffer = <$s> )
{
if( $buffer =~ /^PING(.*)$/i )
{
# response to server if send us PING request
print $s "PONG ".$1."\r\n";
} elsif( $buffer =~ /^(.*?) 376 (.*) :(.*)/i )
{
## Received end of MOTD, join a channel and say hi.
print $s "JOIN #",$channel,"\r\n";
print $s "PRIVMSG #",$channel," :",$bitte,"\r\n";
print $s "QUIT\r\n";
($s->close)?(print $q->redirect('https://example.net/test/ok.html')):(print $q->redirect('https://example.net/test/err.html'));
exit;
}
}
my $s=IO::Socket::INET->new(...) or die "Can't bind : $IO::Socket::errstr\n";
my $s=IO::Socket::INET->new(...) or die (print $q->redirect('https://example.net/test/err.html') and exit);
1
2
3
4
5
6
7
8
my $s=IO::Socket::INET->new(...)
or do {
print STDERR "Error: Socket error!"; # Fehler Wird ins Serverlog geschrieben
print $q->redirect('https://example.net/test/err.html'); # erzeugt redirect
exit; # beendet das programm
};
2021-08-05T16:42:59 GwenDragonDas mit dem die verstehe ich immer noch nicht.
2021-08-05T15:24:42 MiLeREDEfreenode nimmt jetzt immer nur eine authentifizierte Anmeldung entgegen.
2021-08-06T07:15:27 biancaDann war dein Rückschluss mit der Passwortlosigkeit von irc.quakenet.org:6667 falsch. Man muss immer alles testen denn es können immer mehrere Fehler vorhanden sein!
Aber das passiert nicht nur dir.
1
2
3
4
if (! $s) {
$return_code_of_print = print $q->redirect('https://example.net/test/err.html');
die $return_code_of_print;
}
2021-08-06T12:31:57 GwenDragonCode: (dl )1
2
3
4if (! $s) {
$return_code_of_print = print $q->redirect('https://example.net/test/err.html');
die $return_code_of_print;
}
Ok, wenn man das so schreibt, zeigt das schon mein Genie: Es klappt und verwirrt die Experten. ;-)
2021-08-06T12:31:57 GwenDragonCode: (dl )1
2
3
4if (! $s) {
$return_code_of_print = print $q->redirect('https://example.net/test/err.html');
die $return_code_of_print;
}
1
2
3
4
5
6
# connected to server
if (! $s) {
print STDERR "Server does not reply!";
print $q->redirect('https://example.net/test/err.html');
exit;
}
2021-08-05T16:42:59 GwenDragonDas mit dem die verstehe ich immer noch nicht.
Ich nehme an du willst sowas:
Code: (dl )1
2
3
4
5
6
7
8my $s=IO::Socket::INET->new(...)
or do {
print STDERR "Error: Socket error!"; # Fehler Wird ins Serverlog geschrieben
print $q->redirect('https://example.net/test/err.html'); # erzeugt redirect
exit; # beendet das programm
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
... #my $q = new CGI; # veraltete Schreibweise my $q = CGI->new; my $s=IO::Socket::INET->new( PeerAddr=>$irc_server, PeerPort=>$server_port, Timeout=>1) or do { print STDERR "Error: Socket error!"; # Fehler Wird ins Serverlog geschrieben print $q->redirect('https://example.net/test/err.html'); # erzeugt redirect exit; # beendet das programm }; #my $q = new CGI; ...
QuoteDas bedeutet, dass dein Programm etwas an STDOUT geschrieben hat und davor kein HTTP-Content-Type-Header gesendet wurde.Im error_log sehe ich:
"[Tue Aug 03 13:35:19.881797 2021] [cgid:error] [pid 16751:tid 139821192283904] [client ...] End of script output before headers: submitirc.cgi"
2021-08-04T11:20:07 GwenDragonQuoteDas bedeutet, dass dein Programm etwas an STDOUT geschrieben hat und davor kein HTTP-Content-Type-Header gesendet wurde.
Das habe ich eigentlich penibel vermieden, könnte natürlich das 'print ""' in
($s)?(print ""):(print $q->redirect('https://example.net/test/err.html') and exit);
sein.
2021-08-04T11:20:07 GwenDragonQuoteZeile 37:
die (print $q->redirect('https://example.net/test/err.html')) unless $s;
Was soll das deiner Meinung nach machen? Den Erfolg des Redirect ausgeben und dann das Programm sterben lassen?
Kann sein, dass daher die Logmeldung kommt.
Das soll das Programm mit einer Fehlermeldung beenden, wenn auf "QUIT" nichts vom Socket zurück kommt. Da erwarte ich eine Reaktion des IRC-Servers.
QuoteJa, und da du vorher keinen HTTP-Content-Type-Header (siehe CGI Header) sendetest, kommt so eine Logmeldung zustande.Das soll das Programm mit einer Fehlermeldung beenden, wenn auf "QUIT" nichts vom Socket zurück kommt.
2021-08-04T13:47:37 GwenDragonQuoteJa, und da du vorher keinen HTTP-Content-Type-Header (siehe CGI Header) sendetest, kommt so eine Logmeldung zustande.
Das habe ich zuvor mit
print CGI::header();
oder
print("Content-Type: text/html");
versucht. Das führt aber zu anderen Effekten. Da wird mir z. B. nur noch mitgeteilt,
"Status: 302 Found Location: https://example.net/test/ok.html",
aber es erfolgt keine Weiterleitung mehr dahin.
perl -MCGI -e "print CGI::redirect(q(https://somewhere.else/))"
perl -MCGI -e "print CGI::header; print CGI::redirect(q(https://somewhere.else/))"
1
2
3
4
Content-Type: text/html; charset=ISO-8859-1
Status: 302 Found
Location: https://somewhere.else/
1
2
3
# connected to server
#($s)?(print ""):(print $q->redirect('https://example.net/test/err.html') and exit);
die (print $q->redirect('https://example.net/test/err.html') and exit) unless $s;