Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

mollilinux

unregistriert

1

22.02.2010, 11:52

Schleifenskript für automatische Backups

Hallo

Ich hoffe dass mir hier jemand helfen kann. Ich kenne mich mit Perl nicht gut aus, bin aber am Entwerfen eines Programmes, welches auf Perl basieren muss. Es handelt sich darum, Protokolle alle 2min von meinem Server auf meinen Computer zu Hause kopieren via SSH. Die Struktur des Programms ist als PDF angehängt. Habe gegoogled nach HowTo's und Tutorials, komme aber nicht weiter beim schreiben der Schleifen.

Das Programm muss selbständig sein, d. h. es braucht eine automatische Passwortübergabe und eine automatische Bestätigung der SSH-Schlüssel. Das Programm muss eine Verbindung aufzubauen alle 5 Sekunden bis sie steht und danach ein automatisches Login durchführen das dann ermöglicht, die Protokolle alle 2min herunterzuladen. Da keine Datei überschrieben werden darf, muss ein neuer Dateiname vom Programm bestimmt werden.
Wird die Verbindung unterbrochen, muss das Programm automatisch die Verbindung wieder aufbauen alle 5s.

Momentan komme ich nicht weiter mit der Verbindungs-Schleife. Das Problem ist, dass ich nicht eine Endlosschleife habe, sondern eine Schleife die sich beendet wenn eine Verbindung zum Server steht.

Die Frage ist wie bringe ich so eine Schleife hin? Momentan habe ich eine Endlosschleife (for-Schleife).

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use Net::SSH::Perl;
use Net::SSH::Perl::Auth::Password;

# Benutzeridentifikation 
my $host = "192.168.1.101";
my $user = "USER";
my $password = "USERPASSWORD";
my $auth = Net::SSH::Perl::Auth->new('Password', $ssh);
 
# Verbindung herstellen, wenn fehlgeschlagen, dann alle 5s neu versuchen. 
for (;;) {
my $ssh = Net::SSH::Perl->new($host);
print $ssh;
my $auth = Net::SSH::Perl::Auth->new('Password', $ssh);
}

... dann weiter



Kann mir hier jemand helfen?

Vielen Dank.

Gruss mollilinux


EDIT: Dateianhang der alten Struktur entfernt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »mollilinux« (24.02.2010, 15:57)


2

22.02.2010, 12:14

<--- Keine große Ahnung von ssh

Tschuldige die Zwischenfrage, aber warum soll die Verbindung immer offen bleiben? Warum nicht alle 2 min verbinden, logs übertragen, trennen?

EDIT: Ist der Anhang ein bisschen anders als das, was du beschreibst?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Garrett« (22.02.2010, 12:20)


mollilinux

unregistriert

3

22.02.2010, 12:50

Zitat von »Garret«

Tschuldige die Zwischenfrage, aber warum soll die Verbindung immer offen bleiben? Warum nicht alle 2 min verbinden, logs übertragen, trennen?


Hallo Garret

Deine Idee scheint besser zu sein als meine. Somit wird auch das schreiben der Schleifen logischer. Aber momentan komme ich nicht mehr weiter mit den Schleifen.

Zitat von »Garret«

Ist der Anhang ein bisschen anders als das, was du beschreibst?


Joo, das habe ich beim Anhängen übersehen ^^ Das war die alte Struktur. Die neue und richtige habe ich jetzt angehängt.

Gruss mollilinux
»mollilinux« hat folgende Datei angehängt:

4

22.02.2010, 14:38

Pseudocode(Heißt: keine Garantie für korrekte Perl-Syntax)-Vorschlag, von dem ich nicht sagen kann, ob er was taugt. ;)

Quellcode

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
my $startTime = getUnixTime();
my $timeNow = $startTime;
my $duration = 0;
my $auth = 0;
my $tmp;

