Übertrag entfernter Programme auf einen anderen Rechner

Hinweis: In dem Thema Übertrag entfernter Programme auf einen anderen Rechner gibt es 7 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • nabend,


    vielleicht könnt Ihr mir helfen.
    Übertrag der von mir aus 42.3 entfernten Programme auf einen anderen Rechner.
    Die gesperrten Programme sind bei mir in der Datei "locks" in
    /etc/zypp aufgeführt.


    Wie schaffe ich daraus ein Liste für
    $ zypper rm ?

    erstmal einen schönen Abend

    Für den Inhalt des Beitrages 114808 haftet ausdrücklich der jeweilige Autor: babsundthorsten

  • Im vorigen Befehl, ist eine eckige Klammer zuviel. Er würde trotzdem funktionieren, aber das ist einfach trotzdem schlecht. Sorry.


    Hier die Verbesserung und Erläuterung:
    Ein zypper se -si | sed -rn '/^.l/p' würde uns aus der Ausgabe von zypper se -si alle Zeilen herausfischen (search alle -installierten -samtDetails), die als zweites Zeichen ein kleines L haben. man zypper sagt, dass ein kleines L an der zweiten Stelle für "locked" steht. Also genau die Pakete, die wir suchen.


    Da wird jedoch den Paketnamen wollen, machen wir das alles in einem Rutsch mit dem substitue/suchmuster/ersetzung/print statement.
    sed hat die Angewohnheit jede Zeile, die es gelesen hat auch zu drucken. Wir schalten das automatische Drucken mit -no auto printing ab.
    Und die extended -regexes ein.
    (Man kann kurze Optionen, also Dinger mit einem Bindestrich zusammenfassen. Aus -r -n wird -rn. Jedenfalls solange es eindeutig bleibt.)


    Das Suchmuster ist ziemlich einfach:
    / Der slash markiert den Beginn (Man kann jedes Zeichen dafür verwenden, es ginge auch saregexaersetzungap, was aber sicher Ärger macht, denn Paketnamen enthalten schon mal ein "a".
    ^ In einem Regex steht das für Anfang. Also am Anfang der Zeile muss ein
    . beliebiges Zeichen stehen gefolgt von einem
    l dem kleinen L, danach kommt ein
    <ein Leerzeichen>\|<ein Leerzeichen> dem der Feldtrenner | in der Ausgabe von zypper se folgt. Da ein solches Pipezeichen in einem Regex für "Oder" steht, müssen wir es escapen (auch quoten, maskieren genannt), damit es wirklich als ein buchstäbliches |- Zeichen erkannt wird. Danach steht noch ein Leerzeichen.


    Jetzt braucht es ein paar mehr Worte. Zuerst verwenden wir runde Klammern. Die dienen zwei Zwecken. Einmal kann man damit, wie in der normalen Mathematik auch, gruppieren, was auch genau so funktioniert (auch wenn manchem nicht so klar ist, was "Gruppierung" in einem Regex bedeutet). Die zweite Funktion ist, dass diese Gruppen später noch zur Verfügung stehen. Öffnende runde Klammer werden von links nach rechts gezählt. Die erste Gruppe ist also das erste runde Klammerpaar. Natürlich kann man die auch schachteln. Eine runde schließende Klammer schließt immer die zuletzt geöffnete.
    Und wir verwenden einen Zeichenklassennamen [:blank:], der alle Whitespacezeichen umfasst. Also Leerzeichen, Tabs und sonstige Zeichen, die nichts darstellen (Es gibt davon noch ein paar, die sogar nochmal unterteilt werden....)


    Jetzt zerlegen wir dieses Minimonster ([^[:blank:]]+).*
    ( die Gruppierung beginnt. Alles, was zwischen den runden Klammern finden, endet in Gruppe \1
    [ die eckige Klammer beginnt eine Zeichenklasse. Das eckige Klammerpaar steht für genau ein einziges Zeichen! Und dieses Zeichen darf kein
    ^ (Innerhalb einer Zeichenklasse meint ein ^ als allererstes Zeichen "KEIN".)
    [:blank:]  Whitespacezeichen sein. Also kein Leerzeichen, kein Tab... (Beachte: einmal gehören die inneren eckigen Klammern zu einem NAMEN, einmal bezeichnen die äußeren irgendEIN Zeichen)
    ] und dieses EINE Zeichen aus der Klasse der Whitespacezeichen endet hier. (Im vorigen Post genau hier eine öffnende eckige Klammer zuviel)
    Damit haben wir gesagt: Genau EIN Zeichen, das kein Whitespacezeichen ist. Also alle Buchstaben, Zahlen und diverse Sonderzeichen dürfen darin enthalten sein. Ziemlich genau, das, was wir wollen. Es können Buchstaben, Zahlen, Punkte, Bind- und Unterstriche in einem Paketnamen sein. Und -nicht sonderlich sinnvoll- sind aber auch viele andere Zeichen erlaubt. Linux erlaubt JEDES Zeichen, außer der binären Null und dem Slash / in einem Dateinamen.
    Natürlich besteht ein Paketname aus mehreren Zeichen. Bislang haben wir nur ein einziges definiert.
    + Das erledigt der Quantifaktor Plus, wie das so schön heißt, meint, dass mindestens eines dieser Zeichen dort stehen muss oder beliebig viele dieser Zeichen.
    ) Die Gruppe endet hier. Wir haben endlich den Paketnamen in der zweiten Spalte der Ausgabe von zypper se definiert.
    Da in der Ausgabe auf jeden Fall nach dem Paketnamen ein Whitespacezeichen noch vor dem Tabellentrennstrich | kommt, ist das jetzt eindeutig der Paketname.
    .* definiert den ganzen Rest. Der Punkt . bezeichnet ein beliebiges Zeichen, das * (noch ein Quantifikator) beliebig oft oder gar kein Mal vorkommen kann. Das interessiert uns aber schon nicht mehr. Da kann zypper nun sabbeln und babbeln, was es will - wir ignorieren das.


    Und im Ersetzungsteil des s/// Kommandos greifen wir mit \1 auf genau diese Gruppe, den Paketnamen zu, den wir dann mit der Erweiterung des s///p Kommandos "ausdrucken".



    Der korrekte Befehl lautet also:
    zypper se -si | sed -rn 's/^.l \| ([^[:blank:]]+).*/\1/p'
    statt
    zypper se -si | sed -rn 's/^.l \| ([^[[:blank:]]+).*/\1/p'
    Der "falsche" Befehl funktioniert nur, weil eine öffnende eckige Klammer nicht in Paketnamen vorkommt. Die eckige Klammer steht ja innerhalb einer verneinten Zeichenklasse. Dort ist diese Klammer schlicht eine buchstäbliche Klammer.
    Kommt sie in einem Paketnamen doch vor, schlägt der Regex fehl. Ein Quelle für subtile Fehler.

    Einmal editiert, zuletzt von Sauerland () aus folgendem Grund: Rechtschreibfehler und genauere Formulierungen

    Für den Inhalt des Beitrages 114816 haftet ausdrücklich der jeweilige Autor: Berichtigung

  • Intern arbeitet jedes Linux mit sogenannten Dateidesriptoren. Das sind einfach Integerzahlen.
    Öffent man irgendeine Datei, so wird dem Prozess ein weiterer dieser Dateidescriptoren hinzugefügt, der letztlich auf einen Puffer zeigt, der wiederum von den tieferliegenden Schichten, die sich um die Hardware kümmern, gefüllt und aktuell gehalten wird.


    Auf höhere Ebene, auf der wir uns immer bewegen, ist es völlig egal, ob dort unten via Netzwerk irgendwohin gegriffen wird, auf eine lokale Festplatte oder sonstige Datenträger.


    Jeder Prozess, der unter Linux gestartet wird, hat automatisch drei dieser Dateidescriptoren.
    Einmal die Nummer 0, die für das Keyboard steht, einmal die Nummer 1, die für den Bildschirm steht und einmal die Nummer 2 für den Fehlerkanal.
    Diese drei Descriptoren haben "Spitznamen".
    Sie heißen STaDardINput == 0, STaDardOUTput == 1, und STanDardERRor == 2.


    Wenn wir die Ausgabe eines Befehles in eine Datei umleiten, dann wird schlicht der STDOUT Dateidescriptor auf eine Datei "umgebogen".

    Bash
    # wir lassen uns eine Datei anzeigen
    cat /pfad/zu/einer/datei
    # sie wird am Bildschirm auf STDOUT angezeigt.
    
    
    # diesmal lenken wir die Ausgabe um
    cat /pfad/zu/einer/datei > /pfad/zu/neuer/kopie/von/datei
    # der Inhalt von "datei" erscheint nicht am Bildschirm, 
    # sondern als eine Kopie in der neuen datei

    Der eigentliche Befehl, der dir diese Liste rauslutscht, gibt also lediglich die Paketnamen auf dem Bildschirm aus.


    Du kannst aber leicht mit einer Umleitung den Krempel in eine Datei deiner Wahl schreiben.


    irgendeincommando > /pfad/zu/datei schreibt die Ausgabe von "irgendeincommando" in die Datei "/pfad/zu/datei". Existiert diese Datei bereits, wird sie damit gelöscht und der neue Inhalt hineingeschrieben. Also zur Ausgabe von "irgendeincommando" geändert.
    irgendeincommando >> /pfad/zu/datei Mit doppelten Größerzeichen wird die Ausgabe nach der letzten Zeile angehängt, also der originale Inhalt nicht überschrieben.



    Hängst du also am Ende des Befehls zypper se -si | sed -rn 's/^.l \| ([^[:blank:]]+).*/\1/p' > meinePaketliste an, dann landen die von dir gesuchten Pakete in der Datei "meinePaketliste". Und die liegt in dem Verzeichnis, in dem du dich gerade befindest. Natürlich kannst du stattdessen auch einen absoluten Pfad angeben, wie z.b. /home/ich/meinePaketliste.txt