Bash : Funktion um Files zu laden

Funktion um Dateien aus dem Internet zu laden. Prüft ob curl vorhanden ist , wenn nicht wird wget versucht. Wenn gar nichts von beiden gefunden wird wird das Skript beendet.

function get_remote_file () {
        # ------------------------- get_remote_file -------------------------------------------------------------------
        # download an file to local storage
        #
        # need 2 parameters : get_remote_file [URL_TO_FILE] [LOCAL_PATH]
        # -----------------------------------------------------------------------------------------------------------------

        if [[ ! -z "${1}" || ! -z "${2}" ]]; then
                bin_dl=""
                # check Local Path
                if [ ! -d "${2}" ]; then
                        mkdir "${2}"
                fi
                # check bins
                # using command instead of which to be posix comp.
		
		# ------ check curl
                command -v curl >/dev/null 2>&1
                if [ $? -eq 0 ]; then
                        bin_dl="curl -s -O "
                fi

		# ------ check wget
                command -v wget >/dev/null 2>&1
                if [[ ${bin_dl} = "" && $? -eq 0 ]]; then
                        bin_dl="wget -q "
                fi

		# ------ if emtpy curl and wget not found
                if [ ${bin_dl} = "" ]; then
                        echo "need curl or wget for work please install one of them"
                        exit 98
                fi

                # download file
                if [[ "${1}" =~ http:// || "${1}" =~ https:// || "${1}" =~ ftp:// ]]; then
                        # ${1} is an remote file will be downloaded to ${2}
                        cd "${2}" && { ${bin_dl} "${1}" ; cd -; }
                else
                        # ${1} is not an remote file EXIT !
                        exit 98
                fi
        else
                echo "check parameters for function #> get_remote_file"
                exit 9
        fi
}

Bash : Inhalt von ZIP Dateien vergleichen

Problem : Man möchte über Bash nur den Inhalt einer Zip Datei vergleichen. Die Zip Datei wird aber automatisiert auf einem Server über cron erstellt, was zur Folge hatte das der Zeitstempel und somit auch die md5 Summen unterschiedlich sind.

Lösung : Die Lösung ist mit unzip in die Datei zu schauen und diesen Output mit diff zu verleichen.
function check_files_in_zip () {
	# ------------------------ check_files_in_zip ---------------------------------------
	# compare the content of two zipfiles if equal the function return 0 otherwise 1 
	#
	# need 2 parameters : check_files_in_zip [NAME_OF_OLD_ZIPFILE] [NAME_OF_NEW_ZIPFILE]
	# -----------------------------------------------------------------------------------

	if [[ ! -z "${1}" || ! -z "${2}"  ]]; then
        	diff <(unzip -v -l "${1}" | awk '! /Archiv/ && /[0-9]/ { print $1,$5,$6,$7,$8 }' | sed '$d') <(unzip -v -l "${2}" | awk '! /Archiv/ && /[0-9]/ { print $1,$5,$6,$7,$8 }' | sed '$d') 1>/dev/null 2>&1
        	if [ $? -eq 0 ]; then
                	return 0
        	else
                	return 1
       		fi
	else
		echo "check parameters for function #> check_files_in_zip"
                exit 9
        fi
}

BASH: Nur eine Instanz eines Bash Skriptes starten

In einigen Fällen darf ein Skript nur eine Instanz starten, z.B. Aufbereitung für Backup. Für diesen Zweck hab ich hier das kleine Bespiel eingestellt.

Sollten mehrere Benutzer das Skript starten können ist natürlich darauf zu achten das sie alle Schreibrechte auf das PID File haben.
PIDFILE="$(dirname "$(readlink -f "$0")")/$(basename "${0}").pid"
Und hier das komplette Beispiel :
#!/bin/bash

function check_process () {
        # ------------------------- check_process -----------------------------
        # create an pid file for an bash script and check is it already running
        #
        # need 2 parameters : check_process [NAME_OF_PIDFILE] [NAME_OF_SCRIPT]
        # ---------------------------------------------------------------------

        cp_PID_FILE="${1}"
        cp_SCR_NAME="${2}"
        cp_RET=1
        if [[ -n "${cp_PID_FILE}" && -n "${cp_SCR_NAME}" ]]; then
                if [ -f "${cp_PID_FILE}" ]; then
                        # Pid File auslesen
                        pid=$(cat "${cp_PID_FILE}")
                        chkpid=$(ps -ax | grep "/bin/bash" | grep "/${cp_SCR_NAME}" | grep "${pid}" | grep -v grep)
                        if [ $? -ne 0 ]; then
                                rm "${cp_PID_FILE}"
                                cp_RET=0
                        else
                                # Skript läuft noch -> keine doppelte ausführung wird beendet
                                # Direkter Abbruch (auskommentieren)
                                # echo "the script is already running -> PID:${pid}"
                                # exit 1
                                # Rückgabewert
                                cp_RET=1

                        fi
                fi
        else
                echo "check parameters for function #> check_process"
                exit 9
        fi
        if [ ${cp_RET} -eq 0 ]; then
                echo $$ > "${cp_PID_FILE}"
        fi
        return ${cp_RET}
}
# --------------------------------------------------------------------
clear
PIDFILE="$(dirname "$(readlink -f "$0")")/$(basename "${0}").pid"
check_process "${PIDFILE}" "$(basename "${0}")"
if [ $? -eq 1 ]; then
        echo "Script läuft bereits"
        exit 99
fi
echo "readlink : " $(readlink -f "${0}")
echo "basename : " $(basename "${0}")
echo "pidfile  : " ${PIDFILE}
echo "---------------------------------"
# endlosschleife - debug
while true; do
printf "."
sleep 2
done


Vielleicht hilft das dem einen oder anderen ;-)

Samsung S4 Galaxy auf Android 7.1 flashen (LineageOS 14.1)

Man findet tausende Anleitungen wie man das unter Windows macht, aber keine wie man das auch unter Linux machen kann.
Davon mal abgesehen mein Windows 10 konnte keine Verbindung zum Handy aufbauen.
Immer wieder die Fehlermeldung "ERROR: Failed to access device. libusb error: -12" unter Linux hat alles sofort funktioniert.

komplette Fehlermeldung :
Initialising connection...
Detecting device...
ERROR: Failed to access device. libusb error: -12
Zuerst muss man überprüfen ob das USB-Debugging im Handy aktivert ist. Das kann man einfach unter
Einstellungen > Optionen > Entwickleroptionen
nachschauen. Solltet ihr den Punkt nicht haben dann müssen auch erst die Entwickleroptionen freigeschaltet werden, unter
Einstellungen > Optionen > Geräteinformationen
und dann mehrmals auf die Buildnummer tippen (denke 8 mal) wenn das erledigt ist noch das USB-Debugging überprüfen ;-)