while (true) { # daemon-Schleife
  if ( ( ($timeNow - $startTime) % (120 + $duration) ) == 0 ) {
  
    while ( not $auth ) { # Verbindungsschleife
      if ( ( ($timeNow - ($startTime+$duration)) % 5 ) == 0 ) {
        doConnect();
        doAuth();
      }
      $tmp = getUnixTime();
      $duration = $tmp - $timeNow;
      $timeNow = tmp;
    }

    getLogs();
    disconnect();
    $auth = 0;
  }

  $duration = getUnixTime() - $timeNow;
  $timeNow = getUnixTime();
}

mollilinux

unregistriert

5

22.02.2010, 16:47

Zitat von »Garrett«

Pseudocode(Heißt: keine Garantie für korrekte Perl-Syntax)-Vorschlag, von dem ich nicht sagen kann, ob er was taugt.


Dein Schleifenskript scheint mit leichten Korrekturen gut zu funktionieren. Wende Subroutinen an bei doConnect() und doAuth(). Habe schon länger mit Skripte-Schreiben nichts mehr zu tun gehabt, habe zuerst das do mit einer do-while Schleife verwechselt. ^^

Ich denke es müsste funktionieren wenn meine Eigenschaften eingebaut werden. Für die SSH Verbindung wende ich das Modul Net->SSH->Perl an. Es scheint aber ein Problem zu geben, da ich keine Verbindung hinkriege. Habe ein Test-Skript, das mit Hilfe dieses Moduls eine SSH Verbindung aufbaut mit automatischer Passwortübergabe, scheint aber nicht zu funktionieren. Ich frage mich was ich flasch mache :?:

Quellcode

1
2
3
4
5
6
7
8
9
use Net::SSH::Perl;

$scon = Net::SSH::Perl->new("HOST-IP");

$scon->login("USER","PASSWORT");

print "Baue Verbindung auf...\n";
($output,$errors,$exit) = $scon->cmd("ls -l");
print $output;


Es dauert ca. 10 Sekunden und es erscheint folgende Ausgabe:

Quellcode

1
2
3
molli@penguin ~/projects/mprm $ perl verb2.pl
Math::BigInt: couldn't load specified math lib(s), fallback to Math::BigInt::Calc at /usr/lib/perl5/vendor_perl/5.8.8/Crypt/DH.pm line 6
Permission denied at verb2.pl line 5


Komisch ist, dass während dem Ausführen nichts von einer SSH-Schlüsselbestätigung kommt, es sei denn ich müsste noch was dazuschreiben...

Im Google finde ich was darüber: http://search.cpan.org/dist/Net-SSH-Perl…th/PublicKey.pm

Komme aber mit nicht ganz klar, wie ich das in mein Verbindungs-Code implementieren soll.



Gruss mollilinux

6

22.02.2010, 17:22

Hast du das Math::BigInt-Modul installiert?

was hast du bei meinem Vorschlag korrigiert? Ich konnt das ja nicht wirklich testen (bzw. wars mir zu aufwendig).

mollilinux

unregistriert

7

22.02.2010, 18:03

Zitat von »Garrett«

Hast du das Math::BigInt-Modul installiert?


Das Paket habe ich jetzt nachinstalliert. Auch das Paket dev-perl/Net-OpenID-Consumer musste ich nachkompilieren. Doch das Problem scheint weiter zu existieren.

Quellcode

1
2
3
perl verb2.pl
Permission denied at verb2.pl line 5
molli@penguin ~/projects/mprm $


Zitat von »Garrett«

was hast du bei meinem Vorschlag korrigiert? Ich konnt das ja nicht wirklich testen (bzw. wars mir zu aufwendig).


Bei Line 2 mussten die Klammern weg bei getUnixZime, da es (noch) keine Subroutine verwendet.

Quellcode

1
my $startTime = getUnixTime(); 


zu

Quellcode

1
 my $startTime = getUnixTime; 



Also momentan sieht das Skript zimlich chaotisch und unübersichtlich aus. Wenn das Skript vollständig ist, dann werde ich es hier posten.

Ich versuche das Problem mit "Premission denited" herauszufinden und dann melde ich mich wieder.

Vielen Dank fürs Erste.

Gruss mollilinux

8

22.02.2010, 18:08

Ist Line 5 folgende?

Zitat

