23.12.15

Gästen Wlan Zugang über QR Code anbieten

qrencode installieren

QR-Code erstellen mit

qrencode -t PNG -o wifi.png -s20 "WIFI:T:WPA;S:Freewifi;P:PASSWORT;H:false"



-t: Format PNG
-o: output
-s: size

T: Verschlüsselung
S: SSID
H: Hidden

17.12.15

Von der Konsole per Wlan mit AP verbinden

Es ist schlecht, wenn man den Network-Manager deinstalliert, weil man lieber per Konsole oder /etc/network/interfaces die Einstellungen kontrollieren möchte, aber nicht mehr weiß, wie man sich dann mit dem Wlan (z.B. in einem Hotel ;)) verbinden kann.

Wenn die Wlan-Tools (wireless-tools) installiert sind, ist das Ganze recht einfach.

iwlist wlan0 scan 

listet die AP's in der Nähe auf.

Mit

iwconfig wlan0 essid [SSID des AP]

und

dhclient wlan0

verbindet sich man mit diesem AP.

10.12.15

Reverse Tunnel mit dem Raspberry

Mein Ziel:

Raspberry per UMTS-Stick jederzeit administrieren können.

Benötigt:

UMTS-Stick, Raspberry, eigener Server im Internet (oder DynDNS mit Linux-System -> Port im Router freigeben!).


Login vom PI auf den Server ohne PW ermöglichen. Anleitung findet sich hier.