Ich setze hier ein Linux System ein das auf Ubuntu 16.04 aufbaut, bei anderen Distros wird es ähnlich sein kann ich aber nicht grantieren ;-)

Zu Beginn installieren wir erstmal die heimdall Suite auf dem Rechner, das kann mit folgenden Befehl erledigt werden.
sudo apt install heimdall-flash heimdall-flash-frontend
Nachdem das alles installiert ist kann man dieser Anleitung folgen, es unterscheidet sich nicht mehr zum Windows.

Kleine Anmerkung zu der Anleitung von zdnet.de :

Zum flashen habe ich dem Befehl unter Linux lieber den ganzen Pfad gegeben.
heimdall flash --RECOVERY /home/username/download/samsung_flash/recovery.img --no-reboot
Nach dem drücken der drei Tasten [ Lautstärke nach oben ] + [ Home ] + [ Power ] erscheinen 3 farbige Zeilen oben links,
hier drückt und bleibt ihr NUR NOCH die [ Lautstärke nach oben ] dann klappt es mit dem Recovery.

Quelle :
http://www.zdnet.de/88290251/galaxy-s4-update-auf-android-7-1-1-mit-lineageos/

Natürlich seit ihr selbst dafür verantwortlich, bei mir hat es geklappt. Wir übernehmen aber keine Garantie !

Bash : Shell Skripte überprüfen

Eine einfach Möglichkeit um Shell Skripte zu überprüfen bietet shellcheck.net an. Es lässt sich auch lokal installieren und liefert auch dort Informationen zu Bugs & Verbesserungen. Bei mir immer am Anfang einer Neuinstallation dabei ;-)

Installation unter debian :
apt-get install shellcheck


Es ist manchmal ganz interresant vorhandene Skript testen zu lassen. Unterstützt werden bash, ksh , sh (POSIX kompatibel) und zsh.

shellcheck output
shellcheck output
Shellcheck on Github
shellcheck - wiki - Fehlercodes
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)