Dienste Remote per Mail Steuern

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Dienste Remote per Mail Steuern

Beitrag von Landixus » 05.08.2010 13:37:11

Hallo,
ich würde gerne ein paar Dienste remote steuern und
zwar in dem ich eine Mail an den Server sende.

Zum Beispiel würde ich gerne den Indianer mal anhalten.
also "/etc/init.d/apache2 stop"

Ich dachte das lässt sich dann über den Betreff lösen:
zum Beispiel mail an "verwaltung@domain.de" mit dem
Betreff: "stop apache2".
Der Oberhammer wäre wenn der Server zurückmailt
"Apache2 erfolgreich angehalten"

Natürlich soll der Server nur Befehle von einer e-mail adresse
annehmen die er kennt.

Weiss jemand wie ich das lösen kann?
Oder gibs da schon was fertiges? :)
Auf eine Oberfläche wie plesk / webmin etc, wollte ich verzichten.

Grüße
Andreas

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Dienste Remote per Mail Steuern

Beitrag von gbotti » 05.08.2010 13:50:42

Hallo.

Ich geh mal davon aus, dass die Mails von einem POP3-Server abgeholt werden.
Meine Idee:
1. Lass Dir die Mails lokal als Datei in einen Ordner speichern. Die Dateien sind dann als Texte hinterlegt, die man ziemlich einfach mit Linux-Bordmitteln auswerten kann.
2. Mit einem 2. Script lässt du diese Dateien nacheinander mit einem unpriviligierten Benutzer abarbeiten und per vordefinierten sudo-Befehlen die Kommandos ausführen.
Die Mail verschiebe dann in einen Archiv-Ordner, da du sonst nicht mehr nachvollziehen kannst, wann welche Befehle abgesetzt wurden.
3. Aus Script 2 kannst Du (Beispielsweise auch wieder mit Perl) eine Mail versenden.

Da ich gern in Perl scripte hab ich da auch schon mal etwas gesehen.
Beispiel zum Mail empfangen und senden mit Perl: http://rolfrost.de/mail.html

Gruß
Georg
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Re: Dienste Remote per Mail Steuern

Beitrag von Landixus » 05.08.2010 14:04:18

Erstmal danke für die Antwort.

Ich benutze IMAP, also die Mails liegen immer auf dem Server.

Leider bin ich im Scripten nicht so gut, das ich das blind lösen könnte.
Ich werde mal weiter suchen ob ich noch was finde.

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Dienste Remote per Mail Steuern

Beitrag von gbotti » 05.08.2010 14:46:08

Hi.

Dieses Script liest die ungelesenen Mails von einem IMAP-Konto und führt in einer IF-Abfrage erst mal ein "print" aus (QUELLE Net::IMAP::Simple-Dokumentation):

Code: Alles auswählen

#!/usr/bin/perl
use strict;
use warnings;
use Net::IMAP::Simple;
use Email::Simple;

# Create the object
my $imap = Net::IMAP::Simple->new('SERVERIP_ODER_DNSNAME') ||
die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";

# Log on
if(!$imap->login('BENUTZER','KENNWORT')){
print STDERR "Login failed: " . $imap->errstr . "\n";
exit(64);
}

# Print the subject's of all the messages in the INBOX
my $nm = $imap->select('INBOX');

for(my $i = 1; $i <= $nm; $i++){
# Zeige alle Mails an, die nicht gelesen sind
  if( ! $imap->seen($i)){
     my $es = Email::Simple->new(join '', @{ $imap->top($i) } );
     printf("[%03d] %s\n", $i, $es->header('Subject'));
# Fuehre etwas aus, wenn im Subject "EINBEFEHL" steht
     if ($es->header('Subject') eq "EINBEFEHL"){
          print "Ein Befehl\n";
     $es->header('Subject')
   }
}
# Mail als gelesen markieren
$imap->see($i);
}
$imap->quit;
Informationen zu "Net::IMAP::Simple" findest Du hier: http://search.cpan.org/~jettero/Net-IMA ... Simple.pod

Versenden wirst Du vermutlich über SMTP. Das kannst du da auch mit einbauen. Stichwort "Net::SMTP" und falls nötig "Net::SMTP::auth".

Gruß
Georg
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Re: Dienste Remote per Mail Steuern

Beitrag von Landixus » 05.08.2010 14:58:50

Danke, da probier ich mal mit rum.

uname
Beiträge: 12474
Registriert: 03.06.2008 09:33:02

Re: Dienste Remote per Mail Steuern

Beitrag von uname » 05.08.2010 16:17:52

Naja. Etwas umständlich. Mails liegen bei mir in /var/mail/username.

Wie wäre es so. Der Befehl steht dann im Subjekt der E-Mail. Hoffentlich macht der E-Mail-Client die Kodierung nicht im Subject kaputt. Auch darf der Befehl keinen Doppelpunkt enthalten.