Script auf dem RPI create_ssh_tunnel.sh (kopiert von hier):
#!/bin/bash
createTunnel() {
  /usr/bin/ssh -N -R 2222:localhost:22 serverUser@Domain
  if [[ $? -eq 0 ]]; then
    echo Tunnel to jumpbox created successfully
  else
    echo An error occurred creating a tunnel to jumpbox. RC was $?
  fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
  echo Creating new tunnel connection
  createTunnel
fi
Dann noch ausführbar machen mit
chmod +x  create_ssh_tunnel.sh
Eintragen als Cronjob mit crontab -e

*/1 * * * * ~/create_ssh_tunnel.sh > tunnel.log 2>&1
Wenn der Tunnel steht, die Verbindungsaufname auf dem Server testen mit

ssh -p2222 pi@localhost
Update:

Wenn ich mich von einem Windows PC anschließend z.B. mit der Weboberfläche eine NAS, welches sich im Netzwerk des PI befindet, verbinden möchte, muss der Tunnel erweitert werden:

/usr/bin/ssh -N -R 2222:localhost:22 -R 62011:[IP des NAS]:443 serverUser@Domain 
Bei Zugriffen auf Port 62011 des PI erfolgt eine Weiterleitung auf Port 443 des NAS.
Nun auf dem Windows PC in Putty einen neuen Tunnel eintragen:
 
Wenn nun die Verbindung vom Windows PC zum Server (über Putty) steht und auch der 
Tunnel vom PI zum Server, kann man im Browser eingeben:
https://localhost:40000 
und man gelangt auf das Webinterface des NAS.
 
 
 
Alternativ (und flexibler) ist es sich mit dem Server zu verbinden und in Putty folgendes einzustellen:
 
 
Anschließend neue Session anlegen, die sich localhost:12000 verbindet.

 


Unter SSH/Tunnels können dann beliebig viele Tunnel ins eigene Heimnetz angelegt werden.
 



 
 

7.12.15

PHP - auf Variablen der Elternklasse zurückgreifen

Nachdem ich den Fehler gemacht habe (schon wieder) wichtige Variablen nicht als Array zu definieren, was sich sehr einfach hin- und herschieben lässt, musste ich von der Kindklasse auf Werte von Variablen der Elternklasse zugreifen.

Dies ist zum einen möglich, indem man dort eine Funktion (Methode jajaja)  integriert, die die Werte übergibt.

Nach einigem Googlen habe ich allerdings eine für mich praktikablere Lösung gefunden.

Beispiel


class A
{
  var Variable1;
  var Variable2;
  var Variable3;

 function __construct()
{
     include 'meineconfig.php'; // Werte von Variablen a,b,c etc.
    $this->Variable1=$a;
    $this->Variable1=$b;
    $this->Variable1=$c;
}


}


class B extends A
{

   function __construct()
  {
       parent::__construct();
  }
}

$B=new B();
echo $B->Variable1;


6.12.15

Raspberry und Sunfounder

Auf meinem RPI2 habe ich minibian installiert.
Um das "Männer-Experimentierpaket" Sunfounder zu betreiben, müssen einige Pakete nachinstalliert werden.

Zuallererst den Compiler mit

apt-get install gcc

Beim Compilieren von C-Quellcode, welches in dem Sunfounder-Paket steckt, kommt erst einmal eine Fehlermeldung

fatal error: wiringPi.h: Datei oder Verzeichnis nicht gefunden

Damit die Bibliotheken vorhanden sind, einfach wiringpi installieren mit

apt-get install wiringpi

und et löpt!

29.11.15

Image für Raspberry erstellen

Am Beispiel des Minibian

1. Download dem Images
2. tar xzOf 2015-11-12-jessie-minibian.tar.gz | sudo dd of=/dev/mmcblk0 bs=1M

3. Quellen aktualisieren mit apt-get update (Benutzer bei Minibian: root, PW: raspberry).
4. raspi-config installieren mit apt-get install raspi-config
5. Installieren von keyboard-configuration mit apt-get install keyboard-configuration
6. Ausführen von raspi-config und System anpassen


10.11.15

Sipcmd auf dem Raspberry einrichten

Zuerst wollte ich sipcmd nach dieser Anleitung installieren, doch es trat folgender Fehler auf:

 src/includes.h:23:19: fatal error: ptlib.h: Datei oder Verzeichnis nicht gefunden

Nach dieser Anleitung habe ich es geschafft sipcmd samt der Abhängigkeiten zu installieren.

Dieses Script war wichtig:

\curl -sSL http://tools.jens-bretschneider.de/setup-sipcmd.sh | bash
 
 Damit es nicht verloren geht, hier noch einmal komplett:
 
 
#!/bin/bash

# Abhaengigkeiten installieren
aptitude -y install libopal-dev libpt-dev

# sipcmd aus GitHub clonen
# http://sipcmd.sourceforge.net/
# https://github.com/tmakkonen/sipcmd
cd /opt
git clone https://github.com/tmakkonen/sipcmd.git

# Alias-Option reinpatchen
cat > /opt/sipcmd/src/alias.patch <<"EOF"
--- main.cpp 2015-02-01 15:46:56.708865742 +0100
+++ /mnt/usr/src/sipcmd-master/src/main.cpp 2014-11-26 21:26:19.762070877 +0100
@@ -311,6 +311,7 @@
// Parse various command line arguments
args.Parse(
"u-user:"
+ "a-alias:"
"c-password:"
"l-localaddress:"
"o-opallog:"
@@ -364,6 +365,10 @@
sipep->SetDefaultLocalPartyName(args.GetOptionString('u'));
}

+ if (args.HasOption('a')) {
+ sipep->SetDefaultDisplayName(args.GetOptionString('a'));
+ }
+
if (args.HasOption('c')) {
SIPRegister::Params param;
param.m_registrarAddress = args.GetOptionString('w');
EOF
patch /opt/sipcmd/src/main.cpp < /opt/sipcmd/src/alias.patch

# Debug-Meldungen deaktivieren
sed -i 's/^DEBUG/#DEBUG/' /opt/sipcmd/Makefile

# Compilieren
cd /opt/sipcmd
make
 Um sipcmd von der Kommandozeile zu starten muss zunächst ein neues (WLAN/IP) Telefon in der Fritzbox eingerichtet werden.
 
Danach kann man einen Anruf machen mit:
 
sipcmd -P sip -u 623 -c [PASSWORT] -w 192.168.1.1 -x 'c[RUFNUMMER];w10000;h' 
 
 
-P: Protokoll
-u: Benutzer, der in der Fritzbox eingerichtet ist als Gerät
-c: Passwort
-w: IP Adresse der Fritzbox
-x:  c - Rufnummer
     w - Wartezeit (hier 10 Sek.)
     h - hangup, auflegen 

28.10.15

Kali Linux Update error

Nach längerer Abwesenheit wollte ich wieder eine virtuelle Maschine mit installiertem Kali Linux updaten.

Doch ein apt-get update warf diverse Fehler auf.

Hier half es in der

/etc/apt/sources.list

die Zeichen

deb http://kali.org/kali kali main non-free contrib

durch

deb http://kali.org/kali sana main non-free contrib

zu ersetzen.

Danach ein apt-get clean, apt-get update und apt-get upgrade (ggfs. dist-upgrade) durchführen.

Wenn noch gemeckert wird, dass die PGP Keys abgelaufen sind, hilft ein


rm -rf /var/lib/apt/lists
apt-get update 
apt-get install kali-archive-keyring

Oder aber bei der Meldung: "Die folgenden Signaturen waren ungültig: EXPKEYSIG......"

wget -q -O - https://archive.kali.org/archive-key.asc  | apt-key add



26.10.15

Automatische Anmeldung an openssh-Server

Wieder etwas für mich, damit ich es später wieder finde.


Als Benutzer sowohl private als auch öffentliche Schlüssel generieren mit

ssh-keygen -t dsa
ssh-keygen -t rsa -b 4096

Dann den öffentlichen Schlüssel auf den Server kopieren mit


ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote-system
ssh-copy-id -i ~/.ssh/id_dsa.pub user@remote-system

 
oder mittels einer Pipe
 
cat ~/.ssh/id_dsa.pub | ssh user@servername 'cat - >> /home/user/.ssh/authorized_keys'



 
 Testen der Verbindung mit

ssh user@servername
Ggfs. /etc/ssh/sshd_config anpassen:
AuthorizedKeysFile %h/.ssh/authorized_keys
 


Wenn

userauth_pubkey: key type ssh-dss not in PubkeyAcceptedKeyTypes [preauth]

dann

in der /etc/ssh/sshd_config:

PubkeyAcceptedKeyTypes=+ssh-dss


Automatische Anmeldung am NAS540
 cat /etc/ssh/ssh_host_rsa_key.pub | ssh user@[IP] 'umask 077; cat >> /ffp/home/user/.ssh/authorized_keys'

25.10.15

Ubuntu auf Raspberry 2 installieren

"Just a reminder for me"

  • Download Image von https://ubuntu-mate.org/raspberry-pi/
  • Extrahieren
    bunzip2 ubuntu-mate-15.10-desktop-armhf-raspberry-pi-2.img.bz2
  • Mit DD SD-Card beschreiben
    sudo ddrescue -d -D --force ubuntu-mate-15.10-desktop-armhf-raspberry-pi-2.img /dev/mmcblk [Name der SD-Card]
  • Falls Name nicht bekannt -> lsblk
SD Kartengröße anpassen

  • sudo fdisk /dev/mmcblk0
  • Zweite Partition löschen (d,2)
  • Neue Partition anlegen (n,p,2,enter,enter) => w zum Schreiben 
  • Neustart => sudo resize2fs /dev/mmcblk0p2


20.10.15

Anruf von der FB über ein Bash-Script

Ziel:
Ich möchte automatisiert bei bestimmten Ereignissen angerufen werden.
Meine Fritzbox 7240 bietet ein Telnet-Login, wodurch ich durch Eingabe von

 echo 'ATDT[RUFNUMMER]' | nc 127.0.0.1 1011

einen Anruf veranlassen kann.

Das Ganze lässt sich mittels 'expect' auch mit einem Bash-Script realisieren.

Expect lässt sich auf einem Ubuntu System über

apt-get install expect installieren.

Dann muss man nur noch eine Befehlsdatei 'phone_me' anlegen, die folgenden Inhalt haben kann:

spawn telnet 192.168.1.1
expect "password:"
send "PASSWORT\n"
expect "#"
send  "echo 'ATDT[RUFNUMMER' | nc 127.0.0.1 1011 \n"
expect "OK"

Durch Eingabe von

expect phone_me

wird automatisiert ein telnet-Login durchgeführt und anschließend die Befehle abgearbeitet.
Bei manchen Fritzboxen kann anstelle des '#' auch etwas anderes nach dem Login erscheinen. Dieses also ggfs. anpassen.

6.10.15

Mini-VPN mit Amazon Cloud

Mit den (teilweise) kostenfreien Cloud-Diensten von Amazon kann man natürlich auch ein VPN aufbauen.

Ich habe mir eine micro-Instanz mit einem Ubuntu erstellt.
Das Login geschieht mit einem privaten Schlüssel, den man sich während des Erstellvorganges herunterlädt und dann nach einer Konvertiertung mit puttygen (Anleitung hier ) in Putty hinterlegen kann.





Dann muss noch den Tunnel einrichten



Login geschieht durch ubuntu@[amazon-ip] (wenigstens bei Ubuntu images) 

und dann kann man unter Einstellungen - Erweitert - Netzwerk im Firefox oder Thunderbird den entsprechenden Socks eintragen:


Zum Testen einer der Webseiten aufrufen, die die eigene IP-Adresse anzeigen.

5.10.15

Mini VPN mit SSH

Wer zuhause z.B. einen kleinen Raspberry ständig laufen hat, kann diesen auch mal schnell als VPN nutzen.
DynDNS-Dienst einrichten und den entsprechenden Port am Homerouter auf den Pi (Port 22) lenken.



ssh -D 8000 -p [PORTNUMMER] user@myhome.dyndnsorg -N

Dann im Firefox als Socks 5 Host eintragen:

localhost 8000

und man surft ab sofort - getunnelt  - über den "Kleinen" zu Hause.

14.9.15

Addon für Firefox entwickeln - Quick steps

Ziel: Ich möchte ein einfaches Addon für den Firefox entwickeln. Diese Kurzanleitung basiert auf
https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm#Installation.
Achtung: Ab Version 43 des FF werden unsignierte Addons nicht mehr ausgeführt (https://support.mozilla.org/de/kb/Add-on-Signierung-in-Firefox?as=u&utm_source=inproduct)


Auf einem Linux-System mit Root-Rechten ausführen (hier Ubuntu):

NPM-Paketmanager installieren

apt-get install npm

Installieren von jpm

npm install jpm --global


Jetzt kann man sich die Befehle anzeigen lassen mit

jpm



Bei Auftauchen der Fehlermeldung

/usr/bin/env: node: Datei oder Verzeichnis nicht gefunden


hilft ein

ln -s /usr/bin/nodejs /usr/bin/node

Dann neues Addon starten

mkdir my-addon
cd my-addon
jpm init
Damit wird das Grundgerüst erstellt. Um das Addon zu testen, gibt man ein

jpm run -b /usr/bin/firefox

-b bedeutet der Pfad zum Binary des FF.

Zum Erstellen eingeben

jpm xpi

 Wenn etwas getestet werden muss


jpm test

Optional: -v => verbose, erweiterte Ausgabe. 
Dadurch konnte ich feststellen, dass jpm Firefox bei mir unter /usr/lib64/firefox sucht.
Durch 

sudo mkdir /usr/lib64
sudo ln -s /usr/bin/firefox /usr/lib64/firefox

muss ich den Pfad zum Binary nun nicht mehr angeben.
 
 

16.8.15

Linux Bash: Fortschritt beim Kopieren berechnen

Ich kopiere oftmals große Datenmengen und möchte auf einen Blick wissen, welche Datenrate im Moment genutzt wird.
Das ganze gestaltet sich schwierig, wenn Hintergrundprozesse verwendet werden wie bei meinem NAS, wo ein Rsync läuft.

Aber ein Einzeiler hilft hier:

a=0;wait=10;while true; do i=`df -m | grep sdd | awk '{ print $3 }'`; echo -n $i " MByte => "; echo -n $(($i-$a)); echo " ==> " $((($i-$a)/$wait)) " MB/s"; a=$i; sleep $wait; done

Ich lasse mir anzeigen, welche Fortschritte im 10-Sekunden-Rhytmus gemacht werden, hier bei meiner Platte sdd1.
Natürlich ist die Anzeige nur korrekt, wenn nur ein Rsync-/Kopierauftrag läuft :)

Ausgabe z.B.:
104876  MByte => 44 ==>  4  MB/s


Das ist die belegte Plattengröße in Megabyte und anschließend die Änderung seit der letzten Anzeige.

10.8.15

PDF Dateien drehen und komprimieren

Ich stand vor dem Problem, dass ich zahlreiche Dokumente eingescannt hatte und dabei nicht auf die Richtung geachtet hatte.
Weiterhin sollten die Dokumente, die mit 300dpi eingescannt wurden, per Mail versendet werden, was aufgrund der Größe so ohne weiteres nicht möglich war.

Das Drehen von Dokumente ist mit pdftk ganz einfach. Das Paket pdftk ganz einfach mit apt-get install pdftk installieren.


Ich hatte ein Dokument, wo die Seiten 1-2 nach links, Seite 3 nach rechts, 4-5 wieder nach links, 6-8 um 180 Grad und Seite 9 wieder nach rechts gedreht werden musste.
Ein Einzeiler liefert die Lösung:

  pdftk Originaldokument.pdf cat 1-2west 3east 4-5west 6-8south 9east output gedrehtesDokument.pdf
Dabei stehen die Buchstaben für die Himmelsrichtungen East, West, South :)
Weitere Möglichkeiten von pdftk sind in der Wiki von Ubuntu aufgeführt.


Diese Dokumente waren natürlich noch zu groß. Mittels ghostscript und einem kleinen Script lassen sie sich komprimieren.

#!/bin/bash
# Hierhin werden die komprimierten Dokumente gespeichert
newdir="compress"

# Hole alle Dateien des aktuellen Verzeichnisses mit der Endung pdf
dateien=`find ./ -maxdepth 1 -iname "*pdf"`

for i in $dateien; do
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -sOutputFile=$newdir/$i
echo Verarbeite $i;

done
Dabei gibt -dPDFSETTINGS die Qualität an. Mir reichte die ebook Qualität (150 dpi).
Weitere Hinweise zu den Einstellungen findet ihr u.a. hier.

29.6.15

PDF-Analyse auf die Schnelle mit PDFTK

Wenn man ein PDF Dokument zugesendet bekommt, dessen Herkunft unklar ist, bietet es sich an, mal eben dort reinzugucken, um festzustellen, ob aktive Inhalte vorhanden sind oder irgendwas "Schlechtes" nachgeladen wirde.

Dazu bietet sich das PDFToolKit an, welches sich mit

apt-get install pdftk

installieren lässt.

Dann kann man das PDF dekomprimieren mit

pdfk original.pdf output kopie.pdf uncompress

und sich dessen Inhalt mit einem Editor ansehen.

Meta-Daten anzeigen:

pdtk datei.pdf dump_data

Metadaten löschen


Mit dem exiftool lassen sich nicht Metadaten anzeigen, sondern auch bearbeiten.

apt-get install exiftool

exiftool -all:all= [PDF_DATEI]

15.6.15

mod_rewrite unter Plesk aktivieren

Plesk ist an und für sich schon ganz nett, um via Webinterface einen Server zu konfigurieren.
Allerdings: Wenn etwas nicht funktioniert, ist die Fehlersuche schwieriger als bei einer kompletten manuellen Installation.

Bei mir funktionierte das Modul mod_rewrite nicht, nach langem Suchen habe ich die Lösung gefunden:

Unter "Tools und Einstellungen" -> Allgemeine Einstellungen -> Apache Webserver lassen sich die verschiedenen Apache Module global aktivieren oder deaktivieren.

VServer bei Strato - Plesk 12 - PHP Scripte werden nicht ausgeführt

Wie oft bei Google zu finden, scheint Plesk manchmal ein Problem mit neueren (per Update installierten) PHP Versionen zu haben.

Nachdem ich versehentlich das cgi-Verzeichnis im httpdocs Ordner gelöscht hatte, lief PHP, welches als cgi Modul eingebunden wird, (natürlich) nicht mehr.

Lösung:

PHP unter Servicepakete -> Paketname  -> Hosting Parameter -> Scripting als Apache Modul ausführen lassen.
Dann Synchronisierung abwarten und PHP sollte funktionieren.

14.6.15

FHEM => Intertechno Steckdose einbinden

Wenn man älter wird, vergisst man das ein oder andere. So auch Dinge, die man schon getan hat, aber später nicht mehr nachvollziehen kann.

Also auch hier ein personal reminder.


Ich möchte eine neue Funksteckdose Intertechno ITR-1500 in fhem integrieren.
Habe ich alles schon einmal gemacht, es mir aber natürlich nicht aufgeschrieben.

Hier sind die Codes hinterlegt.

Meine Config als Schnipsel



# Intertechno Dosen
# Hauscode
# B - F000
# Drehschalter (Stelle 4-7
# 01 - 0000
# 02 - F000
# Positionen 8-9 fest auf 0F stellen
# Positionen 10-11 Ein/Aus
# on - FF off F0

define Fernsehlicht IT F000F0000F FF F0
attr Fernsehlicht userattr room_map structexclude
attr Fernsehlicht IODev CUL1
attr Fernsehlicht model itswitch
attr Fernsehlicht room Wohnzimmer

define PI IT F00000000F FF F0
attr PI userattr room_map structexclude
attr PI IODev CUL1
attr PI model itswitch
attr PI room Wohnzimmer


define Ecklampe IT F0000F000F FF F0
attr Ecklampe userattr room_map structexclude
attr Ecklampe IODev CUL1
attr Ecklampe model itswitch
attr Ecklampe room Wohnzimmer

define wz_LichtAlle structure room Fernsehlicht Ecklampe
attr wz_LichtAlle room Wohnzimmer

23.5.15

NSA 325 mit ffp -> Syslog aktivieren

Warum die Datei /ffp/etc/syslog.conf nicht beim Installieren des KSyslog-Paketes mit erstellt wird, ist mir ein Rätsel.

Anyway, Anleitung habe ich hier gefunden.

Also, Ksyslog-Daemon installieren mit (je nach Version, sonst einfach slacker -a und manuell Paket auswählen).

slacker -Ui uli:sysklogd-1.5-arm-1.tgz

 Dann die Datei /ffp/etc/syslog.conf mit dem gewünschten Inhalt erstellen.
Tab zwischen auth.* und folgendem, chmod 644 der Datei 

Als Beispiel:


auth.*  /var/log/auth.messages

Unterbrochenen Upload fortsetzen

Wer kennt es nicht.
Ich habe per Scp angefangen eine größere Datei hochzuladen, dieser Upload wurde jedoch unterbrochen.
Eine Lösung, die ich gefunden habe, nutzt (mal wieder) rsync:


rsync --partial --progress --bwlimit=80 --rsh=ssh temp/MOVI0001.avi [user]@[domain]:/home/user/20150412.avi

Damit wird die Datei MOVI0001.avi hochgeladen und an die bereits vorhandene Datei 20150412.avi angefügt.

--progress: Optional - zeigt den Fortschritt an
--bwlimit: Habe ich auf 80kb gesetzt, da sonst meine komplette Bandbreite ausgenutzt wird und auch der Download (das Surfen) somit beschränkt wird.


RPI 2 mit Wheezy und USB Stick Technotrend CT2-4400

Debian Wheezy in der aktuellen Version herunterladen
Auf SD-Karte kopieren mit

dd bs=4M  if=2015-02-16-raspbian-wheezy.img | pv | dd of=/dev/mmcblk0


RPI starten und einrichten (lokalisieren!).

Der Treiber für den Stick sollte schon installiert sein.

Firmware herunterladen für den Stick und in /lib/firmware schieben.

Für o.a. Stick sind es die Dateien
dvb-demod-si2168-b40-01.fw
dvb-tuner-si2158-a20-01.fw


Repo und TVHeadend installieren:

mcedit /etc/apt/sources.list

 deb http://apt.tvheadend.org/stable wheezy main


curl http://apt.tvheadend.org/repo.gpg.key | sudo apt-key add -
sudo apt-get update
apt-get install tvheadend


DVB-Tools installieren

apt-get install dvb-tools

DVB-Tuner auf DVB-C umstellen
dvb-fe-tool -d DVBC/ANNEX_A
Nach der Umstellung ggfs. Neustart von Tvheadend mit
service tvheadend restart

Danach über die Weboberfläche von TVheadend

URL:9981

Configuration -> DVB Inputs

den Adapter (hier Silicon Labs Si2168) wählen

und unter

General -> Add DVB Network by Location

Germany -> passender Anbieter (hier: Unitymedia // Kabel Deutschland!)

wählen.


to be continued......

22.5.15

Kali Linux als Host und Virtualbox

Es gab Probleme beim Installieren und Starten von Virtualbox unter Kali Linux.


Kernel driver not installed (rc=-1908)

Ein Vorschlag lt.  Google ist

 apt-get update && apt-get install -y linux-headers-$(uname -r)



brachte die Fehlermeldung

 Mittels regulärem Ausdruck <<linux-headers-xxxx>> konnte kein Paket gefunden werden.

Schließlich brachte ein apt-get dist-upgrade Abhilfe!



24.4.15

Videos vom Matroska Format (mkv) umwandeln

Video ins MP4 Format konvertieren und gleichzeitg auf 640*360 Px verkleinern.
avconv -i test.mkv -s 640x360 -c:a copy test.mp4

21.4.15

Kali - Forensic Tools

Hier eine kleine Aufstellung von Tools, die man brauchen kann, um Images zu sichern, Datenrettung zu betreiben etc. Alle diese Tools sind auf den Kali Distribution bereits enthalten.
Dank an ix!

Sicherung imEWF-Format:
ewfacquire und ewfacquirestream


Images mit Hash-Überprüfung:
dc3dd

Datenrettung:
ddrescue
magicrescue
foremost
revocerjpeg


Auswertesoftware:
Autopsy
Digital Forensic Network


Wipen:
dc3dd wipe=/dev/[device]

Extrahieren von Daten (Emails etc.):
bulk_extractor

Zeitstempel:
tsk_gettimes
mactime

Dokumentation:
Casefile

19.4.15

Docfetcher unter Ubuntu

Docfetcher von der Projektseite herunterladen.
Falls noch nicht geschehen, Jave Runtime installieren

apt-get install openjdk-7-jre

Wenn so etwas in der Art auftritt beim Start von Docfetcher.sh

Can't load library: /home/gisy/Downloads/DocFetcher-1.1.14/lib/swt/linux-64/libswt-gtk-4427.so
    Can't load library: /home/gisy/Downloads/DocFetcher-1.1.14/lib/swt/linux-64/libswt-gtk.so
    no swt-gtk-4427 in java.library.path
    no swt-gtk in java.library.path

dann die benötigten Bibliotheken kopieren:

 cp /usr/lib/jni/libswt-* /home/gisy/Downloads/DocFetcher-1.1.14/lib/swt/linux-64/

Wenn der Daemon nicht gestartet werden kann


 ./docfetcher-daemon-linux: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

dann

apt-get install lib32stdc++6

14.4.15

SSH Login Prompt verschwunden

Gestern machte ich die merkwürdige Erfahrung, dass ich, obwohl an der Konfiguration meines Netzwerkes nichts geändert wurde, mich nicht mehr auf den Rechnern einloggen konnte.

Nach Eingabe von Nutzernamen und Passwort stand das Terminal-Fenster still und reagiert auch nicht auf Ctrl+C.

Nach einigem Googlen fand ich diese Lösung, die eine Netcat-Installation voraussetzt:

ssh -o "ProxyCommand nc %h %p" {user-name}@Rechner

Eingetragen in die '~/.ssh/config' (erstellen, falls nicht vorhanden) macht das Ganze permanent.

ProxyCommand nc %h %p


Einen anderen Tipp habe ich nocht nicht ausprobiert. Möglicherweise hilft auch der Eintrag

Host *
  IPQoS 0x00

in der .ssh/config.





13.4.15

Langsame Updates unter Linux (apt-get update)

Bei meinem Server habe ich festgestellt, dass die Updates sehr langsam erfolgen, da das Systems zunächst versucht, über IPv6 Kontakt herzustellen.

Aus bislang unerfindlichen Gründen (die vmtl. im Netz des Providers zu suchen sind), hängt der Prompt nach Eingabe von

apt-get update

mehrere Minuten.

Abhilfe schaffte das Auskommentieren von

precedence ::ffff:0:0/96  100

in der

/etc/gai.conf


10.4.15

Linux Text Tools - danke CT!

Alle Wörter eines langen Textes in eine Wortliste überführen, Leerzeichen ausfiltern, Sortieren und nach Anzahl ausgeben.
Mit stopwords.txt werden bekannte Füllwörter ausgefiltert.


fmt -0 langertext.txt | tr -d [:punct:] | grep -w -i -v -f stopwords.txt | sort | uniq -c | sort -n

3.4.15

Video aufnehmen von Webcam unter Linux

Wie meistens ist dies eher ein kleiner "Reminder For ME".

Um ein Video von einer angeschlossenen Webcam aufzuzeichnen, lässt sich natürlich wieder avconv nutzen.

Unter Ubuntu habe ich nacheinander verschiedene Cams angeschlossen, u.a. die PS3 EyeToy(!) und alles funktionierte auf Anhieb.
Unter Windows die EyeToy in Betrieb zu nehmen ist ein Graus. Dort wird ein kostenpflichtiges Treiberprogramm angeboten, was bei mir aber auch nich funktionierte.

Nun denn, um ein Video aufnehmen einfach die Webcam einstecken und gucken, ob sie unter /dev/video[x] erscheint (x=Nr. der Kamera).

Danach

avconv -f video4linux2 -r 25 -i /dev/video1 -vcodec mpeg4 -y webcam1.mp4

und ein MP4 Video der angeschlossenen Kamera (hier video1) wird erstellt.

Will man etwa ein Video einer Webcam aufnehmen und dazu ein Audiosignal eines Mikrofons (vom PC), so kann man folgendermaßen vorgehen.

Mittels

arecord -l

erhält man eine Liste der Audio-Geräte, in meinem Fall sieht die Ausgabe so aus:

 **** Liste der Hardware-Geräte (CAPTURE) ****
Karte 0: MID [HDA Intel MID], Gerät 0: 92HD81B1C5 Analog [92HD81B1C5 Analog]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0

Dieses Audio-Gerät ist also Gerät 0,0 (Sub-Gerät/Subdevice).

Mit plughw kann man dieses Gerät entsprechend eintragen und somit Video von der externen Webcam und Ton vom internen Mikro aufnehmen.
Meine Zeile sieht dann z.B. so aus:

avconv -f video4linux2 -i /dev/video1 -f alsa -i plughw:0,0 -ar 22050 -ab 64k -acodec ac3_fixed -vcodec mpeg4 -vb 2000k -y test.mp4



24.3.15

Videos umwandeln und per HTML5 wiedergeben

Ausgangslage:

Ich hatte einige Videos mit meinem neuen Quadrocopter erstellt und wollte dieses "mal eben" für andere bereit stellen.
HTML5 unterstützt das Streamen von mp4 Videos, nicht aber von avi´s.
Das die Videos im avi-Format und einer Auflösung von 1280*720 vorliegen, sollen diese zunächst umgewandelt werden.

Das ist sehr einfach unter Linux (hier Ubuntu 12) möglich, wenn avconv installiert ist.

apt-get install libav-tools

Da der benötigte Codec vermutlich auch noch nicht vorhanden ist, sollte auch ein

apt-get install libavcodec-extra-53

hinterher geschoben werden.

Danach lässt sich ein Video sehr einfach konvertieren mit

avconv -i MOVI0000.avi -s 640x360 -vcodec libx264 MOVIE0000.mp4

 Ein solches Video lässt sich sehr einfach einbetten in HTML-Code mit

 <video width="640" height="360" controls autoplay >..
    <source src="MOVIE0000.mp4" type="video/mp4">..
    Sorry, dein Browser unterstützt kein HTML5 Video...
    </video>


Um die spätere Anzeige grafisch etwas aufzupeppen, bietet es sich an, Thumbnails der Videos zu erstellen. Möchte man von jedem mp4 Video ein Screenshot erstellen und als jpg speichern, lässt sich folgender Einzeiler verwenden:

for i in *.mp4; do avconv -i "$i" -ss 00:00:05 -s 320x180 -vsync 1 -qscale 1 -vframes 1 "${i%.mp4}.jpg"; done

Damit wird das aktuelle Verzeichnis gescannt, alle mp4 Dateien mit avconv bearbeitet und nach 5 Sekunden Laufzeit ein jpg-Bild im Format 320*180 Pixel gespeichert. Die Auflösung müsste je nach Ausgangsmaterial angepasst werden, um unschöne Ergebnisse zu vermeiden.


Wenn das soweit läuft, lässt sich auch schnell etwas scripten. Mit diesem kleinen Beispiel werden alle mp4 Dateien im Ordner "videos" gescannt und per Link aufgeführt. Wenn unter dem gleichen Dateinamen - mit der Endung jpg - eine Datei existiert, wird diese als Vorschaubild angezeigt und bei Klick auf den Link wird das entsprechende Video angezeigt.

// Verzeichnis, in dem die Videos und Vorschaubilder abgelegt sind
//
$dir="videos";
$directory=scandir($dir);
// Wenn Aktion gewählt, erstelle HTML-Gerüst für die selektiert Videodatei
//
if($_GET['action']=="show")
{
    $datei=$dir . "/" . strip_tags($_GET['file']);
    echo "<video width=\"1280\" height=\"720\" controls autoplay >";
    echo "<source src=\"$datei\" type=\"video/mp4\">";
    echo "Sorry, your browser doesn't support HTML5 video...";
    echo "</video><hr>";
}
// Gehe alle Dateien des Verzeichnisses durch
//
foreach($directory as $file)
{
    // Endung mp4?
    if(preg_match("/mp4$/", $file))
    {
        $datei = $dir . "/" . $file;
        $size=filesize($datei); // Dateigröße holen
        $creationdate=date("Y-m-d" ,filectime($datei)); // Erstellungsdatum der Datei
        // Gibt es eine Vorschaudatei?
        $thumbnail=$dir . "/" . str_replace("mp4","jpg",$file);
        $description="";
        if(file_exists($thumbnail))
        {
                 $description ="<img src=\"$thumbnail\" width=\"300\"> <br>";
         }
       $description.=$file . " " . human_filesize($size) . "  [$creationdate]";
       echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?action=show&    file=$file\">$description</a><br>";
    }
}
function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}

22.3.15

Screenshot vom laufenden Webcam Video erstellen

Ich besitze eine Wansview Cam, prinzipiell sollte es auch mit anderen Cams funktionieren, die eine Live-Video streamen.
Bei mir wird über Port 554 gestreamt und der Stream ist pw-geschützt.

avconv -y -i rtsp://[Benutzer]:[Passwort]@192.168.1.202:554 -vcodec mjpeg -vframes 1 -an -f rawvideo screenshot.jpg


Mit der Intek Tenvis geht es so:

avconv -y -i "rtsp://[user]:[password]@192.168.178.143:554/11" -vcodec mjpeg -vframes 1 -an -f rawvideo screenshot.jpg



DB Power:

avconv -y -i "rtsp://[user]:[pwd]@192.168.178.221:554/live/ch1" -vcodec mjpeg -vframes 1 -an -f rawvideo screenshot.jpg


Update (09/2017):
Viele Kamera besitzen eine eigene Snapshot-Url, die man nutzen kann. Damit wird verhindert, dass die Screenshots bei schlechter Netzwerkverbindung "unschön" werden.

Beispiele mit curl

Foscam FI9900
curl -k "https://192.168.178.223/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=[BENUTZER]&pwd=[PASSWORT]" -o screenshot.jpg
Befehle der Foscam Kameras


VideoStreamType einstellen (MainStream auf HD):
curl -k "https://192.168.178.227/cgi-bin/CGIProxy.fcgi?cmd=setMainVideoStreamType&streamType=0&usr=BENUTZER&pwd=PASSWORT"

Status abrufen:
curl -k "https://192.168.178.227/cgi-bin/CGIProxy.fcgi?cmd=getMainVideoStreamType&usr=BENUTZER&pwd=PASSWORT"

DBPower h.264
 curl --digest -u "BENUTZER:PASSWORT" 192.168.178.225/mjpeg/snap.cgi?chn=0 -o screenshot.jpg

Wansview und andere Webcams ansteuern mit PHP und einfügen in FHEM

Seit neuestem bin ich Besitzer einer Wansview NC M620W.


Steuerung über PHP-Scripte

Kamera nach rechts drehen

$url="http://192.168.1.202";
$getstring="/web/cgi-bin/hi3510/param.cgi?cmd=ptzctrl&-step=1&-act=right&-speed=13";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . $getstring);
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
//curl_setopt($ch, CURLOPT_USERPWD, 'admin:123456');

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/xml',
          'Connection: Keep-Alive',
          'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
          'Authorization: Basic [BASE64HASH]'
         
                                            ));
