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
}

Debian (aws/ec2) : hostnamectl / timedatectl werfen Fehler

Problem : Beim aufrufen der Befehle hostnamectl / timedatectl erscheint die Fehlermeldung
Failed to create bus connection: No such file or directory

Lösung : Naja dann installieren wir eben den bus ;-)
apt-get update && apt-get install dbus -y
nach der Installation sollte der Fehler verschwinden.

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.
LOCK_FILE="${BASE_PATH}/test.pid"
Und hier das komplette Beispiel :
#!/bin/bash
BASE_PATH=$(dirname "$(readlink -f "$0")")
SCRIPT=$(basename "$0")
LOCK_FILE="${BASE_PATH}/test.pid"

function check_process () {
        PID_FILE="${1}"
        if [[ -z "${PID_FILE}" || ! -n "${PID__FILE}" ]]; then
                if [ -f ${LOCK_FILE} ]; then
                        # Pid File auslesen
                        pid=$(cat ${PID_FILE})
                        chkpid=$(ps -ax | grep "/bin/bash" | grep "/${SCRIPT}" | grep $pid | grep -v grep)
                        if [ $? -ne 0 ]; then
                                rm ${PID_FILE}
                        else
                                # Skript läuft noch -> keine doppelte ausführung wird beendet
                                echo "the script is already running -> PID:$pid"
                                exit 1
                        fi
                fi
        else
                echo "no pid file given please check parameters"
                exit 9
        fi
        echo $$ > ${PID_FILE}
}

check_process "${LOCK_FILE}"

echo "Script ${BASE_PATH}/${SCRIPT} started"

# endlosschleife - debug
while true; do
echo "l" 
sleep 10
done

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 !

“Die Organisationen stecken Millionen von Dollars in Firewalls und Sicherheitssysteme und verschwenden ihr Geld, da keine dieser Maßnahmen das schwächste Glied der Sicherheitskette berücksichtigt: Die Anwender und Systemadministratoren.”
Kevin Mitnick