
Der Code-Schnippsel-Thread
-
-
Bash
Alles anzeigen#!/bin/bash while true do parse_uevent=' { split($0,a,"="); split(a[2],b," "); switch (a[1]) { case "POWER_SUPPLY_NAME": $5 = "BAT0" break case "POWER_SUPPLY_TECHNOLOGY": $5 = "Li-ion" break case "POWER_SUPPLY_MANUFACTURER": $5 = "SANYO" break case /POWER_SUPPLY_MODEL_NAME|POWER_SUPPLY_SERIAL_NUMBER/: $5 = a[3] "/" b[1] break case "POWER_SUPPLY_STATUS": if (a[3] == "Charging" || b[1] == "Charging") { $5 = "Charging" break } if (a[3] == "Discharging" || b[1] == "Discharging") { $5 = "Discharging" break } if (a[3] == "Full" || b[1] == "Full") { $5 = "Full" break } if (a[3] == "Unknown") { $5 = b[1] if (b[1] == "Unknown") $5 = "Full" break } case "POWER_SUPPLY_CAPACITY": $5 = (a[3] + b[1]) / 2; $5 = $5 > 100 ? 100 : $5 break case "?": default: $5 = (a[3] + b[1]) / 2; break }; print a[1] "=" $5; } ' paste /sys/class/power_supply/BAT{0..1}/uevent \ | awk "$parse_uevent" \ > $HOME/.uevent sleep 5 done
Neu: Zwei Akkus im T450(s) unter i3status. Mein altes Skript ist unbrauchbar geworden.
-
Code
Alles anzeigen#!/usr/bin/env python3 import os, random, time import dbus, NetworkManager as nm, requests LOGIN_URL = "http://www.wifionice.de/?login" REFERRER = "http://www.wifionice.de/" CONNECTION_UUID = "8b82d562-eb9c-4f76-8a32-41f3228e8f13" INTERFACE = "wlan0" def random_hostname(): randlet = [] # NetBIOS-Namen sind maximal 15 Zeichen lang for i in range(12): randlet.append(random.randrange(0x61, 0x7b)) # Windows-Zufallshostnamen hören auf "-PC" auf return "".join(map(chr, randlet)) + "-pc" def random_mac_address(): randbytes = bytearray(os.urandom(6)) # Individual Address, Locally Administered Address randbytes[0] = (randbytes[0] & 0xfc) | 0x02 return ":".join(map(lambda b: "{:02X}".format(b), randbytes)) if nm.NetworkManager.state() == nm.NM_STATE_CONNECTED_GLOBAL: print("Internet-Verbindung besteht bereits!") exit(0) print("Setze zufällige MAC-Adresse und Hostnamen...") connection = nm.Settings.GetConnectionByUuid(CONNECTION_UUID) conn_settings = connection.GetSettings() conn_settings["802-11-wireless"]["cloned-mac-address"] = random_mac_address() conn_settings["ipv4"]["dhcp-hostname"] = random_hostname() connection.Update(conn_settings) print("Verbinde mit Netzwerk...") interface = nm.NetworkManager.GetDeviceByIpIface(INTERFACE) active_connection = nm.NetworkManager.ActivateConnection(connection, interface, dbus.ObjectPath("/")) while active_connection.State != nm.NM_ACTIVE_CONNECTION_STATE_ACTIVATED: time.sleep(5) print("Logge ein...") resp = requests.get(LOGIN_URL, allow_redirects=False, headers={"Referer": REFERRER}) if resp.status_code == 302: if resp.headers["Location"] == "/": print("Login erfolgreich!") else: print("Login fehlgeschlagen! (Fehlerseite: {})".format(resp.headers["Location"])) exit(1) elif resp.status_code == 200: # sollte nicht passieren, ist aber auch nicht tragisch pass else: print("Login fehlgeschlagen! (Fehlercode: {})".format(resp.status_code))
D-Bus ist Krampf.
-
Und wozu braucht man Zufalls-Hostnamen?
-
Und wozu braucht man Zufalls-Hostnamen? -
Und wozu braucht man Zufalls-Hostnamen?Hotspots. Umgehen von Limits.
-
Mehrere Akkus im Notebook und Polybar-User? Dieses Script von mir schafft Abhilfe:
Bash
Alles anzeigen#!/bin/bash count=$(acpi -b | wc -l) sum=$(acpi -b | egrep -o '[0-9]{1,3}%' | tr -d '%' | xargs -I% echo -n '+%') #https://github.com/jaagr/polybar/issues/312 average=$(( sum / count )) if acpi -b | grep -i until > /dev/null then icon="" else if [ "${average}" -lt 25 ]; then icon=""; fi if [ "${average}" -gt 25 ] && [ "${average}" -lt 90 ]; then icon=""; fi if [ "${average}" -gt 90 ] ; then icon=""; fi fi echo "${icon} ${average}%"
-
Das Skript führt zu irreführenden Ergebnissen, wenn man Akkus mit signifikant unterschiedlichen Kapazitäten verbaut hat (z. B. kleiner eingebauter Überbrückungs-Akku + normaler Akku oder normaler Akku + großer im Erweiterungsschacht). Es macht mehr Sinn, den gesamten Ladestand aller Akkus zu berechnen:
Bash
Alles anzeigen#!/bin/bash total_charge=0 total_full=0 # anpassen, falls Batterien abweichende ACPI-Namen haben for battery in /sys/class/power_supply/BAT*; do total_charge=$((total_charge + $(<$battery/energy_now))) total_full=$((total_full + $(<$battery/energy_full))) done # da beide Werte in Mikrowattstunden angegeben sind, verlieren wir hier keine # nennenswerte Präzision; ist dennoch genauer als eine Prozentsumme geteilt # durch eine kleine Ganzzahl average=$((total_charge / (total_full / 100))) #echo $average%
-
Danke für den Hinweis!
Neue Version:
Bash
Alles anzeigen#!/bin/bash total_charge=0 total_full=0 for battery in /sys/class/power_supply/BAT* do total_charge=$((total_charge + $(<$battery/energy_now))) total_full=$((total_full + $(<$battery/energy_full))) done average=$((total_charge / (total_full / 100))) if acpi -b | grep -i until > /dev/null then icon="" else if [ "${average}" -lt 25 ]; then icon=""; fi if [ "${average}" -gt 25 ] && [ "${average}" -lt 90 ]; then icon=""; fi if [ "${average}" -gt 89 ] ; then icon=""; fi fi echo "${icon} ${average}%"
-
Uhr für die Kommandozeile:
Selbst dieser Code-Schnippsel ist nicht ganz portabel, da außer mksh kaum eine Shell standardmäßig (bash kann Builtins nachladen) ein eingebautes sleep hat und das sleep-Programm auf NetBSD z. B. die Locale beachtet und mit entsprechender Umgebung als sleep 0[b],[/b]5 aufgerufen werden muss. -
Oder einfach den watch-Befehl aus den coreutils nutzen:
watch date -
D-Bus ist Krampf.D-Bus ist verdammt easy und funzt ziemlich gut. Tipp: Nutze bitte weder Python-dbus noch python-NetworkManager, die nutzen intern libdbus und die ist verdammt buggy und ein einziger Krieg. Stattdessen kann ich pydbus sehr empfehlen.
-
Stattdessen kann ich pydbus sehr empfehlen.Danke, python-networkmanager ist sowieso nur ein sehr dünner Wrapper für letzteres, da kann ich gewissermaßen D-Bus gleich „roh“ bedienen bzw. in mein eigenes Modul verpacken.
Und bei der Gelegenheit den Teil „Auf Herstellung der WLAN-Verbindung warten“ sauber mit D-Bus-Signalen statt Polling implementieren. -
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. -
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.
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!