$scon->login("USER","PASSWORT");
Meine Rechtschreibfehler sind gewollt und unterliegen dem Copyright des Verfassers, es sei denn, sie sind explizit unter die GPL gestellt .....

Außerdem sind sie ein Ausdruck der Persönlichkeit des Schreibers!

mollilinux

unregistriert

9

22.02.2010, 18:16

Zitat von »Wernieman«

Ist Line 5 folgende?


Ja, es ist diese Line 5, wo das Login durchgezogen wird. Habe nun den Debug Modus drin:

Quellcode

1
2
3
4
5
6
7
8
9
use Net::SSH::Perl;

my $cons = Net::SSH::Perl->new("192.168.1.100", debug => 1 );

$scon->login("molli","molli");

print "Baue Verbindung auf...\n";
($output,$errors,$exit) = $scon->cmd("ls -l");
print $output;


Und es kommt folgende Ausgabe:

Quellcode

1
2
3
4
5
6
7
8
9
molli@penguin ~/projects/mprm $ perl verb2.pl
penguin.local: Reading configuration data /home/molli/.ssh/config
penguin.local: Reading configuration data /etc/ssh_config
penguin.local: Connecting to 192.168.1.100, port 22.
penguin.local: Remote protocol version 2.0, remote software version OpenSSH_5.2
penguin.local: Net::SSH::Perl Version 1.34, protocol version 2.0.
.enguin.local: No compat match: OpenSSH_5.2
penguin.local: Connection established.
Can't call method "login" on an undefined value at verb2.pl line 5, <GEN0> line 1.


Ich werde jetzt mal im google schauen, ob ich was finde. Falls ich was finde werde ich es hier posten.

Ich verstehe nicht ganz warum er openssh 5.2 ablehnt.

Hat jemand eine Idee?

Gruss mollilinux

EDIT: Bin noch auf zwei Beiträge gestossen, bei einen gibt es keine Lösung auf das Problem beim anderen werde ich nicht schlau draus.


http://www.perl-community.de/bat/poard/thread/13081

http://www.linuxquestions.org/questions/…sshperl-701113/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »mollilinux« (22.02.2010, 18:53)


10

22.02.2010, 19:08

Schau mal das an:

http://www.perlmonks.org/?node_id=590548

Entweder brauchst du die passenden schlüssel auf beiden Rechnern oder du schaltest den interactive-Modus des SSH-Moduls ein (aber das würd ich nicht auf Rechnern machen, die ich nicht selber unter kontrolle habe...)

11

22.02.2010, 20:10

Aber eigentlich sollte doch es auch ohne Schlüsselauthenmtifizierung gehen ...

Hast Du mal einen Conneckt auf der Konsole (also per hand) Probiert??

Edit
Du hast ja recht ;o)

Zitat

$ssh->login($user, $pass);
[download]

will never work - by design!
Meine Rechtschreibfehler sind gewollt und unterliegen dem Copyright des Verfassers, es sei denn, sie sind explizit unter die GPL gestellt .....

Außerdem sind sie ein Ausdruck der Persönlichkeit des Schreibers!

mollilinux

unregistriert

12

22.02.2010, 21:33

Zitat von »Garrett«



Dieser Artikel hat mich ziemlich weitergrbacht, sonst währe ich noch morgen am Fehlersuchen ^^

Zitat von »Wernieman«

Aber eigentlich sollte doch es auch ohne Schlüsselauthenmtifizierung gehen ...


Jetzt gäbe es noch die Möglichkeit, Schlüssel zu hinterlegen. Dann könnte ich wieder das Versuchsskript anwenden. So muss ich nicht den interaktiven Modus einschalten.

Ich melde mich wieder.

Gruss mollilinux

13

23.02.2010, 09:43

Du weißt wie Du Schlüsselgenerierst und hinterlegst?

Würde ich bei Scripten übrigens immer empfehlen ....
Meine Rechtschreibfehler sind gewollt und unterliegen dem Copyright des Verfassers, es sei denn, sie sind explizit unter die GPL gestellt .....

Außerdem sind sie ein Ausdruck der Persönlichkeit des Schreibers!

mollilinux

unregistriert

14

23.02.2010, 09:54

Zitat von »Wernieman«

