Angepinnt Users4Users : Die besten NICHT-geheimen "Shell-Tricks" der Linux-User

      Wo lag der Befehl schon wieder? => which

      Hallo,

      Der Befehl "which" zeigt einem den vollen Pfad eines (Shell) Kommandos an.

      Unter Ubuntu/Debian liegen die ganzen Binaries von KDE in /usr/* und bei SuSE?

      Quellcode

      1. find /usr/ -name konqueror
      dauert erstens ewig und liefert kein brauchbares Ergebnis.

      Wo war das denn noch mal bei SuSE?

      Quellcode

      1. which konqueror
      2. /opt/kde3/bin/konqueror
      Ah ja, SuSE legt KDE/GNOME in /opt/ ab.

      Der Vorteil zu 'locate' oder 'find' liegt darin, daß nur ausführbare Dateien angezeigt werden und z.B. keine Dokumentationen.

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      Etwas präziser bitte => head, tail, grep&co

      Man kennt das ja als gestresster Umsteiger/Einsteiger.

      Da werden einem solche Dinge wie "Schaue mal in Datei *xy* nach Fehlern oder dem Eintrag von *blablubb* nach", oder sowas wie "Was sind denn die letzten paar Ausgabe von *dingens*, bevor *bumens* passiert?" von irgendwelchen Helfern nur so um die Ohren gehauen.

      Da hat man nun nach meist mühevoller Suche die entsprechende Datei gesucht und die ist natürlich ellenlang.

      Statt aber nun die Datei mit einem Texteditor zu öffnen und Mit "Suchen" durch den ganze Text zu gehen, und sich dann die entsprechenden Zeile heraus zu kopieren, kann man das auch den "Rechenknecht" erledigen lassen, dazu ist er schließlich da.

      1. Suche nach (einem) bestimmten Begriff(en) in einer Datei/Shellausgabe:

      Quellcode

      1. grep Suchbegriff /Pfad/zur/Datei/Datei


      Beispiel: Ist das Modul "v4l" in meiner xorg.conf enthalten?

      Quellcode

      1. grep v4l /etc/X11/xorg.conf
      2. Load "v4l"
      Wie man sieht, spuckt grep gleich die gesamte Zeile aus.

      Linux ist aber "case-sensitive", was tun, wenn ich nicht mehr genau weiß, ob der Begriff Groß-/Kleinschreibung enthält?

      Quellcode

      1. grep -i Suchbegriff /Pfad/zur/Datei/Datei
      Der Parameter "-i" steht für "Ignore case".

      Beispiel:

      Quellcode

      1. grep dri /etc/X11/xorg.conf
      2. Load "dri"
      3. grep -i dri /etc/X11/xorg.conf
      4. Load "dri"
      5. Driver "kbd"
      6. Driver "mouse"
      7. Option "VendorName" "ATI Proprietary Driver"
      8. Driver "fglrx"
      9. Section "DRI"
      Man sieht glaube ich den Unterschied deutlich.

      Und wenn ich mehrere Begriffe auf einmal suchen will?

      Hier hilft "egrep" (extended grep), die Syntax muß man sich nur einmal genau ansehen, egrep akzeptiert übrigens auch die selben Parameter wie grep (z.B. -i).

      Quellcode

      1. egrep 'Suchbegriff1|Suchbegriff1|Suchbegriff2|Suchbegriff3|' /Pfad/zur/Datei/Datei


      Beispiel: Sind in der Konfiguration meiner Netzwerkkarte

      - Benutzersteuerung aktiviert?

      - eine feste IP eingestellt oder DHCP?

      - Der Startmodus auf Automatisch, Manuell oder eine andere Option gesetzt?

      Da wir nicht 100% genau wissen, was GROSS und was klein geschrieben ist, nutzen wir "-i".
      Wie man auch sehen kann, reichen Teile des später wirklich gefundenen Begriffes als Suchwort aus, das Setzen von"Wildcards" wie "*" ist bei grep NICHT nötig, wohl aber bei eth*, weil ich die MAC-Adresse meiner Karte auch nicht auswendig weiß *g*.

      Quellcode

      1. egrep -i 'usercontrol|bootpro|startmod' /etc/sysconfig/network/ifcfg-eth*
      2. BOOTPROTO='static'
      3. STARTMODE='ifplugd'
      4. USERCONTROL='yes'
      OK, Karte bekommt eine feste IP (static) wird bei Kabelanschluß aktiviert (ifplugd) und ich kann sie als "normaler" Nutzer mit Kinternet steuern (USERCONTROL='yes').

      Was steht denn so "drumherum" um meinen Suchbegriff?

      Hier nutzt man die Optionen -A*AnzahlderZeilen* oder -B*AnzahlderZeilen*.

      -A = After => Was steht dahinter?

      -B = Before => Was steht davor?

      Grep eignet sich hervorragend zur Benutzung in einer "Pipe", wenn man eine Shellausgabe filtern will.

      Beispiel: In meinen Smart-Channeln habe ich doch irgendwo einen Channel mit den Paketen für das flash-plugin. Da ich nicht weiß (oder mal so tue *g*) wie genau die Syntax aussieht und genauer wissen will, wie der Channel definiert wird, schaue ich mir die 5 Zeilen vor und nach dem Suchbegriff mal an. Dazu verwende ich den smart-Befehl, der mir die gesamte (:eek:) Channellliste ausspuckt und "pipe" ihn durch grep.

      Quellcode

      1. smart channel --show|grep -A5 -B5 flash
      2. type = apt-rpm
      3. name = SUSE Linux 10.0 APT Suser-oc2pus Repository
      4. baseurl = ftp://ftp.gwdg.de/pub/linux/suse/apt/SuSE/10.0-i386/
      5. components = suser-oc2pus
      6. [B][flash]
      7. type = apt-rpm
      8. baseurl = http://macromedia.mplug.org/rpm/
      9. components = macromedia[/B]
      10. [jpackage-5.0]
      Versucht das mal ohne die Pipe und mit meiner ellenlangen Channellliste, das macht keinen Spaß *g*.

      2. Davor oder dahinter? => "head" und "tail"

      Die Befehle "head" und "tail" zeigen die ersten/letzten N Zeilen einer Datei -bzw. durch eine Pipe wie oben- einer Shellausgabe an.

      Die Syntax ist denkbar einfach:

      Quellcode

      1. head/tail -n *AnzahlderZeilen* /Pfad/zur/Datei/Datei
      2. Befehl | head/tail -n *AnzahlderZeilen*


      Beispiel: Was waren die letzten 10 Ausgaben meines Bootlogs?

      Hier brauchen wir übrigens Rootrechte, da die entsprechende Datei nicht für User lesbar ist, das erledigen wir mit "sudo".

      Quellcode

      1. sudo tail -n 10 /var/log/boot.msg
      2. Password:
      3. <notice>startproc: execve (/usr/sbin/powersaved) [ /usr/sbin/powersaved -d -f /var/run/acpid.socket -v 3 ], [ HOME=/ PATH=/sbin:/usr/sbin:/bin:/usr/bin:/lib/klibc/bin SHELL=/bin/sh RUNLEVEL=5 PREVLEVEL=N DAEMON=/usr/sbin/powersaved ]
      4. done
      5. Starting Firewall Initialization (phase 2 of 2) SuSEfirewall2: Warning: ip6tables does not support state matching. Extended IPv6 support disabled.
      6. Nov 20 11:04:43.732 [notice] We now have enough directory information to build circuits.
      7. done
      8. Nov 20 11:04:44.532 [notice] Tor has successfully opened a circuit. Looks like client functionality is working.
      9. done
      10. Master Resource Control: runlevel 5 has been reached
      11. Skipped services in runlevel 5: irq_balancer
      12. <notice>killproc: kill(4525,3)
      OK, tor/privoxy läuft also ;)

      "Live"-Mitschnitt von Logdateien => "-f"

      Der Parameter -f (=follow) ist hervorragend geeignet um die Systemmeldungen zu verfolgen, hierzu verwendet man tail und betrachtet die Datei /var/log/messages.

      Bei jeder neuen Meldung wird aktualisiert, auch hier sind wieder Rootrechte erforderlich.

      Quellcode

      1. sudo tail -f /var/log/messages
      Dieses Vorgehen ist zur Beobachtung des Systemverhaltens, wenn man z.B. Hardware wie einen USB-Dongle o.ä. einsteckt/aussteckt sehr nützlich.

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      AW: Users4Users : Die besten NICHT-geheimen &quot;Shell-Tricks&quot; der Linux-User

      "Wow !"

      Das entwickelt sich ja zu der reinsten Fundgrube ! Sehr hilfreich !

      Vielen Dank an alle !

      Spidy
      :D
      [SIGPIC][/SIGPIC]

      Helfe Dir selbst, sonst hilft Dir keiner, gut, dass es nicht immer stimmt ! ;-)

      Never argue with an idíot, they drag you down to their level and beat you with experience !

      Non scholae, sed vitae, discimus !

      AW: Users4Users : Die besten NICHT-geheimen &quot;Shell-Tricks&quot; der Linux-User

      Dateirechte und Dateieigentümer per Konsole managen

      Linux als Multiusersystem kennt von Haus aus die Zuordnung von Dateien und Verzeichnissen zu einzelnen Usern oder Gruppen. Diese kann man natürlich auch sehr schnell und einfach per Konsole verwalten.

      1. Herausfinden, wem eine Datei gehört und welche Rechte es gibt
      Auf der Konsole kann ich mit

      Quellcode

      1. ls -l /pfad/zur/gewünschten/datei

      sehr einfach sehen, welche Rechte eine Datei hat und wem sie gehört.
      Beispiel:

      Quellcode

      1. ls -l nc-linux.tar.gz
      2. -rw-r--r-- 1 typeryder typeryder 8403227 2005-12-30 19:28 nc-linux.tar.gz


      Die Ausgabe zeigt uns, daß es sich bei nc-linux.tar.gz um eine Datei handelt (erste Stelle ist ein -), der eigentümer Lese- und Schreibrechte hat (zweite, dritte und vierte Stelle rw-), andere Angehörige der Gruppe die Datei lesen können (fünfte, sechste und siebte Stelle r--) und auch alle anderen die Datei lesen können (achte, neunte und zehnte Stelle r--). Der Eigentümer der Datei ist typeryder, die zugehörige Gruppe ist ebenfalls typeryder.

      Kurze Anmerkung zur Gruppe: Unter SuSE würde hier sehr wahrscheinlich die Gruppe "users" stehen. Debian legt für jeden Benutzer auch eine eigene Gruppe an, daher ist dies bei Debiansystemen nicht automatisch die Gruppe users.


      2. Eigene Gruppenzugehörigkeit rausfinden
      Manchmal kann es schon helfen, daß man als User zu der Gruppe gehört, die auf eine Datei (dies können unter Unix auch Geräte sein) zugreifen kann. Dies ist z.B. wichtig für Zugriffe auf Sounddevices oder gemeinsame Dateien, die den Nutzern einer Gruppe zugänglich sein sollen.
      Zu welchen Gruppen ich gehöre, kann ich mit dem Befehl

      Quellcode

      1. groups

      erfahren.


      3. User neuen Gruppen hinzufügen
      Als root kann ich in der Datei /etc/group/ einer Gruppe neue User hinzufügen. Gleiches funktioniert auch mit dem Befehl "adduser", bei dem ich dann den User und die neue Gruppe als Argumente übergebe.


      4. Eigentümer und/oder Gruppe einer Datei ändern
      Den Eigentümer oder die Gruppenzugehörigkeit einer Datei kann man mit dem Befehl

      Quellcode

      1. chown
      ändern.

      Als Ausgangsbasis habe ich eine Datei mit Namen "rechtevergabe.txt".

      Quellcode

      1. -rw------- 1 typeryder typeryder 8403227 2005-12-30 19:28 rechtevergabe.txt


      Diese Datei gehört bisher dem User typeryder und auch zur Gruppe typeryder. Die Gruppe will ich jetzt umstellen auf die Gruppe users, so daß auch andere User, die in der Gruppe users eingetragen sind, auf die Datei zugreifen können:

      Quellcode

      1. chown dateieigentümer:gruppe /pfad/zur/Datei
      2. chown typeryder:users rechtevergabe.txt


      ein erneutes ls zeigt dann folgendes:

      Quellcode

      1. -rw------- 1 typeryder users 8403227 2005-12-30 19:28 rechtevergabe.txt



      5. Rechte einer Datei ändern
      Damit im obigen Beispiel die Mitglieder der Gruppe users auch auf die Datei zugreifen können, muss ich jetzt noch die Rechte ändern. Dies kann ich mit dem Befehl

      Quellcode

      1. chmod
      machen.

      Der Befehl chmod erlaubt sowohl eine Rechtevergabe mit symbolischen Bezeichungen (u für users, g für Gruppe, o für others und a für all) plus die jeweiligen Änderungen); die Rechte sind entsprechend r für lesen, w für schreiben und x für das Ausführen einer Datei. Die Rechte werden dann mit +, - oder = entweder neu vergeben, entfernt oder gleichgelassen.

      Bei symbolischen Änderungen sieht unser obiger Fall so aus:

      Quellcode

      1. chmod g+rw rechtevergabe.txt


      In der Oktalversion werden die Rechte über eine Zifferkombination vergeben

      Quellcode

      1. chmod 744 /pfad/zur/Datei

      gibt z.B. alle Rechte an den Eigentümer (die 7 auf der ersten Stelle) und Leserechte für die Gruppe und alle anderen (die 4 auf der zweiten und dritten Stelle). Die möglichen Ziffernkombinationen sind 4 = nur lesen, 5 = lesen und ausführen, 6 = lesen und schreiben und 7 = alle Rechte.

      In unserem Beispiel sieht die Rechtevergabe mit dem Oktalsystem folgendermaßen aus:

      Quellcode

      1. chmod 660 rechtevergabe.txt


      Auf den ersten Blick wirkt die Oktaleingabe vielleicht umständlicher als die symbolische Eingabe. Wenn man sich aber erstmal an die Ziffern gewöhnt hat, ist man mit dem System IMHO schneller unterwegs.
      010 Praise the Evil KANIN From Outer Space!
      001 Fragen stellen - gewußt wie...
      111 Privatsphäre ist kein Verbrechen!
      Besucht das Unknown Online - Forum - ein Ingameforum für SR4.

      Mal ein kleiner Test.

      #UNIX - UNIX Humor - HelpDesk

      Je lauter und öfter Ihr hier lacht, umso besser kennt Ihr Euch wohl aus.... ;)

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      Zum nachlesen und Schreibtischvermüllen. / Instant Ordnerlösching

      Wer jetzt nach dieser Flut von nützlichen Beiträgen meint:

      "Das kann ich mir sowieso nicht alles merken" (Auch ohne TypeRiders Gedächtnis

      verständlich), sollte sich DAS mal genauer anschauen.

      Ist zwar nicht so hilfreich wie das, was hier schon alles gepostet wurde (meldet euch doch

      mal bei Wikipedia, ist echt druckreif), aber immerhin auch ohne Konsolenbefehl erreichbar.

      Ach ja, wer mal einen Ordner samt Inhalt löschen will, ohne erst hineninzuwechseln,

      Quellcode

      1. cd $NameDesZuLöschendenOrdners


      den Inhalt in die ewigen /dev/null-Gründe zu schicken und anschließend wieder mit

      Quellcode

      1. cd ..


      und

      Quellcode

      1. rmdir $NameDesZuLöschendenOrdners


      Klarschiff zu machen (kann v. a. mit Unterverzeichnisssen etwas dauern), solte lieber

      Quellcode

      1. rm -r $NameDesZuLöschendenOrdners


      oder

      Quellcode

      1. rm -r /Pfad/zur/Datei\Ordner


      verwenden. Löscht Ordner samt Inhalt und Unterverzeichnissen in 0,nix. Und

      anschließend sieht der Konquerorhintergrund (je nach Coloer-Scheme) aus wie das

      T-Shirt von Meister Glatze.
      Für Freunde gepflegter Satire
      Für Freunde des fröhlichen Fraggens
      ---------------------------------
      AMD Ahlon XP 1900+
      512 MB DDR-RAM
      GeForce FX5200
      60 GB HDD
      K7S5A
      ------
      Aktuelle Probleme: Beryl geht nicht
      ---------------------
      " [COLOR="DarkGreen"]Linux[/COLOR] is like a tent. No [COLOR="Red"]Windows[/COLOR], no [COLOR="Red"]Gates[/COLOR], but an Apache inside."
      Neben <TAB> gibt es auch noch eine andere Art des Vervollständigen von Begriffen aller Art:

      Die Wildcard. Hört sich spektakulär an, ist aber nur ein simler * .

      (Tastenkombi: <Shift><Taste neben dem Ü>) Beispiele:

      Quellcode

      1. locate kochre*


      Sucht alle Dateien, die mit "kochre" anfangen.

      Quellcode

      1. locate *zepte


      sucht alle Dateien, die mit "zepte" aufhören.

      Quellcode

      1. locate k*e.txt


      Sucht alle Dateien, die mit "k" anfangen und auf "e.txt" enden.

      Quellcode

      1. rm -r *


      Löscht alle Dateien und Ordner im aktuellen Verzeichnis.

      Die Wildcard kann also Zeichen aller Art und beliebiger Anzahl symbolisieren. Praktisch

      beim Suchen!

      adJO
      Für Freunde gepflegter Satire
      Für Freunde des fröhlichen Fraggens
      ---------------------------------
      AMD Ahlon XP 1900+
      512 MB DDR-RAM
      GeForce FX5200
      60 GB HDD
      K7S5A
      ------
      Aktuelle Probleme: Beryl geht nicht
      ---------------------
      " [COLOR="DarkGreen"]Linux[/COLOR] is like a tent. No [COLOR="Red"]Windows[/COLOR], no [COLOR="Red"]Gates[/COLOR], but an Apache inside."

      AW: Users4Users : Die besten NICHT-geheimen &quot;Shell-Tricks&quot; der Linux-User

      Bisweilen muss man einen Nutzer einer bestehenden Gruppe hinzufügen - beispielsweise, wenn er die Gruppenrechte benötigt, um eine damit zusammenhängende Resource (Sound, Brenner etc.) zu nutzen.

      Einen User könnt ihr einer Gruppe mit dem Befehl "gpasswd" hinzufügen:

      Quellcode

      1. gpasswd -a (Username) (Gruppenname)


      Alternativ kann man die Gruppen auch händisch mit einem Editor seiner Wahl bearbeiten, sie finden sich (zumindest unter debian) unter: /etc/group
      010 Praise the Evil KANIN From Outer Space!
      001 Fragen stellen - gewußt wie...
      111 Privatsphäre ist kein Verbrechen!
      Besucht das Unknown Online - Forum - ein Ingameforum für SR4.

      AW: Users4Users : Die besten NICHT-geheimen &quot;Shell-Tricks&quot; der Linux-User

      Ergänzung:

      TypeRyder schrieb:

      Bisweilen muss man einen Nutzer einer bestehenden Gruppe hinzufügen - beispielsweise, wenn er die Gruppenrechte benötigt, um eine damit zusammenhängende Resource (Sound, Brenner etc.) zu nutzen.
      gpasswd dient eigentlich zum Ändern von Gruppenpasswörtern.

      Um die Gruppenzugehörigkeit eines Users z.B. unter openSUSE zu ändern wird der Befehl groupmod verwendet:

      Quellcode

      1. groupmod -A <User> <Group>
      bzw.

      Quellcode

      1. groupmod -R <User> <Group>
      um den betreffenden User wieder aus der Grupe zu entfernen.
      Gruß b3ll3roph0n
      --
      Denken hilft !

      Für alle meine Beiträge gelten, außer bei Zitaten, die Creative Commons.

      AW: Users4Users : Die besten NICHT-geheimen &quot;Shell-Tricks&quot; der Linux-User

      Twingo1803 schrieb:

      So, jetzt will (und kann) ich meinen Senf auch mal zugeben.
      Ich wollte vor kurzem mal wissen, wie ich den freien Platz auf der Festplatte herausfinde.
      Da gibt es einen recht einfachen Befehl.

      Quellcode

      1. df

      Kann man sich gut mit der Eselsbrücke DIE FESTPLATTE merken.
      Dabei gleich ein Gruss an BASTI, der mir dies verraten hat ;o)


      und mit dem kleinen zusatz -h wird das ganze auch für uns menschen verständlich ;)

      Quellcode

      1. df -h

      AW: Users4Users : Die besten NICHT-geheimen &quot;Shell-Tricks&quot; der Linux-User

      Wo wir gerade bei "-h" als Parameter sind, der ausnahmsweise nicht für "help" steht (hier bedeutet er "human readable"), fällt mir noch ein Befehl ein, bei dem der selbe Parameter zum Einsatz kommt:

      Quellcode

      1. du -h
      zeigt die Größe eines Verzeichnisses samt Unterordner an.

      Mit dem Parameter "--max-depth=*Zahl*" kann man einschränken, wieviele Unterverzeichnisebenen angezeigt werden.

      Quellcode

      1. du -h --max-depth=1 /usr/src/
      zeigt also die Größe von /usr/src/ samt der Unterordner, die sich direkt darin befinden, aber ohne deren Unterordner an.

      Quellcode

      1. du -h --max-depth=1 /usr/src/
      2. 4,0K /usr/src/kernel-modules
      3. 23M /usr/src/linux-2.6.22.9-ccj54-obj
      4. 4,1M /usr/src/debug
      5. 27M /usr/src/linux-2.6.18.8-0.7-obj
      6. 276M /usr/src/linux-2.6.18.8-0.7
      7. 303M /usr/src/linux-2.6.22.9-ccj54
      8. 148K /usr/src/linux-2.6.18.8-0.5
      9. 466M /usr/src/packages
      10. 1,1G /usr/src/
      (BTW: Die knapp 500MB, die sich da in "packages" befinden, findet man hier grösstenteils in unserem Downloadarchiv.)

      Ganz Mutige probieren den obigen Befehl mal ohne --max-depth, aber Vorsicht, wenn Ihr nicht schwindelfrei seid!

      Weitere Informationen liefert wie immer die Manual-Page:

      Quellcode

      1. man du


      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      Nachtrag zum Befehl &quot;chmod&quot;

      Hier wird von TypeRyder beschrieben, wie Rechte an einzelnen Dateien oder
      Verzeichnissen geändert werden können.

      Nun kann es auch vorkommen, daß man für alle Dateien oder Ordner in einem
      Verzeichnis die Rechte auf einmal setzen möchte. Nachdem Dateien und Ordner
      jeweils andere Rechte benötigen, benötigt man unterschiedliche Syntaxen.

      Mit chmod <irgendwas> kommt man nicht ans Ziel.

      Der Befehl find erweist sich als nützlicher Helfer für rekursive Rechtevergabe.

      Rechteänderung (rekursiv) aller Dateien in einem Verzeichnis:

      Quellcode

      1. find /home/kernelman/beispielordner/ -type f -exec chmod 644 {} \;
      wobei -type <Typ> definiert, welche Art von Datei dem Befehl "chmod" übergeben wird.
      f steht für "normale Datei".
      d für "Verzeichnis"
      l
      für"symbolischer Link"

      Also lautet die Syntax zum Ändern der Rechte aller Verzeichnisse:

      Quellcode

      1. find /home/kernelman/beispielordner/ -type d -exec chmod 755 {} \;


      Gruß

      KM
      openSUSE 13.1-64Bit 3.11.10-7-desktop KDE 4.11.5

      "Linux is user-friendly, it's just a little picky, who his friends really are"


      [SIZE=1]My Jabber: Mein_Nickname hier(at)jabber.ccc.de [/SIZE]

      Quadkonsole - für die, die viel zu tun haben ...

      Weniger ein "Shelltrick" als eher eine "trickreiche Shell" (für KDE-User) ist "Quadkonsole".

      Der Name ist Programm, man hat in einem Fenster vier Konsolen gleichzeitig und vor allem auch gleichzeitig sichtbar zur Verfügung und kann mit "STRG+SHIFT+Pfeiltasten" zwischen den Konsolen navigieren (oder durch einfaches Aktivieren mit der Maus, das Fenster, über dem sich der Mauszeiger befindet, ist automatisch aktiv, auch ohne Klicken).

      Das sieht in voller Aktion dann so aus:



      - Rechts oben die Antwort auf die brennenden Frage "Was hatte ich denn noch mal für ein CD-ROM Laufwerk?"

      - Links oben wird gerade über ein chroot mein Archlinux aus einer laufenden openSUSE 11.0 heraus aktualisiert (chroot ist ne feine Sache)

      - Links unten baut gerade ein neuer Madwifi-Snapshot (nur ein Test, nicht "for production use" gedacht)

      - Rechts unten (last but not least) steht dann übrigens, aus welchen Repositorien man quadkonsole für openSUSE bekommt :)

      Einziger (bisheriger) Wermutstropfen:

      Das Ganze funktioniert zur Zeit leider nur unter KDE 3.5.X (unter Arch mit KDE 4.1.3 gab es Probleme mit der dcop-Schnittstelle), an einer KDE4-Portierung wird aber wohl gearbeitet.

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      AW: Inhalt von Dateien anzeigen.....

      Rain_Maker schrieb:

      cat
      Gut für kleine Dateien.

      2. more
      Überflüssig, denn es gibt
      3. less


      Bei less gibt es viele Möglichkeiten, z.B. mit dem Befehl "/" nach Text suchen, also mit Tippen von
      /txt
      wird nach "txt" gesucht. Vorher kann mit "i" zwischen suchen mit/ohne Berücksichtigung der Groß- und Kleinschreibung umgeschaltet werden.

      Und noch viel mehr ... einfach mal "h" Tippen, um die ausführliche Hilfe von less zu erhalten (und wers nicht in der Hilfe findet: die Hilfe wird mit "q" verlassen).

      Wenn der output eines Programms untersucht werden soll, nehme ich lieber less als grep, vor allem wenn ich nach unterschiedlichen Dingen suche oder nach dem ersten Fund das Suchergebnis verfeinern will ...

      Ein ls -lR | less beispielsweise ist zuweilen ganz praktisch ...

      grep und ls wurden in anderen Beiträgen hier kurz vorgestellt ....

      ffmpeg: Basics (Audio)

      Das Tool "ffmpeg" kann man mit Fug und Recht als "Schweizer Taschenmesser für Datenumwandlung im Bereich Multimedia" bezeichnen.

      Es handelt sich um einen sehr schnellen und sehr mächtigen (und damit auch teilweise mächtig kryptischen) Enkodierer/Dekodierer für die Kommandozeile, der so ziemlich alles aus dem Bereich Multimediadateien in so ziemlich alles Andere umwandeln kann.

      Die Installation von ffmpeg sollte über den Paketmanager erfolgen, aufgrund lizenzrechtlicher Gründe findet man in einigen Distributionen das entsprechende Paket nicht in den offiziellen Repositories der jeweiligen Distribution.

      So bietet z.B. für openSUSE das Packmanprojekt entsprechende Pakete an, für Fedora schaut man sich am besten bei rpmfusion.org um, aber wie man eventuell benötigte Paketquellen einbindet und ffmpeg installiert, soll hier aber nicht Gegenstand des Beitrags sein, hierzu konsultiere man die Dokumentation seiner Distribution.

      Die Grundsyntax von ffmpeg ist eigentlich recht simpel,

      Quellcode

      1. ffmpeg -i <Quelldatei> [Optionen] <Ausgabedatei>


      wobei es eben eine riesige Fülle an diversen Parametern gibt, mit welchen sich Dateiformate, Containerformate, Codecs, Bitraten, etc. pp. sehr fein einstellen lassen.

      Das eigentliche Hauptgebiet für ffmpeg ist die Umwandlung von Videodateien, aber das bedeutet nicht, daß man dieses Werkzeug nicht zur Konvertierung von reinen Audiodateien verwenden kann, im Gegenteil, gerade durch die große Anzahl von Ein- und Ausgabeformaten, stellt ffmpeg hier oft die schnellste Lösung dar, da viele Tools wie z.B. lame (MP3). oggenc (OGG-vorbis), flac (FLAC) oder opusenc (OGG-Opus) gewisse Einschränkungen in Bezug auf das Format der Eingabedatei besitzen.
      So ist es z.B. nicht möglich eine .mp3 mittels oggenc direkt in eine OGG-Vorbis Datei umzuwandeln, da oggenc keine mp3 dekodieren kann und man so einen Zwischenschritt benötigt, der zuerst die .mp3 in eine WAVE-Datei umwandelt (*.wav) um diese dann mittels oggenc zum Zielformat konvertieren zu können.

      Da die Anzahl der Parameter für die Konvertierung von Audiodateien meist geringer als beim Umwandeln von Videos ist, will ich hier mit ein paar entsprechenden Beispielen beginnen, auch um der/den geneigten Leser(in) Beispiele zu liefern, die noch einigermaßen übersichtlich sind.

      Mit ffmpeg ist das Ganze in einem Schritt zu erledigen:

      Quellcode

      1. ffmpeg -i QUELLDATEI.mp3 -vn -c:a libvorbis ZIELDATEI.ogg


      Bedeutung der Parameter:

      - i (Eingabedatei)

      -vn (keine Videospur codieren, hier unnötig, da mp3 kein Video enthalten kann, bei anderen Dateiformaten durchaus wichtig, eine ".ogg" kann sowohl Video als auch Audiodatei sein)

      -c:a (Codec für Audio, äquivalent kann auch "-acodec" verwendet werden. Dabei muss man den genauen Namen der Codecs kennen, hier hilft z.B. der Befehl "ffmpeg -encoders")

      Nun ist dieses Beispiel eher zu simpel, eine oft gewollte Funktion ist das Kodieren mit einer bestimmten Bitrate/Qualität.

      Hier nun ein Beispiel, welches aus meiner Alltagspraxis stammt, da ich öfters Podcasts höre, welche nur in einem proprietären Format und mit IMHO viel zu hoher Bitrate angeboten werden, denn selbst für ein Gespräch mit mehreren Personen brauche ich keine 128KBit MP3-Datei, oft kann man sogar auf Stereo verzichten.

      Quellcode

      1. fmpeg -i QUELLDATEI.mp3 -vn -c:a libvorbis -b:a 64k -f ogg ZIELDATEI.oga


      Was bedeuten die neuen Parameter?

      - b:a (Bitrate für Audio, 64 KBit reichen für Sprache dicke aus)

      -f ogg (Explizite Angabe des Containerformates, sonst beschwert sich ggf. ffmpeg, wenn es anhand der Dateiendung (man beachte, "oga" statt "ogg") keine eindeutige Zuordnung machen kann)

      Das Ganze jetzt noch als 56 KBit ogg-Datei mit nur einem Audiokanal ("Mono"):

      Quellcode

      1. fmpeg -i QUELLDATEI.mp3 -vn -c:a libvorbis -b:a 56k -ac 1 -f ogg ZIELDATEI.oga


      Parameter:

      -ac 1 (Audio Channels 1, also nur ein einziger Audiokanal, vulgo "Mono")

      Wer z.B. einen tragbaren Mediaplayer besitzt, auf welchem sich Rockbox installieren lässt, kann sich auch seine Hörbücher/Podcasts im neuen Ogg-OPUS Format kodieren, welches sich besonders gut für niedrige Bitraten und Sprache eignet und mittlerweile als offizieller, freier Standard für Audio in HTML5 festgelegt wurde.

      Quellcode

      1. fmpeg -i QUELLDATEI.mp3 -vn -c:a libopus -b:a 48k -ac 1 ZIELDATEI.opus


      Wer etwas mutiger ist, kann auch mal "-b:a 32k" versuchen und sich von der (meist) noch erstaunlich guten Qualität überraschen lassen.

      Wie oben angemerkt, ist die Option "-vn" bei einer mp3-Datei als Quelle nicht zwingend notwendig, da .mp3 kein Video enthalten kann, aber es gibt durchaus einen recht häufig in diversen Foren angefragten Anwendungsfall, bei welchem diese Option mit die Wichtigste ist.

      Die typische Frage in diversen Foren lautet in etwa so:

      Wie extrahiert man die Audiospur aus einer Videodatei (und wandelt sie ggf. in $GEWÜNSCHTES_AUDIOFORMAT um)?

      Mit ffmpeg ist das Ganze ein Kinderspiel.

      Quellcode

      1. ffmpeg -i <VIDEODATEI.DATEIENDUNG> -vn -c:a NAME_DES_ENCODERS -b:a GEWÜNSCHTE_BITRATE -f GEWÜNSCHTER_ZIELCONTAINER <AUDIODATEI.DATEIENDUNG>


      Je nach Quelldatei macht es ab und zu keinen Sinn neu zu kodieren, hat man z.B. ein OGG-Theora-Video (*.ogg oder *.ogv) und will die Audiospur als OGG-Vorbis Audio (*.oga oder *.ogg) extrahieren, dann reicht ein einfaches "Herausschnibbeln" der Audiospur ohne erneut zu kodieren, denn der Standard für OGG-Videos sieht für die Audiospur (zwingend?) die Verwendung von OGG-Vorbis als Codec vor.

      Hierzu gibt es einen speziellen Wert für die Wahl des Audiocodecs.

      Quellcode

      1. ffmpeg -i <VIDEO.ogg> -vn -c:a copy -f ogg AUDIO.ogg


      Das "copy" ist eigentlich selbsterklärend, es werden sowohl Audiocodec als auch Audiobitrate genau so übernommen und nur die Audiospur extrahiert, was dann übrigens im Vergleich zum Umkodieren entsprechend schneller von Statten geht.

      Um entscheiden zu können, wann/ob sich das Umkodieren lohnt, wäre nun ein Werkzeug praktisch, mit welchem man Informationen über eine Multimediadatei erhalten kann.

      Hierzu liefert ffmpeg das Tool "ffprobe" mit, die Syntax ist dabei sehr simpel:

      Quellcode

      1. ffprobe <DATEI>


      Und als abschließender Tipp; welche Dateiformate ffmpeg lesen kann, sagt einem übrigens (analog zum Befehl zur Ermittlung der unterstützten Formate für das Ziel) "ffmpeg -decoders".

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      ffmpeg: Mehrere Dateien des selben (sic!) Formats aneinanderhängen ("concat" demuxer)

      Mit ffmpeg kann man auch sehr einfach mehrere Dateien des selben Formats (gleiche Codecs!) zu einer Datei verbinden.

      Ich möchte es nun noch ein drittes Mal betonen, das Ganze klappt nur dann, wenn alle Quelldateien die selben Codecs verwenden, also z.B. mehrere mp3-Dateien zusammengefügt werden sollen.

      Es ist durchaus auch möglich mehrere Dateien unterschiedlichen Formats zusammen zu fügen, dann wird es aber sehr viel komplexer (vielleicht in einem späteren Post, für Neugierige, siehe hier).

      Seit ffmpeg 1.1 kann der sog. "concat" Demuxer verwendet werden, das Ganze ist dann recht simpel:

      Quellcode

      1. ffmpeg -i "concat:DATEI1.mp3|DATEI2.mpg|DATEI3.mpg" -vn -c:a copy ZIELDATEI.mp3


      Oder das Ganze gleich noch mit Umkodieren in eine platzsparende OGG-Opus Datei (48 KBit/s) gefällig?

      Quellcode

      1. ffmpeg -i "concat:DATEI1.mp3|DATEI2.mpg|DATEI3.mpg" -vn -c:a libopus -b:a 48k ZIELDATEI.mp3


      Hier soll es nur um die Basics gehen, ein etwas komplexeres Beispiel sei nur kurz erwähnt und verlinkt.

      Bei vielen Eingabedateien wird das Getippe dann doch etwas mühsam, hier kann man mit einer Dateiliste oder Schleifen arbeiten, wie auf folgender Seite beschrieben:

      trac.ffmpeg.org/wiki/Concatenate

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      Zeitgesteuerte Aufgaben mit systemd nur bei aktiver Netzwerkverbindung starten

      Der folgende, kleine Beitrag soll ein wenig die Möglichkeiten von systemd beleuchten, die über die Standardaufgaben eines init-Systems gehen.

      Aufgabenstellung:

      - Eine bestimmte Aktion soll

      a) direkt nach Herstellen einer Netzwerkverbindung

      b) anschließend in regelmäßigen Abständen

      und

      c) nach Trennen der Verbindung nicht mehr weiter

      ausgeführt werden.

      Zusammen gefasst also eine kleine Mischung aus Pre-/Post-|Up/Down Scripten und Cronjob, allerdings eben mit systemd als Unterbau.

      Als Beispiel habe ich mir dazu die Synchronisation der Systemzeit über einen Zeitserver ausgesucht, da

      a) diese Aufgabe perfekt auf die obigen Anforderungen passt (NTP-Synchronisation ohne Netzwerk macht keinen Sinn und mit Netzwerkverbindung sollte es regelmäßige Updates geben)

      b) ich mit der Implementierung von NTP in YaST nie so ganz zufrieden war (siehe auch diverse Beiträge in diversen Foren, die gerne mal über lange Bootzeiten etc. klagen).

      Zunächst brauchen wir zwei Dateien für systemd, eine ".service" und eine ".timer", am besten mit gleichem Präfix.

      /etc/systemd/system/sntp-timesync.service

      Quellcode

      1. [Unit]
      2. Description=Update time from time server
      3. After=network.target network.service
      4. [Service]
      5. Type=oneshot
      6. ExecStart=/bin/sh -c '/usr/sbin/sntp -t 10 -s ptbtime1.ptb.de || :'


      Kurze Erklärung zum Inhalt (siehe auch "man systemd.service" und "man systemd.unit")

      Description= (selbsterklärend)

      After= (wird erst NACH den hier genannten Diensten/Targets ausgeführt)

      Type=oneshot (für einen einzelnen Befehl/ein Script meist eine gute Wahl, auch hier siehe "man systemd.service")

      ExecStart= (auszuführende Aktion)

      Diese Datei führt die eigentliche Synchronisation durch, die Zeile in "ExecStart" enthält dabei einen kleinen Hack, das "|| :" am Ende sorgt dafür, daß der Aufruf auch bei nicht erfolgreicher Synchronisation mit dem Status "erfolgreich" beendet wird, das ist aber eher Kosmetik, wen eventuelle Meldungen, der Dienst sei fehlerhaft beendet worden, nicht stören, kann das weglassen, dann sieht das so aus:

      Quellcode

      1. [Unit]
      2. Description=Update time from time server
      3. After=network.target network.service
      4. [Service]
      5. Type=oneshot
      6. ExecStart=/usr/sbin/sntp -t 10 -s ptbtime1.ptb.de


      Da es dann nur um einen Befehl geht, kann der Trick mit dem Aufruf über eine eigene Subshell (/bin/sh -c 'BEFEHLE') wegfallen, des weiteren kann man in beiden Fällen statt mit "-s" auch mit "-j" als Parameter für sntp spielen, der Timeout mit "-t 10" liegt bei maximal 10 Sekunden, auch hier kann man ein wenig spielen (siehe "man sntp").

      Natürlich kann man auch einen anderen Zeitserver als "ptbtime1.ptb.de" verwenden, eine Liste von Kandidaten findet man unter openSUSE in der Datei "/usr/share/YaST2/data/ntp_servers.yml", sofern "yast2-ntp-client" installiert ist, ansonsten hilft die Suchmaschine des geringsten Misstrauens sicher weiter.

      Die dazu gehörige .timer-Datei sieht in etwa so aus:

      /etc/systemd/system/sntp-timesync.timer

      Quellcode

      1. [Unit]
      2. Description=Scheduled NTP sync
      3. DefaultDependencies=no
      4. Before=shutdown.target
      5. [Timer]
      6. OnActiveSec=5s
      7. OnUnitActiveSec=15min
      8. [Install]
      9. WantedBy=timers.target


      Da die beiden Dateien (.service/.timer) den selben Präfix "sntp-timesync" tragen, reicht das aus, hat man eine ".timer"-Datei, deren Dateiname nicht zur .service-Datei "passt", dann kann man sie um folgende Zeile erweitern:

      Quellcode

      1. [Unit]
      2. Description=Scheduled NTP sync
      3. DefaultDependencies=no
      4. Before=shutdown.target
      5. [Timer]
      6. OnActiveSec=5s
      7. OnUnitActiveSec=15min
      8. Unit=sntp-timesync.service
      9. [Install]
      10. WantedBy=timers.target


      Man gibt also den Namen der damit verknüpften .service-Datei explizit an.

      Kurze Erläuterung zu den gesetzten Werten in der .timer-Datei

      Description= (selbsterklärend)

      EDIT:

      Da nutzt man den Kram testweise eine Woche und alles geht glatt, aber kaum postet man das in ein Forum, gibt es kurz darauf zum ersten Mal Ärger damit. *grml*

      Ohne die beiden nächsten Parameter bleibt in wenigen Fällen (ifup, Startmode ifplugd/auto, Kiste hängt aber nicht am Netz und ein Interface "baumelt" ohne aktive Verbindung in der Luft) das System beim Herunterfahren stecken, deshalb die beiden Parameter:

      DefaultDependencies=no (das ist mehr zur Sicherheit, damit nicht $ANDERER_DIENST auf das Beenden des Timers warten muss)

      Before=shutdown.target (Dienst _UNBEDINGT_ vor dem Shutdown stoppen, dann geht alles glatt)

      EDIT Ende

      OnActiveSec=5s (Nach Aktivieren des Timers durch systemd wird 5 Sekunden gewartet und dann der damit verknüpfte Dienst (sntp-timesync.service) gestartet)

      OnUnitActiveSec=15min (Nach Aktivieren des Timers durch systemd wird alle 15 Minuten der damit verknüpfte Dienst (sntp-timesync.service) gestartet)

      Der Teil mit

      Quellcode

      1. [Install]
      2. WantedBy=timers.target


      ist hier eigentlich unnötig, da der Dienst nur bei Bedarf aktiviert werden soll (nach Aufbau einer Netzwerkverbindung).

      Wer allerdings den obigen Dienst immer laufen lassen kann ("Standleitung" anyone?) und sich die weiteren Schritte ersparen will, der kann mit diesem Eintrag den Dienst mittels "systemctl enable sntp-timesync.timer && systemctl start sntp-timesync.timer" dauerhaft aktivieren und starten (ohne "Install"-Sektion ginge das nicht).

      Unter openSUSE legen wir nun ein Script unter /etc/sysconfig/network/scripts ab, welches nach Aufbau und Abbau einer Netzwerkverbindung die Dienste startet oder stoppt.

      /etc/sysconfig/network/scripts/sntp-timer

      Shell-Script

      1. #!/bin/bash
      2. #
      3. case "$0" in
      4. *scripts/sntp-timer)
      5. case $1 in
      6. start)
      7. /usr/bin/systemctl start sntp-timesync.timer
      8. ;;
      9. stop)
      10. /usr/bin/systemctl stop sntp-timesync.timer
      11. ;;
      12. status)
      13. /usr/bin/systemctl status sntp-timesync.timer
      14. ;;
      15. restart)
      16. /usr/bin/systemctl restart sntp-timesync.timer
      17. ;;
      18. try-restart)
      19. /usr/bin/systemctl try-restart sntp-timesync.timer
      20. ;;
      21. *)
      22. echo "don't know what to do" >&2 ;;
      23. esac
      24. ;;
      25. #
      26. # ifup /etc/sysconfig/network/if-{up,down}.d/ script part;
      27. # start or stop sntp-timesync.timer
      28. #
      29. (*if-up.d*)
      30. /usr/bin/systemctl start sntp-timesync.timer
      31. ;;
      32. (*if-down.d*)
      33. /usr/bin/systemctl stop sntp-timesync.timer
      34. ;;
      35. *) echo "don't know what to do" >&2 ;;
      36. esac


      Wie das für $ANDERE_DISTRO geeignet ist, entnehme man der Dokumentation der entsprechenden Distro, das im weiteren Verlauf beschriebene Einbinden bei der Verwendung von NetworkManager dürfte hingegen distrounabhängig sein.

      - Einbindung in die klassische Methode mit ifup (openSUSE)

      Quellcode

      1. su -
      2. (Passwort eingeben)
      3. ln -sf ..scripts/sntp-timer /etc/sysconfig/network/if-up.d/
      4. ln -sf ../scripts/sntp-timer /etc/sysconfig/network/if-down.d/


      und das war es dann auch schon.

      - Einbinden in NetworkManager

      Hier verwenden wir den "dispatcher"-Mechanismus von NetworkManager

      /etc/NetworkManager/dispatcher.d/sntp-timesync

      Quellcode

      1. #! /bin/sh
      2. #
      3. case "$2" in
      4. up)
      5. /etc/sysconfig/network/scripts/sntp-timer start
      6. exit 0
      7. ;;
      8. down)
      9. /etc/sysconfig/network/scripts/sntp-timer stop
      10. exit 0
      11. ;;
      12. *)
      13. exit 0
      14. ;;
      15. esac


      Logischerweise ist der Pfad "/etc/sysconfig/network/scripts" bei anderen Distros ggf. anzupassen.

      Wer prüfen will, ob das Ganze klappt, der kann in einem Terminal

      Quellcode

      1. watch -n1 "systemctl status sntp-timesync.service sntp-timesync.timer"


      eingeben und dann die Ausgabe beobachten, während man munter Netzwerkverbindungen aufbaut/trennt.

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      Zwei kurze Tipps zu Flash und/oder HTML5

      Disclaimer: Flash ist eine digitale Seuche und man sollte sie so oft wie möglich vermeiden, bis sie dann endlich vollständig ausgerottet ist.

      Tipp 1: Auf einem bekannten Videoportal HTML5 statt Flash erzwingen

      Wer einen HTML5-fähigen Browser hat (oder testen will, ob ein Browser es beherrscht), der kann bei Videos auf Youtube mit einem einfachen Zusatz zur URL erzwingen, daß HTML5 zuerst versucht wird.

      Angenommen, man hat einen Link der Art

      Quellcode

      1. https://www.youtube.com/watch?v=IRGENDEINE_ZEICHENFOLGE


      so kann man durch Anfügen von "&html5=True", also durch die URL

      Quellcode

      1. https://www.youtube.com/watch?v=IRGENDEINE_ZEICHENFOLGE&html5=True


      die Verwendung von HTML5 erzwingen.

      Auch wenn das nicht immer klappt, einen Versuch ist es auf jeden Fall wert.

      Tipp 2: Flash und Pulseaudio

      Wer Pulseaudio verwendet (ein "pidof pulseaudio" sagt mehr) erlebt manchmal eine Überraschung beim Verhalten des Lautstärkereglers.

      Auf einem von mir betreuten System reagierte Flashplayer nicht wie erwartet auf Änderungen des "normalen" Lautstärkereglers und manchmal kam gar kein Ton aus den Boxen.

      Des Rätsels Lösung:
      Flash verwendete als Ausgabemodul Alsa und nicht Pulseaudio, soll heißen, sofern ein anderer Prozess gerade auf Pulseaudio zugegriffen hatte, blockierte Pulseaudio die Ausgabe direkt über Alsa (das ist kein Bug, sondern Sinn und Zweck von Pulseaudio die "Herrschaft" zu übernehmen), hatte jedoch lange genug zuvor kein anderer Prozess Zugriff auf Pulseaudio (und der Pulseaudiodaemon "schlief" deshalb), so hatte aber dann logischerweise auch der Lautstärkeregler, welcher eigentlich die Ausgabe von Pulseaudio steuern sollte, keine Auswirkung auf die Lautstärke des Flashplayers, da dieser ja "direkt" über Alsa Sound ausgab.

      Wenn man schon Pulseaudio nutzt, dann macht es auch Sinn möglichst alle Anwendungen durch Pulseaudio zu "quetschen", im Fall des Flashplayers erzielt man diesen Effekt über eine Umgebungsvariable.

      Man fügt die Zeile

      Quellcode

      1. export FLASH_FORCE_PULSEAUDIO=1


      in die passende Datei ein, in Frage kommen entweder /etc/profile (bzw. falls vorhanden und z.B. unter openSUSE die bessere Wahl /etc/profile.local)als globale Einstellung für alle User oder $HOME/.profile als Einstellung für den einzelnen User (diese Datei muss ggf. angelegt werden).

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

      "udev-Magie" statt Blacklisten: "ENV_MODALIAS" für die Zuordnung eines Treibers zu einem bestimmten Gerät

      Man kennt wahrscheinlich die entsprechenden Ratschläge aus diversen Forenbeiträgen.

      "Wenn Du $GERÄT mit $ANDEREM_TREIBER verwenden willst, dann blackliste $STANDARDTREIBER und gut ist."

      Prinzipiell oft eine einfache und gute Lösung, aber es kann auch zu Problemen führen.

      Nehmen wir an, man hat mehrere Devices, die unterschiedliche IDs haben, aber den selben Standardtreiber benutzen, wobei eines der Devices aber nicht ordentlich mit diesem funktioniert, die anderen dagegen schon. Dann führt das Blacklisten des Standardtreibers dazu, daß dieser für keines der Geräte mehr automatisch geladen wird und beim händischen Laden kloppen sich dann zwei Treiber um das selbe Device.

      Hier mal ein (praxisrelevantes) Beispiel:

      Bis Kernel 3.14 wurden WLAN-Karten mit der PCI-ID 10EC:8199 (Realtek) vom Treiber "r8187se" aus dem "Staging"-Zweig unterstützt. Dieser "Staging"-Treiber funktionierte so weit eigentlich ganz gut, aber gerade im Bereich WLAN wird seit Jahren versucht alles auf einen einheitlichen "Unterbau" (WLAN-Stack) zu bekommen. Im Linuxkernel befinden sich daher "ordentliche" Treiber für WLAN, welche auf mac80211 basieren und sämtliche neuen Treiber werden auf dieser Basis geschrieben.

      Bei vielen anderen "Staging"-Treibern wurde daran gearbeitet, entweder eine mac80211-basierte Variante davon zu schreiben oder den Code in einen bereits vorhandenen mac80211-basierten Treiber zu integrieren, so auch bei obigem Treiber, dessen gerätespezifischer Code in "rtl818x_pci" integriert wurde und ab Kernel 3.15 wurde der alte "Staging"-Treiber aus dem Kernel entfernt.

      So weit, so plausibel, aber dummerweise hat das Ergebnis noch mit so mancher Kinderkrankheit (schlechte Signalstärke, Verbindungsabbrüche etc.) zu kämpfen. Das wird zwar aller Voraussicht nach mit jedem neuen Kernel besser werden, aber wer auf einer Distribution unterwegs ist, die bei der selben Kernelversion bleibt (openSUSE, Debian, *Buntu), der hat zunächst einmal verloren (openSUSE 13.2 hat z.B. einen 3.16er Kernel).

      Bis also die Kinderkrankheiten überstanden sind, wäre es nicht schlecht, den "alten" Treiber auch auf Kerneln > 3.14 verwenden zu können, darum kümmert sich z.B. dieses Projekt hier:

      github.com/freestyl3r/rtl8187se

      Und hier nun das Beispiel aus der Praxis:

      Ein Bekannter von mir hat genau diese Karte in seinem Laptop verbaut, bis zu seinem letzten OS-Upgrade lief sie mit r8187se auch ganz ordentlich, danach mit einem Kernel > 3.14 gingen die Probleme los.

      Da er aber auch noch eine PCMCIA WLAN-Karte besitzt, hat er zunächst diese verwendet, alles war OK und wie es der Zufall so wollte, lief diese Karte mit dem Treiber "rtl818x_pci". Nachdem ich ihm (per Chat) geholfen hatte den "alten" Treiber für seine Kernelversion zu bauen und zu installieren, wurde rtl818x_pci geblacklisted, die eingebaute Karte lief wieder wie gewohnt und mit der Steckkarte ging dann logischerweise nichts mehr.

      Das wäre jetzt zwar als Lösung gut genug gewesen, aber dann packt einen doch der Ehrgeiz, ob das nicht auch etwas sauberer geht und ich würde hier nicht schreiben, wenn dem nicht so wäre.

      Schauen wir uns kurz an, was "modinfo" zu den beiden Treibern zu sagen hat:

      Quellcode

      1. modinfo r8187se | grep 8199
      2. alias: pci:v000010ECd00008199sv*sd*bc*sc*i*
      3. modinfo rtl818x_pci | grep 8199
      4. alias: pci:v000010ECd00008199sv*sd*bc*sc*i*


      Damit ist auch klar, wieso sich beide Treiber zuständig fühlen, der rtl818x_pci unterstützt aber noch weitere Geräte:

      Quellcode

      1. modinfo rtl818x_pci | grep alias
      2. alias: pci:v00001432d00007106sv*sd*bc*sc*i*
      3. alias: pci:v00001186d00003301sv*sd*bc*sc*i*
      4. alias: pci:v00001186d00003300sv*sd*bc*sc*i*
      5. alias: pci:v00001799d00006020sv*sd*bc*sc*i*
      6. alias: pci:v00001799d00006001sv*sd*bc*sc*i*
      7. alias: pci:v000010ECd00008180sv*sd*bc*sc*i*
      8. alias: pci:v00001799d0000701Fsv*sd*bc*sc*i*
      9. alias: pci:v00001799d0000700Fsv*sd*bc*sc*i*
      10. alias: pci:v000010ECd00008185sv*sd*bc*sc*i*
      11. alias: pci:v000010ECd00008199sv*sd*bc*sc*i*


      Wer also zusätzlich irgendein anderes Gerät aus der Liste für rtl818x_pci besitzt, der sägt sich mit dem Blacklisten von rtl818x_pci die Unterstützung für dieses Gerät praktisch ab.

      Es wäre also wünschenswert, wenn man es so hinbiegen könnte, daß für Geräte mit der ID 10EC:8199 der Treiber r8187se bevorzugt geladen wird ohne rtl818x_pci auf die Blacklist setzen zu müssen.

      Dies lässt sich mit einer einfachen udev-regel erreichen, genauer mit der (Umgebungs)Variablen "ENV{MODALIAS}":

      /etc/udev/rules.d/99-r8187se.rules

      Quellcode

      1. ENV{MODALIAS}=="pci:v000010ECd00008199sv*sd*bc*sc*i*", ENV{MODALIAS}="r8187se"


      Man beachte dabei die unterschiedliche Anzahl der Gleichzeichen, das doppelte in

      ENV{MODALIAS}=="pci:v000010ECd00008199sv*sd*bc*sc*i*"

      bedeutet "wenn Bedingung erfüllt", also die Variable diesen Wert wirklich hat; das einfache in

      ENV{MODALIAS}="r8187se"

      bedeutet "dann weise der Variablen den folgenden Wert zu".

      Also wieder der typische Aufbau einer udev-Regel, nach dem Motto "WENN $Bedingung(en), DANN $Aktion".

      Danach konnte der Backlisteintrag gelöscht werden und beide Karten funktionierten wie gewünscht, die eingebaute mit dem Treiber "r8187se", die andere mit "rtl818x_pci".

      Greetz,

      RM
      "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

      Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

      openSUSE Leap 42.3 - Kernel 4.19.x - fluxbox 1.3.7

      Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K