$data = curl_exec($ch);
echo $data;
curl_close($ch);


Einbindung in FHEM:

Dank dieser Anleitung hat es geklappt!


1. FHEM HTTPSRV aktiviert (in fhem.cfg):
define myCamWeb HTTPSRV cam /usr/share/web CAM

2. In /usr/share/web Datei index.html erstellt mit folgendem Inhalt:
<embed type="application/x-vlc-plugin" width= "1024" height= "768" name="player" autoplay="yes" loop="yes" target="rtsp://[Benutzer]:[Passwort]@192.168.1.202:554" />
3.  FHEM aktualisieren
4. Weblink erstellen (in Kommandozeile von FHEM):
define weblink_test weblink iframe https://<ip von fhem>/fhem/cam/index.html



Update:

Kamera fittek Tenvis

Steuerung
curl -H "Authorization: Basic YWRtaW46cmfdaHRub3c5OQ==" "http://192.168.178.221/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=up&-speed=45"

Geht nicht: (?)
curl --digest -u "admin:2222" "http://192.168.178.223"



15.3.15

Cronjobs mit Zyxel NSA325

"Just a reminder" für mich.
Hardware Zyxel NSA325 mit ffp.

Damit Cronjobs auch nach einem Reboot ausgeführt werden, erstelle ich in