Du weißt wie Du Schlüsselgenerierst und hinterlegst?


Nein, ich verstehe nicht ganz wie das mit Schlüsselhinterlegen funktioniert. Ich denke ist nicht so eine Sache.

Ich versuchs mit Hilfe von diesem Tutorial:

http://www.uni-koeln.de/rrzk/kompass/107/k1078.html


Gruss mollilinux

EDIT:

Wie funktioniert das? Müssen meine Schlüssel und die Schlüssel des Zielcomputers identisch sein?

mollilinux

unregistriert

15

23.02.2010, 10:59

Zitat von »Garrett«

Ich konnt das ja nicht wirklich testen (bzw. wars mir zu aufwendig).


Also ich habe mal die Verbindung in einer Subroutine definiert und den System-Call. Scheint aber ein Problem zu geben mit getUnixTime.

Quellcode

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

my $host = 'HOST';
my $user = 'USER';

my $startTime = getUnixTime;
my $timeNow = $startTime;
my $duration = 0;
my $auth = 0;
my $tmp;

# Subroutine für System-Call

sub exec_command {
    system("doConnect() $cmd_login $ssh_bin $startTime $duration $auth");
}

while (true) { # daemon-Schleife
  if ( ( ($timeNow - $startTime) % (120 + $duration) ) == 0 ) {
  
    while ( not $auth ) { # Verbindungsschleife
      if ( ( ($timeNow - ($startTime+$duration)) % 5 ) == 0 ) {
        sub doConnect {
	      $cmd_login = "$name\@$host";
	      $ssh_bin = `which ssh`; chomp $ssh_bin;
	      exec_command();
	}
	doConnect();
        # doAuth();
      }
      $tmp = getUnixTime;
      $duration = $tmp - $timeNow;
      $timeNow = tmp;
    }

    getLogs();
    disconnect();
    $auth = 0;
  }

  $duration = getUnixTime() - $timeNow;
  $timeNow = getUnixTime();
}


Hier meine Ausgabe, wenn das Skript 1 Sekunde am laufen ist:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
molli@penguin ~/projects/mprm $ perl forum-test.pl                                 
sh: -c: Zeile 0: Syntaxfehler beim unerwarteten Wort `@openmolli.dynalias.com'     
sh: -c: Zeile 0: `doConnect() @openmolli.dynalias.com /usr/bin/ssh getUnixTime 0 0'
sh: -c: Zeile 0: Syntaxfehler beim unerwarteten Wort `@openmolli.dynalias.com'     
sh: -c: Zeile 0: `doConnect() @openmolli.dynalias.com /usr/bin/ssh getUnixTime 0 0'
sh: -c: Zeile 0: Syntaxfehler beim unerwarteten Wort `@openmolli.dynalias.com'     
sh: -c: Zeile 0: `doConnect() @openmolli.dynalias.com /usr/bin/ssh getUnixTime 0 0'
sh: -c: Zeile 0: Syntaxfehler beim unerwarteten Wort `@openmolli.dynalias.com'     
sh: -c: Zeile 0: `doConnect() @openmolli.dynalias.com /usr/bin/ssh getUnixTime 0 0'
....
Und noch weitere 100 selbe Zeilen.
....
molli@penguin ~/projects/mprm


muss ich getUnixTime irgendwie definieren?


Gruss mollilinux

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »mollilinux« (23.02.2010, 18:18)


16

23.02.2010, 14:12

Ja, klar. Wie gesagt, das war pseudocode. Statt der Funktion getUnixTime() musst du die einsetzen, mit der Perl eben den Unix timestamp zurückgibt. (Keine Ahnung, welche das ist, deshalb hab ich das so geschrieben). Ein paar Kommentare in meinem text wären wohl nicht verkehrt gewesen, naja, nächstes mal weiß ichs...

17

23.02.2010, 14:18

SSH Schlüsselgenerierung

Auf dem Computer der sich einloggen will (Client) wird mit ssh-keygen ein Schlüsselpar erzeugt und unter .ssh des Users abgelegt

am besten so vorgehen

Quellcode