mail.pl

Code: Alles auswählen

#!/usr/bin/perl
$maildatei = "/var/mail/username";
open (FILE,"$maildatei");
foreach $line (<FILE>)
{ 
  if ($line =~ /^Subject:/)
  {
    ($muell,$subject) = split (":", $line);
    system($subject);
  }
} 
close (FILE);

open (FILE,">$maildatei") || die "Can't Open $maildatei: $!\n";
print FILE "";
close (FILE);
Script in CRON einbauen und fertig. Entweder direkt als "root" oder per "sudo" dem Benutzer "username" das Starten, Stoppen usw. erlauben. Sicherer wäre die zweite Lösung, da eine E-Mail mit Subjekt "rm -rf /" vielleicht zu Problemen führen würde ;-)

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Dienste Remote per Mail Steuern

Beitrag von mistersixt » 05.08.2010 16:32:30

Ich habe mal was Ähnliches gemacht: Ich habe eine Datei .forward im $HOME eines speziellen Users angelegt mit diesem Inhalt...

Code: Alles auswählen

"|/home/user/scripts/filter.pl"
...so dass EMails an dieses Perl-Script übergeben werden anstatt sie direkt ins Postfach zu stecken. In diesem Perl-Script werte ich die Absender-Adresse aus. Bei einer bestimmten Adresse speichere ich die EMail als Datei ab, ansonsten hänge ich sie an das normale Postfach hintendran. Ich habe das Script etwas anonymisiert, musst Du halt selbst etwas adjustieren, soll nur als Grundlage dienen.

Code: Alles auswählen

#!/usr/bin/env perl
# mistersixt
#

$LOCK_EX=2;
$LOCK_UN=8;
$mail_folder="/var/mail/einuser";
$file_mail_folder_path="/space/einuser/emails";

sub append_to_mail_folder{
        open (MAILFILE, ">>$mail_folder") || die "Could not create $mail_folder: $!\n";
        flock (MAILFILE, $LOCK_EX);                     # lock file
        for ($i=0; $i<$loop; $i++){
                print MAILFILE "$mail{$i}";
        }
        print MAILFILE "\n";
        flock (MAILFILE, $LOCK_UN);                     # unlock file
        close (MAILFILE);
}

sub append_to_file_folder{
        $date=`date +%H%M%S`;
        $file_mail_folder="$file_mail_folder_path/email_id_$$";
        open (MYFILE, ">>$file_mail_folder") || die "Could not create $file_mail_folder: $!\n";
        flock (MYFILE, $LOCK_EX);                      # lock file
        for ($i=0; $i<$loop; $i++){
                print MYFILE "$mail{$i}";
        }
        print MAILFILE "\n";
        flock (MYFILE, $LOCK_UN);                      # unlock file
        close (MXFILE);
        chmod 0660, $file_mail_folder;
}


$loop=0;
$match=0;
while (<>){
        $mail{$loop}=$_;
        if ($_ =~/^From:.*absender\@einedomain/){
                $match=1;
        }
        $loop++;
}

#
# Ok, now check, what to do with the email ...
#
if ($match=="1"){
        &append_to_file_folder;
}


if ($match=="0"){
        &append_to_mail_folder;
}
Ach ja, dem sendmail musste ich noch sagen, dass das Scipt als MTA arbeiten darf (Symlink in /etc/mail/smrsh/ auf das Perlscript machen).

Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Dienste Remote per Mail Steuern

Beitrag von gbotti » 05.08.2010 16:33:34

Hi.
uname hat geschrieben:Naja. Etwas umständlich. Mails liegen bei mir in /var/mail/username.
Die Mails können dort liegen. Ich setze Beispielsweise den Cyrus-IMAP ein, der die Mails in eine eigene Ordnerstruktur schiebt. /var/mail/ bleibt dann leer.

Mein Hintergedanke war, dass man mit der IMAP-Lösung die Mails gleich als gesehen markiert, damit der Befehl nicht mehrfach verarbeitet wird. Man erspart sich weitere Prüfungen.
Wenn man das ein wenig weiterbastelt könnte man die Mails auch in einen anderen Ordner schieben.

Auf einem Server, auf dem die Mails abgeholt werden können bzw. liegen könnte das alles aber auch über ein eingebautes Script im MTA (Postfix, Exim, Sendmail) eingebaut werden wie die Zusatzprodukte Sieve oder Spamassassin ;) aber das wär wirklich übertrieben...

Gruß
Georg
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Re: Dienste Remote per Mail Steuern

Beitrag von Landixus » 05.08.2010 16:34:28

Probier ich auch mal aus, danke für die Hilfe.

Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Re: Dienste Remote per Mail Steuern

Beitrag von Landixus » 06.08.2010 18:57:05

hmm...
ich hänge an folgenden Fehlern:

Code: Alles auswählen