/ffp/start/

das Script cron.sh mit folgendem Inhalt:

#! /ffp/bin/sh

Background()
{
   while ! crontab -l | grep zyfw_downloader >/dev/null
   do
      sleep 10
   done
   sleep 10 # just to be sure
   cat /ffp/var/spool/cron.tab | crontab -
}

case $1 in
   start)
      if [ -f /ffp/var/spool/cron.tab ]
      then
         Background &
      fi
      ;;
   sto*)
      mkdir -p /ffp/var/spool/
      crontab -l >/ffp/var/spool/cron.tab
      ;;
esac

Das Ganze ausführbar machen und dann kann man mit

crontab -e Cronjobs bearbeiten, die nach einem Reboot bestehen bleiben, wenn man nach dem Editieren

/ffp/start/cron.sh store


eingibt.

Bilder nach Datum in Tagesordner verschieben

Nach einiger Suche habe ich den für mich ultimativen Einzeiler gefunden, um per Linux Bash Bilder in Unterordner, nach Tagen erstellt, zu verschieben.

find -iname '*.jpg' -printf 'mkdir -p %TY-%Tm-%Td; cp %p %TY-%Tm-%Td\n' | bash

27.2.15

Cronjobs aller Nutzer auflisten

Bevor es irgendwann verschwindet, möchte ich ein hier gefundenes Script für die Nachwelt erhalten.
Damit lassen sich alle Cronjobs sämtlicher Nutzer auflisten.