1
2
3
su - user-unter-dem-script-läuft
cd .ssh                          (wenn .ssh nicht existiert, anlegen)
ssh-keygen -t dsa        (erzeugt einen DSA-Key, siehe man)


Dann den pub-Teil auf dem Zielrechner, auf dem nach sich einloggen will unter dem user der sich einloggen will, ablegen.
und zwar unter .ssh/authorized_keys
In .ssh/authorized_keys können mehrere Keys abgelegt werden, jeder ist immer eine Zeile. also gut ist:

Quellcode

1
2
3
su - user-der-sich-einloggt
cd .ssh                          (wenn .ssh nicht existiert, anlegen)
cat id_dsa.pub >>authorized_keys


Dieses dann manuell ausprobieren, auf dem Rechner der sich einloggen will:

Quellcode

1
2
su - user-unter-dem-script-läuft
ssh  user-der-sich-einloggt@server


Ohne weitere Passwortabfrage muß es gehen (Es sei denn es kommt die Frage nach "known_host", dann hat man sich mit dem User auf dem Server noch nie eingeloggt, d.h. mit Ja beantworten und nochmals Testen)

jetzt klar??
Meine Rechtschreibfehler sind gewollt und unterliegen dem Copyright des Verfassers, es sei denn, sie sind explizit unter die GPL gestellt .....

Außerdem sind sie ein Ausdruck der Persönlichkeit des Schreibers!

mollilinux

unregistriert

18

23.02.2010, 17:52

Die Protokolle werden mit SCP kopiert. Der Code scheint übersichtlicher und einfacher.

Zitat von »Garret«

Ja, klar. Wie gesagt, das war pseudocode. Statt der Funktion getUnixTime() musst du die einsetzen, mit der Perl eben den Unix timestamp zurückgibt.


Unter perl bekommt man dies mit der Funktion "time()".

Jetzt scheint es aber ein Problem zu geben mit den Schleifen. Wenn ich das Programm starte, den Verbindungsbefehl einkommentiert, scheint die Verbindungsschleife im Endlostakt zu widerholen, dann passiert 5s nichts und dann wieder eine Vielzahl von Widerholungen.

Momentan sieht der Code so aus:

Quellcode

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
#!/usr/bin/perl

use POSIX; 			# Unix Timestamp
use Net::SCP qw(scp);		# Datentransfer via SCP

# Login Informationen
my $user = 'USER';
my $host = 'HOST';

my $localtime = localtime($timing);
my $startTime = time();
my $timeNow = time();
my $duration = 0;
my $auth = 0;
my $tmp;

print "Automatisches Backup";
sleep 1;
while (true) { # daemon-Schleife
  if ( ( ($timeNow - $startTime) % (120 + $duration) ) == 0 ) {
  
    while ( not $auth ) { # Verbindungsschleife
      if ( ( ($timeNow - ($startTime+$duration)) % 5 ) == 0 ) {

        $scp = Net::SCP->new($host, $user);
	print "Wiederholungsrate";
	
      }
      $tmp = time();
      $duration = $tmp - $timeNow;
      $timeNow = tmp;
    }

    $scp->get("PROTOCOL-FILE") or die $scp->{errstr};
    $scp->quit; # Verbindung trennen
    $auth = 0;
  }

  $duration = time() - $timeNow;
  $timeNow = time();
}


und hier die Ausgabe:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
molli@penguin ~/projects/mprm $ perl main.pl
...
rholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholung
srateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWi
ederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederhol
ungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrat
eWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWieder
holungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrate
WiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederh
olungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsr
ateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWied
erholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholun
gsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateW
iederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsrateWiederholungsr
...
molli@penguin ~/projects/mprm $


Mit sleep (WERT) kann man eine Zeitverzögerung einbauen. Wenn ich diese aber nach Line 26 einbaue, kommt keine Ausgabe mehr, es passiert nichts.

Könnte es an den Schleifen liegen?

Ich komme nicht mehr weiter... :S

Gruss mollilinux

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »mollilinux« (23.02.2010, 18:27)


19

23.02.2010, 19:16

