Der Code-Schnippsel-Thread
-
-
Nice, funzt. Danke
-
In so 'ne Falle bin ich selber auch mal reingetappt. Scheiße, wenn man Powershell sowie C# oder gar die fish-Shell gewohnt ist.
-
@amok_alex
Letzte Warnung.
bitte unterlasse diese unsinnigen hashtags die nichts mit dem Thema zu tun haben. Das steigert auch die Qualität deiner Postings. -
Gewöhn dir am besten bei allen Variablen in Bash an, ihre Namen in {} einzupferchen, zum Beispiel ${example}Bei der Gelegenheit sollte man sich auch gleich angewöhnen, immer "${foo}" zu schreiben, vor allem, wenn man es mit Datei-/Directorynamen zu tun hat, die Leerzeichen beinhalten können, insb. bei so Sachen wie for f in *; do … (also Files in einer Schleife behandeln) usw. Oder gibt es dafür einen besseren Weg, den ich noch nicht entdeckt habe?
Wüsste jetzt auch aus dem Steigreif nicht, wie sich das {} in find . -type f -iname "*.bla" -exec command {} \; verhält.
Und ja, da ist noch find -print0 nach xargs -0 pipen.
-
Volle Zustimmung, mache ich auch immer
-
Ebenso sollte man bei Bash-Scripten immer beachten, dass Schleifen mit dem Keyword 'do' eröffnet und mit 'done' abgeschlossen werden. Jedes mal vergess ich das nämlich, weil von anderen C-like-Sprachen gewohnt, die geschweiften Klammern den Beginn und das Ende des jeweiligen Blocks definieren. Nur haben die bei der Bash halt ne andere Funktion als den Beginn und Abschluss eines Anweisungsblocks zu kennzeichnen.
-
Naja, wo außer bei function()-Blöcken ntuzt Bash die schon normalerweise für Anfang und Ende von Blöcken?
-
Ebenso sollte man bei Bash-Scripten immer beachten, dass Schleifen mit dem Keyword 'do' eröffnet und mit 'done' abgeschlossen werden. Jedes mal vergess ich das nämlich, weil von anderen C-like-Sprachen gewohnt, die geschweiften Klammern den Beginn und das Ende des jeweiligen Blocks definieren. Nur haben die bei der Bash halt ne andere Funktion als den Beginn und Abschluss eines Anweisungsblocks zu kennzeichnen.Das ist kein spezifisches Bash-Feature, sondern schon von der Bourne Shell geerbt. Stephen Bourne hatte nicht etwa C als Inspiration für die Strukturen, sondern ALGOL, wo eben mit Keywords statt mit Klammern gearbeitet wird. Auf den Maschinen der Zeit – da war ja selbst ASCII noch relativ neu – konnte man sich nicht darauf verlassen, dass man überhaupt eine große Auswahl an Klammern im Zeichensatz zur Verfügung hatte. Offenbar konnte man sich lediglich auf ( und ) verlassen, denn immerhin definiert ALGOL sogar Keywords für < und > als Vergleichsoperatoren (lt bzw. gt). Frühe Programmiersprachen waren stark naturalistisch mit echten Wörtern statt Zeichen, weil [A-Z] und rudimentäre Interpunktion und mathematische Symbole der kleinste gemeinsame Nenner der Zeichensätze war – außer vielleicht beim APL-Zeichensatz, der als Gegenteil hier deutlich hervorsticht. C setzte dann schon implizit auf ASCII-unterstützende Maschinen, auch wenn in The C Programming Language afair noch EBCDIC an einigen Stellen erwähnt wird (müsste bei mathematischen Operation auf char-Variablen wie z.B. für Case-Umwandlung der Fall sein).
-
Backup-Script
Bash
Alles anzeigen#!/bin/bash echo "############################################" echo "############################################" echo "# Backup-Script #" echo "# Author: tk1908 #" echo "# E-Mail: tk1908@tkbrew.net #" echo "# #" echo "############################################" echo "############################################" OS=$(uname) echo OS=$(uname) # ROOTPATH für Darwin vorerst im HOME, hier muss noch debuggt werden. Ordner-Erstellung unter Volumes schlägt scheinbar fehl. case $OS in Linux) ROOTPATH="/mnt" ;; Darwin) ROOTPATH="${HOME}/Test" ;; esac echo Funktionsaufruf HOSTS=(krypton keppler tesla) SHARES=( $(showmount -e keppler | awk '{print $1}' | sed '1d' | sed 's/^\(\/.*\)\/\(.*\)$/\2/') ) # Shareliste wird von keppler abgerufen. So ist sichergestellt, dass alle Shares erfasst werden. for HOST in "${HOSTS[@]}"; do sudo mkdir $ROOTPATH/$HOST; for SHARE in "${SHARES[@]}";do sudo mkdir $ROOTPATH/$HOST/$SHARE; done; done #tier2_Backup function tier3_Backup () { echo "Migrate Data from keppler to tesla" echo "Creating Directorystructure an mounting shares" for SHARE in "${SHARES[@]}"; do sudo mount ${HOSTS[2]}:/mnt/${HOSTS[2]}/$SHARE $ROOTPATH/${HOSTS[2]}/$SHARE; done for SHARE in "${SHARES[@]}"; do sudo mount ${HOSTS[3]}:/mnt/xenon01/$SHARE $ROOTPATH/${HOSTS[3]}/$SHARE; done # Vorsicht Array in tesla heißt immernoch xenon01. Muss noch geändert werden! rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/applications/ $ROOTPATH/${HOSTS[3]}/applications rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/documents/ $ROOTPATH/${HOSTS[3]}/documents rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/games/ $ROOTPATH/${HOSTS[3]}/games rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/hoerspiele/ $ROOTPATH/${HOSTS[3]}/hoerspiele rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/misc/ $ROOTPATH/${HOSTS[3]}/misc rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/music/ $ROOTPATH/${HOSTS[3]}/music rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/archive/porn/ $ROOTPATH/${HOSTS[3]}/porn rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/videos/ $ROOTPATH/${HOSTS[3]}/videos sudo umount /mnt/${HOSTS[2]}/* sudo umount /mnt/${HOSTS[3]}/* } tier3_Backup echo cleaning sudo umount $SOURCEMOUNTPATH sudo umount $TARGETMOUNTPATH sudo rm -rf /mnt/*
Ausgabe
Code
Alles anzeigen❯ /home/tkoehler/Git/Projekte/Home/Scripts/Unix-Shell/Backup ############################################ ############################################ # Backup-Script # # Author: tk1908 # # E-Mail: tk1908@tkbrew.net # # # ############################################ ############################################ OS=Linux Funktionsaufruf mkdir: cannot create directory ‘/mnt/krypton’: File exists mkdir: cannot create directory ‘/mnt/krypton/wsusoffline’: File exists mkdir: cannot create directory ‘/mnt/krypton/videos’: File exists mkdir: cannot create directory ‘/mnt/krypton/music’: File exists mkdir: cannot create directory ‘/mnt/krypton/hoerspiele’: File exists mkdir: cannot create directory ‘/mnt/krypton/games’: File exists mkdir: cannot create directory ‘/mnt/krypton/backups’: File exists mkdir: cannot create directory ‘/mnt/krypton/archive’: File exists mkdir: cannot create directory ‘/mnt/krypton/pictures’: File exists mkdir: cannot create directory ‘/mnt/krypton/misc’: File exists mkdir: cannot create directory ‘/mnt/krypton/documents’: File exists mkdir: cannot create directory ‘/mnt/krypton/applications’: File exists mkdir: cannot create directory ‘/mnt/keppler’: File exists mkdir: cannot create directory ‘/mnt/keppler/wsusoffline’: File exists mkdir: cannot create directory ‘/mnt/keppler/videos’: File exists mkdir: cannot create directory ‘/mnt/keppler/music’: File exists mkdir: cannot create directory ‘/mnt/keppler/hoerspiele’: File exists mkdir: cannot create directory ‘/mnt/keppler/games’: File exists mkdir: cannot create directory ‘/mnt/keppler/backups’: File exists mkdir: cannot create directory ‘/mnt/keppler/archive’: File exists mkdir: cannot create directory ‘/mnt/keppler/pictures’: File exists mkdir: cannot create directory ‘/mnt/keppler/misc’: File exists mkdir: cannot create directory ‘/mnt/keppler/documents’: File exists mkdir: cannot create directory ‘/mnt/keppler/applications’: File exists mkdir: cannot create directory ‘/mnt/tesla’: File exists mkdir: cannot create directory ‘/mnt/tesla/wsusoffline’: File exists mkdir: cannot create directory ‘/mnt/tesla/videos’: File exists mkdir: cannot create directory ‘/mnt/tesla/music’: File exists mkdir: cannot create directory ‘/mnt/tesla/hoerspiele’: File exists mkdir: cannot create directory ‘/mnt/tesla/games’: File exists mkdir: cannot create directory ‘/mnt/tesla/backups’: File exists mkdir: cannot create directory ‘/mnt/tesla/archive’: File exists mkdir: cannot create directory ‘/mnt/tesla/pictures’: File exists mkdir: cannot create directory ‘/mnt/tesla/misc’: File exists mkdir: cannot create directory ‘/mnt/tesla/documents’: File exists mkdir: cannot create directory ‘/mnt/tesla/applications’: File exists Migrate Data from keppler to tesla Creating Directorystructure an mounting shares mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: Protocol not supported mount.nfs: mount point /mnt//wsusoffline does not exist mount.nfs: mount point /mnt//videos does not exist mount.nfs: mount point /mnt//music does not exist mount.nfs: mount point /mnt//hoerspiele does not exist mount.nfs: mount point /mnt//games does not exist mount.nfs: mount point /mnt//backups does not exist mount.nfs: mount point /mnt//archive does not exist mount.nfs: mount point /mnt//pictures does not exist mount.nfs: mount point /mnt//misc does not exist mount.nfs: mount point /mnt//documents does not exist mount.nfs: mount point /mnt//applications does not exist sending incremental file list rsync: [generator] recv_generator: mkdir "/mnt/applications" failed: Permission denied (13) *** Skipping any contents from this failed directory *** ./ sent 42 bytes received 19 bytes 122.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] sending incremental file list rsync: [generator] recv_generator: mkdir "/mnt/documents" failed: Permission denied (13) *** Skipping any contents from this failed directory *** ./ sent 42 bytes received 19 bytes 122.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] sending incremental file list rsync: [generator] recv_generator: mkdir "/mnt/games" failed: Permission denied (13) *** Skipping any contents from this failed directory *** ./ sent 42 bytes received 19 bytes 122.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] sending incremental file list rsync: [generator] recv_generator: mkdir "/mnt/hoerspiele" failed: Permission denied (13) *** Skipping any contents from this failed directory *** ./ sent 42 bytes received 19 bytes 122.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] sending incremental file list rsync: [generator] recv_generator: mkdir "/mnt/misc" failed: Permission denied (13) *** Skipping any contents from this failed directory *** ./ sent 42 bytes received 19 bytes 122.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] sending incremental file list rsync: [generator] recv_generator: mkdir "/mnt/music" failed: Permission denied (13) *** Skipping any contents from this failed directory *** ./ sent 42 bytes received 19 bytes 122.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] sending incremental file list rsync: [sender] change_dir "/mnt/tesla/archive/porn" failed: No such file or directory (2) sent 19 bytes received 12 bytes 62.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] sending incremental file list rsync: [generator] recv_generator: mkdir "/mnt/videos" failed: Permission denied (13) *** Skipping any contents from this failed directory *** ./ sent 42 bytes received 19 bytes 122.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3] umount: /mnt/tesla/applications: not mounted. umount: /mnt/tesla/archive: not mounted. umount: /mnt/tesla/backups: not mounted. umount: /mnt/tesla/documents: not mounted. umount: /mnt/tesla/games: not mounted. umount: /mnt/tesla/hoerspiele: not mounted. umount: /mnt/tesla/misc: not mounted. umount: /mnt/tesla/music: not mounted. umount: /mnt/tesla/pictures: not mounted. umount: /mnt/tesla/videos: not mounted. umount: /mnt/tesla/wsusoffline: not mounted. umount: /mnt//keppler: not mounted. umount: /mnt//krypton: not mounted. umount: /mnt//tesla: not mounted. cleaning umount: bad usage Try 'umount --help' for more information. umount: bad usage Try 'umount --help' for more information. /mnt
Irgendjemand ne Idee, was hier falsch läuft? Wenn ich die function tier3_Backup definiere und dann ausführe, dann tut alles.
-
Folgender Code gibt bei Windows 10 und Windows 11 exakt das selbe aus:
C
Alles anzeigen#include <windows.h> #include <stdio.h> int main() { DWORD dwVersion = 0; DWORD dwMajorVersion = 0; DWORD dwMinorVersion = 0; DWORD dwBuild = 0; dwVersion = GetVersion(); // Get the Windows version. dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); // Get the build number. if (dwVersion < 0x80000000) dwBuild = (DWORD)(HIWORD(dwVersion)); printf("Version is %d.%d (%d)\n", dwMajorVersion, dwMinorVersion, dwBuild); }
-
FYI zum letzten Post:
Ist ja schliesslich auch seit Vorkriegszeiten so dokumentiert: https://docs.microsoft.com/en-us/windows/…oapi-getversionFüge ein entsprechendes Manifest hinzu und die Funktion wird die Version des entsprechenden Manifestes zurückgeben.
-
Ein Beispiel für den Umgang für read mit einer Pipeline:
Bash
Alles anzeigen#!/bin/bash set -euo pipefail shopt -s lastpipe if [[ $# -lt 2 ]]; then echo "usage: $0 java_home weblogic_domain_dir" exit 1 fi JAVA=$1/bin/java DOMAIN_DIR=$2 if [[ ! -d $DOMAIN_DIR/bin ]]; then echo "Wrong domain directory" exit 1 fi if [[ ! -x $JAVA ]]; then echo "No Java detected" exit 1 fi "$JAVA" -version 2>&1 | head -n 1 | read -r jenv jverstr jversion if [[ $jenv != java ]] || [[ ! $jversion =~ ^\"1.8.0_([0-9]+)\"$ ]]; then echo "Java version not detected as Oracle JDK 8" exit 1 fi jupdate=${BASH_REMATCH[1]} echo Java 8 update: $jupdate if [[ $jupdate -ge 330 ]]; then echo "Appending setUserOverrides.sh..." cat << 'EOF' >> "$DOMAIN_DIR/bin/setUserOverrides.sh" JAVA_OPTIONS="${JAVA_OPTIONS} -Dcom.sun.jndi.ldapURLParsing=legacy" export JAVA_OPTIONS EOF else echo "Nothing to do." fi
Standardmäßig führt Bash jedes Element einer Pipeline in seiner eigenen Subshell aus, was beim Idiom
nicht weiter auffällt und sogar oft wünschenswert ist, dass der äußere Geltungsbereich nicht mit $var1, $var2, $var3 verschmutzt wird.
Mit der Shell-Option lastpipe kann man seit Bash 4.2 in einem Shell-Skript (oder einer interaktiven Shell mit deaktiviertem Job Control) das letzte Element einer Pipeline ohne Subshell ausführen, sodass zum Beispiel wie hier Variablen nicht-flüchtig gesetzt werden können. Dieses Verhalten ist ansonsten nur in der originalen Korn-Shell (ksh93) zu finden, aber genauso wenig in pdksh/mksh.
ZSH und ältere Bash-Versionen müssen auf Prozessersetzung zurückgreifen, in anderen Shells geht dies nur mit einer temporären Datei: -
Ich werf hier mal wider was rein:
Bash
Alles anzeigen#!/bin/bash echo "############################################" echo "############################################" echo "# Downloadmover #" echo "# Author: tk1908 #" echo "# E-Mail: tk1908@tkbrew.net #" echo "# Version 0.6 #" echo "############################################" echo "############################################" OS=$(uname) #DOWNLOADPATH=/mnt/apex01/downloads/Incomming echo OS=$OS case $OS in Linux) DOWNLOADPATH=/mnt/apex01/downloads ;; Darwin) DOWNLOADPATH=/Volumes/downloads ;; esac DATE=$(date +%F) ARCPATH=$DOWNLOADPATH/archive/$DATE LOGPATH=$DOWNLOADPATH/logs/$DATE.txt if [ ! -f "$ARCPATH" ]; then mkdir -p $ARCPATH fi if [ ! -f "$LOGPATH" ]; then touch $LOGPATH fi echo "Finding Documents (docs and pdfs)" >> $LOGPATH find $DOWNLOADPATH/Incomming -type f \( -iname \*."pdf" -o -iname \*."doc" \) -execdir mv -v {} $DOWNLOADPATH/Output/docs \; >> $LOGPATH echo "Finding ISOs (mostly Games)" >> $LOGPATH find $DOWNLOADPATH/Incomming -type f \( -iname \*."iso" \) -execdir mv -v {} $DOWNLOADPATH/Output/Games \; >> $LOGPATH echo Finding SD-Clips >> $LOGPATH find $DOWNLOADPATH/Incomming -type f \( -iname \*."mp4" -o -iname \*."flv" -o -iname \*."wmv" \) -not -iname "*720p*" -not -iname "*1080p*" -not -iname "*2160p*" -exec mv -v {} $DOWNLOADPATH/Output/SD \; >> $LOGPATH echo Finding 720p Paysite Clips >> $LOGPATH find $DOWNLOADPATH/Incomming -type f \( -iname \*\720p\*.mp4 \) -exec mv -v {} $DOWNLOADPATH/Output/Porn/720p/ \; >> $LOGPATH echo Finding 1080p Paysite Clips >> $LOGPATH find $DOWNLOADPATH/Incomming -type f \( -iname \*\1080p\*.mp4 \) -exec mv -v {} $DOWNLOADPATH/Output/Rename/ \; >> $LOGPATH echo Finding 2160p Paysite Clips >> $LOGPATH find $DOWNLOADPATH/Incomming -type f \( -iname \*\2160p\*.mp4 \) -exec mv -v {} $DOWNLOADPATH/Output/encode \; >> $LOGPATH cat $LOGPATH # Processing Video-Files echo Rename 1080p-Content cd $DOWNLOADPATH/Output/Rename for f in *.mp4; do ffmpeg -i "$f" -c:v copy -c:a copy -metadata title= "output/${f%.*}.MP4-WRB.mp4"; done for i in $DOWNLOADPATH/Output/Rename/output; do site=${i%%.*.mp4}; if [ ! -d "/mnt/apex01/path/"$artist""]; then echo "Folder $artist for File $i not in Registry"; else mv -v $i /mnt/apex01/porn/Paysite Scenes/"$site" echo "The Following Files are left over" ls $DOWNLOADPATH/porn/Rename/output echo Clearing Sourcefiles rm $DOWNLOADPATH/Output/Porn/Rename/*.mp4 echo Processing 4k-Content cd $DOWNLOADPATH/Output/Porn/encode for f in *.mp4; do ffmpeg -i "$f" -c:a copy -map 0 -crf 20 -preset slow "output/${f%.*}.MP4-WRB.mp4"; done prename 's/2160p/1080p/' ./output/*.mp4 echo "Clearing Sourcefiles (4k)" rm -v $DOWNLOADPATH/Output/Porn/encode/*.mp4 # List Things older than 7 Days echo "Die folgenden Dateien sind älter als 7 Tage und werden nach weiteren 7 Tagen ins Archiv verschoben" find $DOWNLOADPATH/output -mtime +7 echo "Die Dateien werden am $(date +%F -d "+7 days") ins Archiv verschoben" >> $LOGPATH # Move things older than 14 Days to archive echo "Follwing Files will be moved to the archive now!" find $DOWNLOADPATH/output -mtime +14 -exec mv -v {} $DOWNLOADPATH/archive \; >> $LOGPATH #echo Delete garbage >> $LOGPATH #find $DOWNLOADPATH/Incomming -type f \( -iname \*."rar" -o -iname \*."URL" -o -iname \*."jpg" -o -iname \*."txt" \) -delete #find $DOWNLOADPATH/Incomming -type d -name @eaDir -exec rm -rf {} \; #find $DOWNLOADPATH/Incomming -type f -iname @SynoEAStream -delete #find $DOWNLOADPATH/Incomming -type f \( -iname \*.DS_Store \) -delete #echo Delete empty folders #find $DOWNLOADPATH/Incomming/* -type d -empty -delete
Problem ist, dass das for-Command (bspw. im 1080p-Block) fehlschlägt, sobald keine Files im entsprechenden Ordner liegen. Irgendeine Idee, wie ich hier vorgehen kann? (Möglichst ohne großartiges if else gefriemel?)
-
Problem ist, dass das for-Command (bspw. im 1080p-Block) fehlschlägt, sobald keine Files im entsprechenden Ordner liegen. Irgendeine Idee, wie ich hier vorgehen kann? (Möglichst ohne großartiges if else gefriemel?)Klingt, als könne der Wildcard-Ausdruck nicht expandiert (aufgelöst) werden und wird folglich wörtlich übergeben. Entweder benutzt du auch dort find, das prinzipiell nur existierende Dateien findet (anders als for, das nur über eine von der Shell übergebene Liste iteriert) oder prüfst auf Existenz mit [ -e "$f" ] && ffmpeg ….
Mag sein, dass es eine elegantere Lösung gibt (irgendeine via set setzbare Shell Option?), weil das ja eine verbreitete Stolperfalle sein dürfte. Ich stand aber bisher nicht vor dem Problem.
-
Mag sein, dass es eine elegantere Lösung gibt (irgendeine via set setzbare Shell Option?), weil das ja eine verbreitete Stolperfalle sein dürfte. Ich stand aber bisher nicht vor dem Problem.Ja, für Bash gibt es nullglob:
Zitatnullglob: If set, bash allows patterns which match no files (see Pathname Expansion) to expand to a null string, rather than themselves.
Code/var/empty$ for x in *.mp4; do echo "verarbeite $x"; done verarbeite *.mp4 /var/empty$ shopt -s nullglob /var/empty$ for x in *.mp4; do echo "verarbeite $x"; done
Das funktioniert, weil for ohne in (bzw. in ohne Argumente) gültige Syntax ist.
In diesem Fall sollte es nicht schaden, die Option für das ganze Skript zu setzen. -
Einfacher Wrapper für den Git-Credentialhelper store, der Zugangsdaten symmetrisch mithilfe OpenSSL verschlüsselt (Hausaufgabe: durch öffentlichen Schlüssel mithilfe GnuPG), soweit kein geeigneter plattformspezifischer Speicher (Windows-Anmeldeinformationsverwaltung, macOS-Schlüsselbund, KWallet/gnome-keyring) zur Verfügung steht:
Bash
Alles anzeigen#!/bin/bash set -eo pipefail ENCRYPTED=~/.config/git/credentials.aes OPENSSL_PARAMS="-aes-128-cbc -pbkdf2" decrypted=$(mktemp) trap 'rm -f "$decrypted"' EXIT openssl enc $OPENSSL_PARAMS -d -in "$ENCRYPTED" -out "$decrypted" # every get tends to come with a store, check if anything actually changed checksum_before=$(sha512sum < "$decrypted" | sed "s/ .*//") git credential-store "--file=$decrypted" "$@" checksum_after=$(sha512sum < "$decrypted" | sed "s/ .*//") if [[ $checksum_before != $checksum_after ]]; then openssl enc $OPENSSL_PARAMS -e -in "$decrypted" -out "$ENCRYPTED".new mv "$ENCRYPTED".new "$ENCRYPTED" fi
Einrichtung: -
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!