#!/bin/bash

# System-wide crontab file and cron job directory. Change these for your system.
CRONTAB='/etc/crontab'
CRONDIR='/etc/cron.d'

# Single tab character. Annoyingly necessary.
tab=$(echo -en "\t")

# Given a stream of crontab lines, exclude non-cron job lines, replace
# whitespace characters with a single space, and remove any spaces from the
# beginning of each line.
function clean_cron_lines() {
    while read line ; do
        echo "${line}" |
            egrep --invert-match '^($|\s*#|\s*[[:alnum:]_]+=)' |
            sed --regexp-extended "s/\s+/ /g" |
            sed --regexp-extended "s/^ //"
    done;
}

# Given a stream of cleaned crontab lines, echo any that don't include the
# run-parts command, and for those that do, show each job file in the run-parts
# directory as if it were scheduled explicitly.
function lookup_run_parts() {
    while read line ; do
        match=$(echo "${line}" | egrep -o 'run-parts (-{1,2}\S+ )*\S+')

        if [[ -z "${match}" ]] ; then
            echo "${line}"
        else
            cron_fields=$(echo "${line}" | cut -f1-6 -d' ')
            cron_job_dir=$(echo  "${match}" | awk '{print $NF}')

            if [[ -d "${cron_job_dir}" ]] ; then
                for cron_job_file in "${cron_job_dir}"/* ; do  # */ <not a comment>
                    [[ -f "${cron_job_file}" ]] && echo "${cron_fields} ${cron_job_file}"
                done
            fi
        fi
    done;
}