landix2:/home/verwaltungsmod# ./filter.pl
./filter.pl: line 5: =2: command not found
./filter.pl: line 6: =8: command not found
./filter.pl: line 7: =/var/opt/vmail/verwaltungsmod/aotten.de/Maildir/new: Datei oder Verzeichnis nicht gefunden
./filter.pl: line 8: =/var/opt/vmail/verwaltungsmod/aotten.de/Maildir/new: Datei oder Verzeichnis nicht gefunden
./filter.pl: line 10: sub: command not found
./filter.pl: line 11: syntax error near unexpected token `MAILFILE,'
./filter.pl: line 11: `            open (MAILFILE, ">>$mail_folder") || die "Could not create $mail_folder: $!\n";'
landix2:/home/verwaltungsmod# ./test2.pl
Can't Open /var/opt/vmail/aotten.de/verwaltungsmod/Maildir/new: Ist ein Verzeichnis
landix2:/home/verwaltungsmod#
Verzeichnissen sind vorhanden und der Pfad stimmt auch, irgendwelche Tipps?

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Dienste Remote per Mail Steuern

Beitrag von mistersixt » 07.08.2010 15:21:17

Poste doch mal Dein Script, dann kann man mehr sehen.

Gruss, mistersixt.

PS: Solltest Du mein filter.pl als Grundlage genutzt haben, dann musst Du eine EMail durch dieses Script pipen, also als Beispiel "cat /tmp/eine-email-im-raw-format.txt | /pfaf/zum/filter.pl". So macht es dann auch der Mailserver.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Re: Dienste Remote per Mail Steuern

Beitrag von Landixus » 07.08.2010 15:24:51

Genau das hier:
ich hab jedeiglich die Pfade angepasst.

Code: Alles auswählen

#!/usr/bin/env perl
# mistersixt
#

$LOCK_EX=2;
$LOCK_UN=8;
$mail_folder="/var/mail/einuser";
$file_mail_folder_path="/space/einuser/emails";

sub append_to_mail_folder{
        open (MAILFILE, ">>$mail_folder") || die "Could not create $mail_folder: $!\n";
        flock (MAILFILE, $LOCK_EX);                     # lock file
        for ($i=0; $i<$loop; $i++){
                print MAILFILE "$mail{$i}";
        }
        print MAILFILE "\n";
        flock (MAILFILE, $LOCK_UN);                     # unlock file
        close (MAILFILE);
}

sub append_to_file_folder{
        $date=`date +%H%M%S`;
        $file_mail_folder="$file_mail_folder_path/email_id_$$";
        open (MYFILE, ">>$file_mail_folder") || die "Could not create $file_mail_folder: $!\n";
        flock (MYFILE, $LOCK_EX);                      # lock file
        for ($i=0; $i<$loop; $i++){
                print MYFILE "$mail{$i}";
        }
        print MAILFILE "\n";
        flock (MYFILE, $LOCK_UN);                      # unlock file
        close (MXFILE);
        chmod 0660, $file_mail_folder;
}


$loop=0;
$match=0;
while (<>){
        $mail{$loop}=$_;
        if ($_ =~/^From:.*absender\@einedomain/){
                $match=1;
        }
        $loop++;
}

#
# Ok, now check, what to do with the email ...
#
if ($match=="1"){
        &append_to_file_folder;
}


if ($match=="0"){
        &append_to_mail_folder;
}

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Dienste Remote per Mail Steuern

Beitrag von mistersixt » 09.08.2010 11:11:13

Jetzt hast Du mein Script 1-zu-1 nochmal gepostet. Ist das ein Debian-System, auf dem Du das laufen lassen willst? Trag vielleicht mal in der ersten Zeile...

Code: Alles auswählen

#!/usr/bin/perl
...ein, bzw. halt den Pfad zum perl-Interpreter.

Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Re: Dienste Remote per Mail Steuern

Beitrag von Landixus » 09.08.2010 11:39:33

Ja, ist ein Debian Lenny.
Ich probiers nachher nochmal aus, danke für den Hinweis.

Ich muss, glaub ich mal ein, bisschen mehr mit perl machen, momentan
bin ich da komplett talentfrei. :)

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Dienste Remote per Mail Steuern

Beitrag von roli » 09.08.2010 13:42:35

uname hat geschrieben:Script in CRON einbauen und fertig.
Anstelle von Cron koenntest du sicherlich auch inotify verwenden.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Landixus
Beiträge: 12
Registriert: 05.08.2010 13:29:07

Re: Dienste Remote per Mail Steuern

Beitrag von Landixus » 10.08.2010 07:29:31

So, das script hängt auf der Kommandozeile, komme so leider nicht weiter.

Ich habe mir jetzt monit installiert, mit einer .htaccess davor.
Ich denke das langt mir aus, trotzdem danke für eure Hilfe!

Antworten