Jump to content

Remote Server für Linux


Puhvogel

Empfohlene Beiträge

mahlzeit!

Das Ausführen von Programmen auf einem Hostrechner funzt mit netcat sehr gut.

Ich bin zwar nicht paranoid, aber Shell-Zugriff für alle, dass muss doch nicht sein.

Außerdem ist nicht in jedem Image netcat über die busybox implementiert...

Daher habe ich ein ein wenig mit perl gespielt und das ist dabei rausgekommen:

 

#!/usr/bin/perl -w

###############################################################
# Sicherer (relativ) Remote-Server fuer Linux oder Cygwin zur # 
# DBOX2-ausgeloesten Ausfuehrung von Programmen auf dem Host. #
# Benoetigt Perl auf dem Host.                                #
#                                                             #
# Aufruf auf Host:                                            #
# rserver.pl [-d]  (-d = Start im Hintergrund mit Logfile)    #
#                                                             #
# Aufruf auf DBOX2:                                           #
# wget --header _:cmd(x) http://hostip:port                   #
#                                                             #
# Achtung!!                                                   #
# Sicherheitsfunktionen nur aktiv bei Aufruf im Hintergrund.  #
#                                                             #
# Die Fehlermeldung 403 ist in Ordnung, der rserver "gaukelt" #
# wget nur vor er sei ein http-Server. Die Kommandos werden   #
# ueber die --header funktion von wget uebertragen...         #
#                                                             #
# Vorsicht, wenn $CHROOT_DIR nicht / ist, muessen alle cmd(x) #
# VOLLSTAENDIG nach $CHROOT_DIR bzw unterhalb kopiert werden. #
#                                                             #
# Nur auf dem Host vordefinierte cmd(x) koennen ausgefuehrt   #
# werden. Wer eine allg. Shell braucht sollte bei netcat      #
# bleiben. (Sicherheit ist meistens unkomfortabel...)         #
#                                                             #
# Teile vom Programm sind aus der CT 5/2004 S.206             #
# Wer sich mit rserver.pl was zerschiesst ist selber schuld!  #
#                                                             #
# cu im Keywelt Board                                         #
# Puhvogel aka DarkVolli                                      #
###############################################################

use warnings;
use strict;

use IO::Socket;
use Net::hostent;

my $cmd1 ="ls -l";
my $cmd2 ="cmd2.sh";
my $cmd3 ="/usr/local/bin/shutdown.sh";
my $cmd4 ="/cygdrive/c/programme/videolan/vlc/vlc.exe -I http >> /var/log/vlc_http.log 2>&1 &";
my $cmd5 ="killall vlc";

my $PORT = 9000;

my $LOGFILE     = "/var/log/rserver.log";
my $CHROOT_DIR  = "/";
my $RUNAS_USER  = "nobody";
my $RUNAS_GROUP = "nogroup";

if ($ARGV[0]){
   if ( $ARGV[0] =~ "-d" ){
    print "[rserver is running daemonized...]\n";
       my $ppid = fork;
       exit if $ppid;
       die "ERROR: can't start daemon" unless defined $ppid;

       open LOG, ">$LOGFILE" or die "ERROR: can't create logfile";
       open STDERR, ">>&LOG";
       open STDOUT, ">>&LOG";
       select LOG;
       $| = 1;
   }
}

my $server = IO::Socket::INET->new( Proto     => 'tcp',
                                   LocalPort => $PORT,
                                   Listen    => SOMAXCONN,
                                   Reuse     => 1);
die "ERROR: can't start rserver" unless $server;

print "[rserver is running...]\n";

if ($ARGV[0]){
   if ( $ARGV[0] =~ "-d" ){
       my $uid = getpwnam($RUNAS_USER);
       my $gid = getgrnam($RUNAS_GROUP);
       
       mkdir $CHROOT_DIR unless -e $CHROOT_DIR;
       warn "chroot: $!\n" unless -d $CHROOT_DIR and chroot $CHROOT_DIR;
           
       $) = "$gid $gid" if $gid;
       $> = $uid if $uid;
   }
}

while (my $client = $server->accept()) {
  $client->autoflush(1);
  print $client "HTTP/1.0 403 Forbidden\r\n\r\n";
  my $hostinfo = gethostbyaddr($client->peeraddr);
  printf "[Connect from %s]\n", $hostinfo ? $hostinfo->name : $client->peerhost;
  
  while ( <$client>) {
      next unless /\S/;
      if    (/_:cmd1/i)    { system ($cmd1); }
      elsif (/_:cmd2/i)    { system ($cmd2); }
      elsif (/_:cmd3/i)    { system ($cmd3); }
      elsif (/_:cmd4/i)    { system ($cmd4); }
      elsif (/_:cmd5/i)    { system ($cmd5); }
  }
   
  close $client;
}

Läuft auf meinem Fedora Core 4 sehr gut, habe auch unter Windoof XP mit Cygwin getestet.