# Temporary file for crontab lines.
temp=$(mktemp) || exit 1

# Add all of the jobs from the system-wide crontab file.
cat "${CRONTAB}" | clean_cron_lines | lookup_run_parts >"${temp}" 

# Add all of the jobs from the system-wide cron directory.
cat "${CRONDIR}"/* | clean_cron_lines >>"${temp}"  # */ <not a comment>

# Add each user's crontab (if it exists). Insert the user's name between the
# five time fields and the command.
while read user ; do
    crontab -l -u "${user}" 2>/dev/null |
        clean_cron_lines |
        sed --regexp-extended "s/^((\S+ +){5})(.+)$/\1${user} \3/" >>"${temp}"
done < <(cut --fields=1 --delimiter=: /etc/passwd)

# Output the collected crontab lines. Replace the single spaces between the
# fields with tab characters, sort the lines by hour and minute, insert the
# header line, and format the results as a table.
cat "${temp}" |
    sed --regexp-extended "s/^(\S+) +(\S+) +(\S+) +(\S+) +(\S+) +(\S+) +(.*)$/\1\t\2\t\3\t\4\t\5\t\6\t\7/" |
    sort --numeric-sort --field-separator="${tab}" --key=2,1 |
    sed "1i\mi\th\td\tm\tw\tuser\tcommand" |
    column -s"${tab}" -t

