Jap, das ist deutlich besser. Achte bei pydbus allerdings darauf, dass bei Eingabe von Dictionarys und co. evtl. mit pydbus.GVariant erst ein bisschen was drumrum verpacken musst. Da gilt es auf die Datentypen zu achten, die der NetworkManager hier vorsieht.
Im Zweifel erst mal krachen lassen und gucken, was er als Typ erwartet, und danach den GVariant bauen.
Der Code-Schnippsel-Thread
-
-
Bash
Alles anzeigen#!/bin/bash set -e ZONEFILE="/etc/nsd/zones/secure-cdn.zone" ENDPOINTS="/etc/secure-cdn-endpoints.list" MAX_DIRECT=20 today="$(date +%Y%m%d)" [ -r "$ZONEFILE" ] && serialno="$(awk '/^@ IN SOA/ {print $6 + 1}' "$ZONEFILE")" [[ "$serialno" =~ ^"$today" ]] || serialno="${today}01" new_zone="$(mktemp)" trap 'rm -f "$new_zone"' EXIT echo ";; created by $0 "'$ORIGIN secure-cdn.dosamp.net. $TTL 30m '"@ IN SOA ceres.dosamp.net. maulwurfhuegel.dosamp.net. $serialno 6h 15m 7d 5m "'@ IN NS ceres.dosamp.net. @ IN MX 0 .' > "$new_zone" nmap -n -p 443 --open -oG - -iL "$ENDPOINTS" | \ awk '/open\/tcp/ { print $2 }' | shuf | \ awk -v "total_hosts=$(wc -l < "$ENDPOINTS")" -v "max_direct=$MAX_DIRECT" \ 'NR<=max_direct { print "@ IN A " $1 } { printf("%x IN A %s\n", NR, $1) } END { print "_count IN TXT \"" NR "\""; print "_bad IN TXT \"" (total_hosts - NR) "\"" }' >> "$new_zone" cp "$ZONEFILE" "${ZONEFILE}.old" cp "$new_zone" "$ZONEFILE" if systemctl is-active --quiet nsd.service; then kill -HUP "$(</run/nsd/nsd.pid)" fi
Shell-/Awk-Skript für eine automatisch generierte DNS-Zone (mit DNSSEC müsste man an dieser Stelle noch signieren).
-
VBScript, das einen Datums-Befehl in der Form date MMTThhmmJJJJ.ss plus ENTER ausgibt, wie dieser von den GNU coreutils erwartet wird. Anwendungsfall ist z. B. ein Raspberry Pi oder ähnlicher Einplatinencomputer ohne Echtzeituhr, der ohne Internetverbindung betrieben wird, aber von einem anderen Computer aus wenigstens ungefähr sekundengenau nachgestellt werden soll (das Konstrukt ⌈Timer⌉−Timer, wobei Timer für die verstrichenen Sekunden des Tages mit Nachkommastellen steht, sorgt in etwa dafür, dass bis zum Beginn einer vollen Sekunde gewartet wird).
Code
Alles anzeigenOption Explicit Function PositiveCeil(FloatNo) PositiveCeil = Int(FloatNo) If PositiveCeil < FloatNo Then PositiveCeil = PositiveCeil + 1 End If End Function Dim WshShell, sleeptime, unixtime, unixstr, secondstr Set WshShell = WScript.CreateObject("WScript.Shell") sleeptime = Int(1000*(PositiveCeil(Timer())-Timer())-100) If sleeptime > 0 Then WScript.Sleep sleeptime End If unixtime = Now() Rem MMddHHmmyyyy.ss unixstr = CStr(Year(unixtime) + 10000 * Minute(unixtime) + 1000000 * Hour(unixtime) + 100000000 * Day(unixtime) + 10000000000 * Month(unixtime)) If Month(unixtime) < 10 Then unixstr = "0" & unixstr End If If Second(unixtime) < 10 Then secondstr = "0" & Second(unixtime) Else secondstr = CStr(Second(unixtime)) End If unixstr = unixstr & "." & secondstr WshShell.SendKeys "%{TAB}" WScript.Sleep 100 WshShell.SendKeys "date " & unixstr & "~"
Ähnlich, aber nur in geänderter Reihenfolge verfährt man bei einem BSD-System, wo der Befehl das Datum in der mehr am internationalen Standard angelehnten Form JJJJMMTThhmm.ss akzeptiert.
Zeile 19 sollte dann wie folgt aussehen, Zeile 20-22 fallen dann weg: -
Nichts wildes, aber evtl für manche praktisch. Schnell nachschauen, wie viel man bei einer bestimmten Länge Tonband bei den üblichen Geschwindigkeiten aufnehmen kann:
Bash
Alles anzeigen#!/bin/bash meter=${1} precision=2 # How much after decimal point c_b='\e[1m' c_u='\e[4m' c_y='\033[1;33m' c_n='\033[0m' if test -z "${meter}" then echo -e "Please use the syntax ${c_b}$(basename ${0})${c_n} ${c_y}meter${c_n}" echo -e "Example: ${c_b}$(basename ${0})${c_n} ${c_y}549${c_n}" exit 1 fi function calculate() { echo "scale=${precision}; ${*}" | bc } function mins() { speedcms="${1}" speedms=$(calculate "${speedcms}/100") minutes=$(calculate "${meter}/${speedms}/60") echo ${minutes} } echo -e "${c_b}${c_u}Your tape with ${c_y}${meter}${c_n}${c_b}${c_u} meters can store:${c_n}" for speed in 4.75 9.50 19.00 38.00 76.00 do echo -e "On ${speed}: ${c_b}$(mins ${speed})${c_n} minutes of audio" done
-
Ich hatte hier einen Ordner mit 360 Bildern, wo jeweils die obersten 26 Pixel abgeschnitten werden sollten, sprich oben ein kleines Stück wegschneiden. Das ist wieder ein schönes Beispiel für Dinge, die auf der Kommandozeile viel viel komfortabler gehen als mit jeder GUI. Ein Befehl und beliebig viele Dateien werden abgearbeitet:
Benötigt installiertes ImageMagick.
-
mach ich per batch Verarbeitung in Paintshop auch in Sekunden
-
Warum soll ich dafür so ein Koloss wie Photoshop installieren, wenn das wenige Kilobyte große Imagemagick das und alle möglichen anderen Bildbearbeitungssachen genauso gut kann? Wíll ja keine detaillierte Retusche machen, sondern nur was croppen, dafür brauche ich doch keine GUI.
-
es hat sich so gelesen als würde man nur per Konsole effizient arbeiten können, das wollte ich nur wiederlegen, natürlich gebe ich dir Recht das wenn man so etwas nicht oft mach die Konsole ausreicht
-
es hat sich so gelesen als würde man nur per Konsole effizient arbeiten können, das wollte ich nur wiederlegen, natürlich gebe ich dir Recht das wenn man so etwas nicht oft mach die Konsole ausreichtDas hast du genau genommen eigentlich nicht widerlegt, sondern nur dargestellt, dass man auch mit anderen Mitteln einen Automatismus herstellen kann. Gerade wenn man etwas oft macht ist ja eben die "Batch Verarbeitung" (= Schleife/Map-Funktion) das Mittel der Wahl. Egal, mit welchem Werkzeug.
Und wie shadowtux schon richtig gesagt hat geht's hier um Pixelschubsen einfachster Güte, da brauchts wahrlich kein Editor sondern lediglich ein Werkzeug für genau das. -
-
-
Mal wieder ein "nichts wildes, aber evtl mal ganz nett wenn man die Syntax davon sucht":
Bash
Alles anzeigen#!/bin/bash command=${1} if test "${command}" = "mute" ; then pactl set-sink-mute 0 toggle else if pacmd list-sinks | grep -i "muted: yes" >/dev/null ; then pactl set-sink-mute 0 toggle fi if test "${command}" = "higher" ; then pactl set-sink-volume 0 +10% elif test "${command}" = "lower" ; then pactl set-sink-volume 0 -10% fi fi
Nimmt als Parameter higher, lower oder mute und setzt die Lautstärke entsprechend in Pulseaudio. Kannn man zum Beispiel Tastenkombis drauf zeigen lassen für Lautstärkebuttons. -
Code
Alles anzeigen@echo off :a color 2 echo 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 1 ping localhost -n 1 > nul echo 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 echo 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 ping localhost -n 1 > nul echo 1 1 1 0 0 0 0 1 1 1 0 1 3 1 0 0 0 4 F 1 1 1 1 5 0 0 0 1 1 1 0 1 0 1 0 1 0 2 1 ping localhost -n 1 > nul echo 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 echo 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 echo 1 1 1 0 0 0 0 1 1 1 0 1 3 1 0 0 0 4 F 1 1 1 1 5 0 0 0 1 1 1 0 1 0 1 0 1 0 2 1 ping localhost -n 1 > nul echo 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 echo 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 goto a
das ergibt nen Fake Matrix Bildschirm
-
Ein Freund bat mich um Rat: Knapp 1400 Zeilen einer Senderliste sollten nach einem bestimmten Schema zugeschnitten werden. Beispiel-Datensatz:
#SERVICE 4097:0:1:2:0:0:0:0:0:0:https%3a//admin%3aHalloWHF@spielt.keinerolle.ch/stream/channelid/787394218[color=#FF0000]?ticket=1A65EC926EBE4EABBE8705321D943411FF46EE02&profile=pass:[/color]1 FL TV#DESCRIPTION 1 FL TVDer rot markierte Teil sollte entfernt werden. Ich habe nicht lange überlegt und eine Quick-and-Dirty-Workaroundlösung in bash zusammengezimmert.
Bash
Alles anzeigen#!/bin/bash finfile="${1%.txt}_final.txt" if ! test -f "${1}" ; then echo "file missing.." ; fi if test -f $finfile ; then rm $finfile ; fi while read line ; do if echo $line | grep DESCRIPTION ; then echo $line >> $finfile elif echo $line | grep NAME ; then echo $line >> $finfile else str1=$(echo $line | cut -d "?" -f 1) str2=$(echo $line | cut -d "?" -f 2 | cut -d "=" -f 3 | cut -d ":" -f 2) echo "${str1}:${str2}" >> $finfile fi done < $1
Mir ist klar, dass man da EINIGES optimieren kann. Alleine schon, die Zwischenstrings nicht erst in Variablen zu packen, sondern das Ganze direkt in EINEM Rutsch auszugeben. Aber wie gesagt, das war nur eine Quick and Dirty-Workaroundlösung und so sparte er sich eine Menge Arbeit, diese Strings jeweils von Hand zu cutten.
Nur aus Interese: Vielleicht hat ja jemand eine Idee, wie mans schöner machen könnte? Ich habe jetzt einfach mal aus dem Kopf ein bisschen coreutils-Grundlagen rungeschrieben, hatte nicht die Zeit um weitergehende Parameter/Optionen in den Manpages zu recherchieren.
-
-
Uff, jetzt sag nicht, dass mein gesamtes Script durch einen einzigen Regexp ersetzt werden kann.. Heftig, danke!
Allerdings hat diese Variante einen Haken: Sie funktioniert nur mit der GNU-Version von sed, mit der BSD-Variante (etwa vom Mac) gibt es kein -r. Wobei man das sicher noch anpassen kann.
Ich muss unbedingt mal Regexp lernen irgendwann, ist schon geil was damit geht!
-
Ich habe diese Regular Expression auf meinem Mac erzeugt unter Big Sur mit einer BSD Version von sed und bei mir funktioniert das.
-r und -E sind gleichwertig bei BSD sed, aber nur -r funktioniert auf beiden.Für einen Überblück über Regex, kann ich nur das hier empfehlen: https://laracasts.com/series/underst…lar-expressions
-
Interessant, dann hat sich zwischen Catalina und Big Sur die Syntax von sed geringfügig geändert. Danke für die Info!
-
Hab mal was gebastelt.
Bash
Alles anzeigen#!/bin/bash echo "############################################" echo "############################################" echo "# Backup-Script #" echo "# Author: tk1908 #" echo "# E-Mail: tk1908@tkbrew.net #" echo "# #" echo "############################################" echo "############################################" OS=$(uname) case $OS in Linux) ROOTPATH = "/mnt";; Darwin) ROOTPATH = "/Volumes";; esac HOSTS=(krypton keppler tesla) #SHARES=(applications backups documents games misc movies music pictures series) SHARES=( $(showmount -e krypton |cut -d " " -f1 | sed '1d') ) # Gedankengang! Nicht prod. Reines dev. echo "Migrate from Data from krypton to xenon01" echo "Making Directorystructure and mounting shares" for HOST in ${HOSTS[*]} do sudo mkdir $ROOTPATH/$HOST/ done for SHARE in ${SHARES[*]} do sudo mkdir $ROOTPATH/$HOST/$SHARE/ mount $HOST$SHARE done done echo mounting SHARES sudo mount $HOST[] function tier2_Backup { rsync -rvu $ROOTPATH/$HOSTS[0]/documents/ $ROOTPATH/$HOSTS[1]/documents rsync -rvu $ROOTPATH/$HOSTS[0]/hoerspiele/ $ROOTPATH/$HOSTS[1]/hoerspiele rsync -rvu $ROOTPATH/$HOSTS[0]/music/ $ROOTPATH/$HOSTS[1]/music rsync -rvu $ROOTPATH/$HOSTS[0]/pictures/ $ROOTPATH/$HOSTS[1]/pictures rsync -rvu $ROOTPATH/$HOSTS[0]/videos/ $ROOTPATH/$HOSTS[1]/videos } function tier3_Backup { rsync -rvu $ROOTPATH/$HOSTS[1]/applications/ $ROOTPATH/$HOSTS[2]/applications rsync -rvu $ROOTPATH/$HOSTS[1]/documents/ $ROOTPATH/$HOSTS[2]/documents rsync -rvu $ROOTPATH/$HOSTS[1]/games/ $ROOTPATH/$HOSTS[2]/games rsync -rvu $ROOTPATH/$HOSTS[1]/hoerspiele/ $ROOTPATH/$HOSTS[2]/hoerspiele rsync -rvu $ROOTPATH/$HOSTS[1]/misc/ $ROOTPATH/$HOSTS[2]/misc rsync -rvu $ROOTPATH/$HOSTS[1]/music/ $ROOTPATH/$HOSTS[2]/music rsync -rvu $ROOTPATH/$HOSTS[1]/videos/Filme $ROOTPATH/$HOSTS[2]/movies rsync -rvu $ROOTPATH/$HOSTS[1]/videos/Serien $ROOTPATH/$HOSTS[2]/series } echo cleaning sudo umount $SOURCEMOUNTPATH sudo umount $TARGETMOUNTPATH sudo rm -rf /mnt/*
Aktuell suche ich noch nach einer Möglichkeit, dein Output von showmount -e <hostname> so zu parsen, dass ich ihn als Input für meinen Mount-Befehl nutzen kann. Cutten kann ich den Output schon, aber irgendwas ist da noch schief. Vielleicht hat von euch ja jemand ne Idee.
-
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!