Wer Lust hat, kann ja mal ausprobieren.

 

cu

Puhvogel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jepp endlich mal ein perl gleichgesinnter. Ich habe zwar bisher keine Probs mit netcat gehabt, da man daß auf der Dream mit ner neuen busybox einbinden kann, aber bei Bedarf werde ich zurückgreifen.

Nebenbei hantiere ich schon 1 Jahr mit Perl rum. Habe zum Beispiel in letzter Zeit viel mit perl::Tk Anwendungen zu tun gehabt. Kleines GUI Programm zur Unterstützung meiner Diplomarbeit (noch etwas buggy) um ein Beispiel zu nennen.

 

Einen Cardsharing Clienten für meinen Humax5400 habe ich auch in perl geschrieben. Der Humax leitet die CW Anfragen über die serielle an den PC. Dort kommt mein Client zum Einsatz. Er formatiert die Anfragen ins cardservertaugliche Format und leitete die Anfragen übers Ethernet weiter. Umgedreht werden in gleicher Weise die Antworten zurückgesendet. Somit wird PW auch helle trotzt Karte im Linuxserver.

Dabei sei aber zu beachten, daß ich versucht habe, daß alles mit Standard Modulen zu programmieren. Also nix mit Device::SerialPort (serielle Schnittstelle) oder anderen Modulen aus der CPAN Factory. Ausnahme ist Time::Out. Es bietet die einfache Möglichkeit Time Outs zu setzten die auch Angaben in ms zulassen.

Momentan versuche ich Perl für meine Dreambox zusammenzubasteln. Wenn du auch ne Dream hast, umso besser. Ich habe es zumindest gerade geschafft mir einen Compiler (gcc, binutils, full-glibc) zu kreieren, der, ich betone auf der Dreambox läuft. Das ist Vorraussetzung zum compilieren der perl Sourcen.

 

Ui doch länger geworden als vermutet. :lol:

 

Gruss :lol:

Link zu diesem Kommentar
Auf anderen Seiten teilen

@krallekit

Jau, für schnelle Resultate ist Perl einfach unschlagbar. Leider habe ich "nur" eine DBOX, ich denke die wäre mit Perl-Binaries speicherplatz- und hardwaremäßig etwas überfordert... da bleibt nur das gute alte C über.

Mit Perl oder Tcl/Tk kann man schnell ansehnliche Resultate erzielen und es läuft unter Linux und Windoof. Perl::Tk habe ich allerdings noch nicht ausprobiert. :lol:

 

cu

Puhvogel

Link zu diesem Kommentar
Auf anderen Seiten teilen

@krallekit

Jau, für schnelle Resultate ist Perl einfach unschlagbar. Leider habe ich "nur" eine DBOX, ich denke die wäre mit Perl-Binaries speicherplatz- und hardwaremäßig etwas überfordert... da bleibt nur das gute alte C über.

Mit Perl oder Tcl/Tk kann man schnell ansehnliche Resultate erzielen und es läuft unter Linux und Windoof. Perl::Tk habe ich allerdings noch nicht ausprobiert. wink.gif

 

Vollzustimm.

 

Jepp ich sehe Perl auch als eine Bereicherung und verstehe als als Mittelweg zwischen der Shell und C. Zumal Perl in meinen Augen die beste Skriptsprache ist und das macht sie ja auch so interessant. Speziell und vielfältig und daß alles ebend nur auf einem kleinens Stück Textdatei. Nachteilig ist natürlich der endlose Ratenschwanz der Module und Binarys, der für Perl benötigt werden. Da wirst du auf deiner DBox keine Chance haben. Machbar wäre das Erstellen von Executables aus den Perlskripten (PAR, Perl2exe), was wiederum eine Lösung für deine DBox wäre. Wenn ich perl auf meiner Dream zum laufen bekomme sage ich bescheid. Die dort erzeugten binarys aus Perlskripten sollten auch auf der Dbox laufen.

Das alles ist auch ein Grund, warum ich nun anfange mich mit C intensiver zu beschäftigen. Hatte ich ja ne Weile zu meinen Unizeiten, deshalb sollte mir der Einstieg nicht schwer fallen, zumal auch hier vieles Ähnlichkeiten zu Perl aufweist.

 

Gruss :lol:

Link zu diesem Kommentar
Auf anderen Seiten teilen

@krallekit

sag bitte Bescheid wenn bei Dir Perl auf der Dream läuft, interessiert mich natürlich :lol:. Wenn Du Perl kannst hast, lernst Du auch einfach C. Ich hatte im Studium noch Fortran, dass kann ich heute irgendwie nicht mehr brauchen...

 

cu

Puhvogel

bearbeitet von Puhvogel
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Wer ist Online   0 Benutzer

    • Keine registrierten Benutzer online.
×
×
  • Neu erstellen...