rm --force "${temp}"

26.2.15

Serversicherheit

Nützliche Tools, die dabei helfen, einen Überblick über Hacking-Versuche zu behalten und solche zu verhindern.

fail2ban

apt-get install fail2ban

Testen von Filtern:
fail2ban-regex "/var/log/apache2/error.log" /etc/fail2ban/filter.d/apache-noscript.conf
Status:

fail2ban-client status


logwatch

apt-get install logwatch

Unter /etc/cron.daily/00logwatch befindet sich nun ein neuer täglicher Cronjob:


#!/bin/bash

#Check if removed-but-not-purged
test -x /usr/share/logwatch/scripts/logwatch.pl || exit 0
#execute
/usr/sbin/logwatch --output mail --mailto me@home.de --format html

#Note: It's possible to force the recipient in above command
#Just pass --mailto address@a.com instead of --output mail
Mit --mailto Mail an den Admin-Emailaccount senden.


debian-goodies

apt-get install debian-goodies
Mit checkrestart kann man testen, ob es noch Prozesse gibt, die auf alte, inzwischen aber aktualisiert Bibliotheken zugreifen.

checkrestart

Offene Ports & Prozesse anzeigen

lsof -i

5.1.15

Deutsches Datum mit PHP - Anpassung von setlocale

Problem:

Trotz setlocale(LC_ALL, 'de_DE') wollte die Ausgabe eines deutschen Datums nicht gelingen.

Schuld war der nicht unter diesem Namen installierte  deutsche Zeichensatz.

Unter Linux lässt sich mittels

locale -a

anzeigen, welche Zeichensätze installiert sind.

Dort aufgeführt war u.a.

de_DE.utf8


Die Änderung

setlocale(LC_ALL, 'de_DE.utf8');

erbrachte die Lösung!

Schnell überprüfen lässt sich das durch die Ausgabe von

print(strftime('%A %B'));


Openhab und Ecoflow Max - API Anbindung

 Ich wollte die neu erworbene Powerstation in Openhab einbinden, um den aktuellen Status (Ladestand etc.) über Openhab auswerten zu können. ...