• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Perl: apt-get dist-upgrade automatisieren?

Moin, Moin,

da ich vorhin erst ein dist-upgrade hab laufen lassen, kann ich mein script nicht testen. Mag mal wer draufschauen und mir sagen ob er einen Gedankenfehler findet?
Code:
#!/usr/bin/perl

open(UPGRADE,"|/usr/bin/apt-get dist-upgrade") or die $!;
chomp ($test = <UPGRADE>);
if ($test =~ /.*0 zu entfernen.*/) {
    print UPGRADE "yes\n";
} else {
    print UPGRADE "no\n";
}
close UPGRADE;

Gedacht ist es so das ich per script apt-get dist-upgrade aufrufe, die Ausgabe in eine Variable schreibe, die newline Zeichen entferne, diese Variable untersuche ob Dateien entfernt werden sollen und dann entweder die Eingabe 'yes' oder 'no' vornehmen lasse. Ich hoffe das kein Denkfehler drin ist, ich kann derzeit nicht testen wie sich das Skript verhält da bei mir nichts aktuallisiert werden kann/muß.
 
OP
Geier0815

Geier0815

Guru
Moin, Moin,

ganz so einfach wie ich mir das gedacht habe scheint es nicht zu sein. Heute konnte ich es testen, klappt aber nicht. Durch experimentieren hab ich jetzt rausgefunden daß das Einlesen der Ausgaben von apt in die Variable nicht klappt. Wenn ich die Zeile rausnehme und nur eine 'print UPGRADE "yes\n";' verwende läuft das upgrade sauber durch.
Mir ist jetzt nicht klar wieso die Ausgabe von apt nicht in die Variable gelesen wird.
 

gameboy

Hacker
Geier0815 schrieb:
Code:
#!/usr/bin/perl

open(UPGRADE,"|/usr/bin/apt-get dist-upgrade") or die $!;
chomp ($test = <UPGRADE>);
Mir ist zwar nicht so ganz klar, was Du da überhaupt machen willst. Aber was mich auf jeden Fall irritiert, ist das Pipe-Symbol am Anfang des auszuführenden apt-Kommandos...

Versuch doch mal, das Pipe-Symbol ans Ende zu setzen:

Code:
open(UPGRADE,"/usr/bin/apt-get dist-upgrade|") or die $!;
Das bewirkt AFAIK, daß die Ausgabe des Kommandos von Deinem Perl-Programm eingelesen werden kann.

Viele Grüße,
gameboy.
 
OP
Geier0815

Geier0815

Guru
Moin gameboy,

da ich vermute das Du meinen vorherigen Post schon gelesen hast, hab ich ihn editiert und einen neuen geschrieben, damit Du auch siehst das ich was neues geschrieben habe.
Selbstverständlich hast Du Recht gehabt, wenn man das Pipezeichen hinter den aufrufenden Befehl schreibt, wird dessen Ausgabe an das Skript weitergeleitet. Wenn man es am Anfang schreibt, wird die Ausgabe des Skriptes an das Programm geleitet. Ich brauche aber nun beides: Ich möchte die Ausgaben des Programmes ins Skript leiten, dort auswerten und dann eine entsprechende Eingabe ans Programm schicken.
Wenn ich das richtig sehe, kann ich das aber wohl nicht direkt mit einem Programmaufruf machen, sondern muß erst das Programm aufrufen um zu lesen, dann das Programm killen (close würde nicht reichen da das Programm auf eine Eingabe wartet) und dann erst die Fallentscheidung treffen um dann das Programm erneut zu öffnen (diesmal allerdings schreibend) wenn die Eingabe ein "yes" sein soll.
 

TeXpert

Guru
Der weitere Weg steht wie immer in der Doku ;) SCNR:

Code:
$ perldoc -f open
[...]
If the filename begins with '|', the filename is interpreted as a command to which output is to be piped, and if the filename ends with a '|', the
               filename is interpreted as a command which pipes output to us.  See "Using open() for IPC" in perlipc for more examples of this.  (You are not allowed
               to "open" to a command that pipes both in and out, but see IPC::Open2, IPC::Open3, and "Bidirectional Communication with Another Process" in perlipc
               for alternatives.)
 
OP
Geier0815

Geier0815

Guru
Moin TeXpert,

das hättest Du mir auch früher sagen können :wink: Aber egal, ich habe jetzt eine ganze Menge gelernt. Nebenbei dann auch festgestellt das notoxp mit seinem Hinweis das Lama-Buch nur kurz zum Einlesen zu nehmen und dann auf andere Quellen umzusteigen absolut Recht hatte. Ich werde mir demnächst als Referenz wohl doch noch das Kamel-Buch holen da mir die englischen Dokus nicht so liegen. Ist immer schon schwierig genug eine neue Programmiersprache zu lernen, da muß ich mir das nicht selber schwieriger machen als es ist.

Code:
#!/usr/bin/perl -w

my @ausgabe = `/usr/bin/apt-get dist-upgrade << /dev/null&` or die $!;
foreach $testing (@ausgabe) {
    if ($testing =~ /.*0 zu entfernen.*/) {
	our $flag=1;
    }
}
if ($flag==1){
    open(UPGRADE,"|/usr/bin/apt-get dist-upgrade") or die $!;
    print UPGRADE "j";
}
close UPGRADE;

Das ist jetzt erstmal die Lösung die ich mir erarbeitet habe. Selbstverständlich wird das Skript noch um Kommentare und einen Aufruf von 'apt-get update' ergänzt aber ansonsten scheint es jetzt doch zu tun was ich mir vorgestellt habe.
 
Oben