du musst die Variable $auth, dort wo du wiederholungsrate" schreibst, mit dem Rückgabewert der Verbindungs-/Authentizifierungsfunktion füttern. Die Verbindungsschleife wiederholt sich so lange bis eine Verbindung hergestellt und man angemeldet ist. Wenn du den Verbindungskram auskommentierst, wirds logischerweise ne Endlosschleife, weil $auth immer 0 bleibt.

Alles unter der Vorraussetzung, dass die Funktion im Fehlerfall "0" zurückgibt. (wenn sie was anderes zurückgibt, muss man die innere schleife noch ein bisschen anpassen.)

Übrigens wär es gut, wenn du statt:

Quellcode

1
2
my $startTime = time();
my $timeNow = time();

Quellcode

1
2
my $startTime = time();
my $timeNow = $startTime;

schreibst

und bei (Achtung 2x)

Quellcode

1
2
$duration = time() - $timeNow;
$timeNow = time();


lieber

Quellcode

1
2
3
$tmp = time();
$duration = $tmp - $timeNow;
$timeNow = $tmp;


Das hat den Sinn, dass es keine Einfluss auf das ordentliche Funktionieren der Schleifen hat, wenn das mal script nicht schnell genug laufen sollte, dass time() bei zwei direkt aufeinanderfolgenden Aufrufen, den gleichen timestamp zurückgibt.

Ist das Script eigentlich deine Idee, oder ne Hausaufgabe oder sowas?

mollilinux

unregistriert

20

23.02.2010, 20:13

Zitat von »Garrett«

Ist das Script eigentlich deine Idee, oder ne Hausaufgabe oder sowas?


Nein nein ist keine Hausaufgabe :D aber es ist für eine sehr wichtige Angelegenheit.

Zitat von »Garrett«

Die Verbindungsschleife wiederholt sich so lange bis eine Verbindung hergestellt und man angemeldet ist.


Es scheint nicht so. Musste noch bei der verbindungsschleiffe im Code noch auth = 1; hinzufügen, ansonsten würde sich die scheife weiter widerholen, obwohl eine Verbindung besteht. Ansonsten funktioniert's gut :thumbup: Momentan der Code wie folgt aus:

Quellcode

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 POSIX; 			# Unix Timestamp
use Net::SCP qw(scp);		# Datentransfer via SCP

# Login Informationen
my $user = 'USER';
my $host = 'HOST';

# Protokoll Pfade
my $file_path = '"PFAD_ZU_FILE"';

my $localtime = time();
my $startTime = time();
my $timeNow = $startTime;
my $duration = 0;
my $auth = 0;
my $tmp;

while (true) { # daemon-Schleife
  if ( ( ($timeNow - $startTime) % (120 + $duration) ) == 0 ) {
  
    while ( not $auth ) { # Verbindungsschleife
      if ( ( ($timeNow - ($startTime+$duration)) % 5 ) == 0 ) {
	print "Verbindung wird hergestellt... \n", scalar $scp, "\n";
        $scp = Net::SCP->new($host);
	$scp->login($user);
	$auth = 1;
      }
      $tmp = time();
      $duration = $tmp - $timeNow;
      $timeNow = $tmp;
    }
    
    # Protokoll(e) herunterladen
    print "Protokolle werden heruntergeladen:  \n", scalar $file_path, "\n"; 
    $scp->get($file_path) or die $scp->{errstr};
    print "Ausgabe: ", scalar $scp, "\n";
    
    print "Verbindung wird getrennt...\n";
    $scp->quit; # Verbindung trennen
    $auth = 0;
  }

  $duration = time() - $timeNow;
  $timeNow = time();
}


Jetzt gibt es aber noch eine Frage. Wenn das Log auf meinen Compi heruntergeladen wurde, und sich die Schleife widerholt, wird das bestehende Log File überschrieben. Da dies aber nicht geschehen darf, muss noch irgendeine Schleife zwischen Line 37. Wenn das File existiert, dann einfach noch eine Zahl dahinterhängen - File.log.1, File.log.2,3...

Kannst du mir dabei helfen?

Gruss mollilinux

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »mollilinux« (25.02.2010, 23:34)