Intelligente Lösungen
in neuer Dimension

USB-Stick nicht beschreibbar

Heute habe ich versucht, einen SanDisk-USB-Stick auf meinem Laptop mit dd zu beschreiben. Das hat zunächst nicht funkioniert, es erschienen immer Fehlermeldungen der Art:

1
dd: konnte '/dev/sdb' nicht öffnen: Das Dateisystem ist nur lesbar

Diese Dinge habe ich dann ausprobiert:

  • sudo hdparm -r0 /dev/sdb … kein Erfolg
  • sudo blockdev --setrw /dev/sdb … kein Erfolg
  • Änderungen an usb-storage: Funktioniert

Sichten von /var/log/syslog zeigt sowas:

1
2
3
4
5
6
7
8
... scsi 6:0:0:0: Direct-Access     SanDisk  Cruzer Fit       1.26 PQ: 0 ANSI: 5
... sd 6:0:0:0: Attached scsi generic sg2 type 0
... sd 6:0:0:0: [sdb] 62530624 512-byte logical blocks: (32.0 GB/29.8 GiB)
... sd 6:0:0:0: [sdb] Write Protect is on
... sd 6:0:0:0: [sdb] Mode Sense: 43 00 80 00
... sd 6:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
...  sdb:
... sd 6:0:0:0: [sdb] Attached SCSI removable disk

Hier der Ablauf der Änderungen an “usb-storage”:

  • Sichten der USB-IDs: lsusb|grep -i cruzer
1
Bus 002 Device 003: ID 0781:5571 SanDisk Corp. Cruzer Fit
  • Abklemmen von “usb-storage”: sudo modprobe -r $(lsmod | sed -n 's:,: :g ; s,^usb_storage[ 0-9]*,,p') usb_storage
  • Neues Einklinken von “usb-storage”: sudo modprobe usb_storage quirks=0781:5571:w

Nach der Korrektur sieht /var/log/syslog so aus:

1
2
3
4
5
6
7
... scsi 6:0:0:0: Direct-Access     SanDisk  Cruzer Fit       1.26 PQ: 0 ANSI: 5
... sd 6:0:0:0: Attached scsi generic sg2 type 0
... sd 6:0:0:0: [sdb] 62530624 512-byte logical blocks: (32.0 GB/29.8 GiB)
... sd 6:0:0:0: [sdb] Assuming Write Enabled
... sd 6:0:0:0: [sdb] Assuming drive cache: write through
...  sdb:
... sd 6:0:0:0: [sdb] Attached SCSI removable disk

LXC-Container Ubuntu-18.04

Hier beschreibe ich, wie ich meinen Basiscontainer erzeuge.

Basiscontainer via LXD herunterladen und aktualisieren

1
2
3
4
5
6
7
8
9
10
11
# Auf dem Host...
lxc launch ubuntu:18.04 ubuntu-1804
lxc exec ubuntu-1804 /bin/bash

# Im Container...
apt-get update
apt-get upgrade
apt-get dist-upgrade
apt-get autoremove
apt-get clean
poweroff

Nacharbeiten

Zusatzpakete installieren

Für meine tägliche Arbeit brauche ich

  • joe
  • apt-transport-https
  • openssh-server (scheint bei 18.04 bereits per Standard installiert zu sein)
  • net-tools (für ifconfig und netstat)

Diese Pakete installiere ich im Container so:

1
2
3
4
5
apt-get install joe
apt-get install apt-transport-https
apt-get install openssh-server
apt-get install net-tools # ... provides ifconfig and netstat
apt-get clean

OpenSSH aktivieren

1
systemctl enable ssh

SSH-Zugriff via PubKey

1
2
3
4
5
6
7
mkdir /root/.ssh
chmod 700 /root/.ssh
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
cat >>/root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1cd... Uli's SSH Key
^D

Ewige Protokollierung mit Zeitstempel

Siehe StackOverflow -Unlimited Bash History.

/etc/bash.bashrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
HISTFILESIZE=
HISTSIZE=
HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; ${PROMPT_COMMAND:-true}"
# Log last command to syslog
log_command () {
 echo "${USER} $(HISTTIMEFORMAT='' builtin history 1|cut -c8-)" |  logger -t shell -p user.info
}
PROMPT_COMMAND="${PROMPT_COMMAND:-true};log_command"

/etc/skel/.bashrc und /root/.bashrc und /home/ubuntu/.bashrc

Bislang:

1
2
3
4
...
HISTSIZE=1000
HISTFILESIZE=2000
...

Neu:

1
2
3
4
...
#HISTSIZE=1000
#HISTFILESIZE=2000
...

Zeitzone korrigieren

1
2
3
4
5
root@ubuntu-1804:~# date
Mon Apr  8 04:59:43 UTC 2019
root@ubuntu-1804:~# timedatectl set-timezone Europe/Berlin
root@ubuntu-1804:~# date
Mon Apr  8 07:00:21 CEST 2019

Apt-Cacher-NG vom LXDHOST aktivieren

/root/bin/apt-proxy.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh

# port of apt-cacher-ng on the lxd host
PORT=3142
APT_PROXY_FILE="/etc/apt/apt.conf.d/01proxy"
LXDHOST=

for h in $(ip addr|grep -o "inet [0-9.]*/"|grep -v 127.0.0.1|grep -o "[0-9.]*"|sed -e "s/[.][0-9]*$/.1/"); do
  nc -z "${h}" "${PORT}" && { LXDHOST="${h}"; break; }
done

if [ -n "${LXDHOST}" ]; then
  echo >"${APT_PROXY_FILE}" "Acquire::http::Proxy \"http://${LXDHOST}:${PORT}\";"
else
  rm -f "${APT_PROXY_FILE}"
fi

/root/systemd/apt-proxy.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Apt proxy to apt-cacher-ng on lxd host
After=network.target

[Service]
ExecStart=/root/bin/apt-proxy.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Aktivieren

1
2
3
lxdhost# systemctl enable /root/systemd/apt-proxy.service
Created symlink /etc/systemd/system/multi-user.target.wants/apt-proxy.service → /root/systemd/apt-proxy.service.
Created symlink /etc/systemd/system/apt-proxy.service → /root/systemd/apt-proxy.service.

Test

1
2
3
4
5
6
7
8
9
10
11
lxdhost# reboot
...
lxdhost# systemctl status apt-proxy
● apt-proxy.service - Apt proxy to apt-cacher-ng on lxd host
   Loaded: loaded (/root/systemd/apt-proxy.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sun 2019-12-08 07:10:09 CET; 12min ago
  Process: 217 ExecStart=/root/bin/apt-proxy.sh (code=exited, status=0/SUCCESS)
 Main PID: 217 (code=exited, status=0/SUCCESS)

Dec 08 07:10:09 hostonly systemd[1]: apt-proxy.service: Failed to reset devices.list: Operation not permitted
Dec 08 07:10:09 hostonly systemd[1]: Started Apt proxy to apt-cacher-ng on lxd host.

Änderungshistorie

  • 2019-12-08: Apt-Cacher-NG
  • 2019-04-29: Bash-Historie in /var/log/syslog speichern

Linux-Kommandozeile: Farbe von Ordnern ändern

Ich verwende eine Kommandozeile mit schwarzem Hintergrund. Wenn ich mir Ordnernamen anzeigen lasse, so werden diese “dunkelblau” dargestellt. Ich kann sie kam erkennen:

dunkelblau

Hier beschreibe ich, wie ich die Farbe der Ordnernamen in “hellpink” wandle:

  1. Farbcode ermitteln: AskUbuntu kennt alle Varianten – 1;35
  2. Datei ~/.bashrc editieren
    • PS1-Zeile editieren: “01;34m” –> “01;35m”
    • Ganz unten neue Zeile: LS_COLORS=$LS_COLORS:'di=1;35:' ; export LS_COLORS

Neue Kommandozeile öffnen und neue Farben genießen!

pink

Hier noch die Änderungen an ~/.bashrc als DIFF:

Änderungen an ~/.bashrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--- .bashrc_dunkelblau  2019-04-06 06:29:35.311364698 +0000
+++ .bashrc     2019-04-06 06:30:12.583362700 +0000
@@ -57,7 +57,7 @@
 fi

 if [ "$color_prompt" = yes ]; then
-    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;35m\]\w\[\033[00m\]\$ '
 else
     PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
 fi
@@ -115,3 +115,4 @@
     . /etc/bash_completion
   fi
 fi
+LS_COLORS=$LS_COLORS:'di=1;35:' ; export LS_COLORS

Aktualisierung von MariaDB

Bei meinen Ubuntu-Containern kommt es immer wieder vor, dass die Aktualisierung von MariaDB mit folgenden Ausgaben hängen bleibt:

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo apt-get update
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
...
Setting up kmod (22-1ubuntu5.2) ...
Installing new version of config file /etc/modprobe.d/blacklist.conf ...
Setting up mariadb-client-core-10.0 (10.0.38-0ubuntu0.16.04.1) ...
Setting up mariadb-client-10.0 (10.0.38-0ubuntu0.16.04.1) ...
Setting up mariadb-server-core-10.0 (10.0.38-0ubuntu0.16.04.1) ...
Setting up mariadb-server-10.0 (10.0.38-0ubuntu0.16.04.1) ...

Manchmal hilft SEHR langes Warten!

Manchmal muß auch manuell nachgeholfen werden:

1
2
3
4
5
6
7
8
9
10
$ sudo service mysql stop
$ ps waux|grep dpkg|grep -v grep|cut -c10-15|xargs sudo kill
$ ps waux|grep dpkg|grep -v grep|cut -c10-15|xargs sudo kill -15
$ ps waux|grep dpkg|grep -v grep|cut -c10-15|xargs sudo kill -9
$ ps waux|grep mysql|grep -v grep|cut -c10-15|xargs sudo kill
$ ps waux|grep mysql|grep -v grep|cut -c10-15|xargs sudo kill -15
$ ps waux|grep mysql|grep -v grep|cut -c10-15|xargs sudo kill -9
$ sudo apt-get upgrade
$ sudo dpkg --configure -a
$ sudo apt-get upgrade

Bislang hat danach dann immer alles funktioniert!

Server-Zertifikat anzeigen mit OPENSSL

Gelegentlich muß ich mir ein Server-Zertifikat von der Konsole aus ansehen. Das geht am besten mit OPENSSL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Mit TLS-SNI
$ openssl s_client  -showcerts -connect {hostname}:443 -servername {hostname}|openssl x509 -text|less
...
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA
        Validity
            Not Before: Feb  8 00:00:00 2019 GMT
            Not After : Feb  7 23:59:59 2021 GMT
        Subject: OU = Domain Control Validated, OU = PositiveSSL Multi-Domain
...
            X509v3 Subject Alternative Name: 
                DNS:{hostname}, DNS:{alias1}, DNS: {alias2}
...

# Ohne TLS-SNI
$ openssl s_client  -showcerts -connect {hostname}:443|openssl x509 -text|less
...

ImageMagick - SVG nach PNG wandeln

Manchmal muß ich SVG-Dateien nach PNG wandeln. Das Werkzeug meiner Wahl hierfür ist ImageMagick und davon das Werkzeug convert. Ich verwende Version 6.7.7:

1
2
3
4
$ convert --version
Version: ImageMagick 6.7.7-10 2018-09-28 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP

Einfachste Variante

Im Grunde genommen muß man nur dies ausführen:

1
2
# convert {svg-datei} {png-datei}
$ convert mypicture.svg mypicture.png

Danach hat man die PNG-Datei.

Transparenter Hintergrund

Meine SVG-Datei hat einen weißen Hintergrund. Der wird mit der einfachsten Variante auch so in die PNG-Datei übernommen. Oft ist mir’s lieber, wenn der Hintergrund transparent ist, das erreiche ich so:

1
convert -background transparent mypicture.svg mypicture.png

Treppen entfernen

Die Option “+antialias” soll die Treppenbildung reduzieren. Ich kann keine Auswirkung feststellen, eventuell ist die bei mir per Standard aktiv:

1
2
$ convert +antialias -background transparent\
   mypicture.svg mypicture.png

Größe anpassen

Mit file mypicture.png kontrolliere ich die Größe der PNG-Datei:

1
2
$ file mypicture.png
mypicture: PNG image data, 744 x 1053, 16-bit gray+alpha, non-interlaced

Die Größe gefällt mir nicht, ich hätte gerne eine Höhe von einem Achtel dieser Größe.

1
2
3
$ convert -density 72  mypicture.svg mypicture.png
$ file mypicture.png
mypicture: PNG image data, 744 x 1053, 16-bit gray+alpha, non-interlaced

Mit 72 kommt die Größe 744x1053 heraus. Versuchen wir’s mit der Hälfte davon:

1
2
3
$ convert -density 36  mypicture.svg mypicture.png
$ file mypicture.png
mypicture: PNG image data, 149 x 210, 16-bit gray+alpha, non-interlaced

Folgende Optionen haben nicht funktioniert:

  • -size (breite)x(hoehe) … scheint einfach ignoriert zu werden
  • -resize (breite)x(hoehe) … verschlechtert die Qualität, weil erst gerastert und dann umgerechnet wird

Inkscape - Rand bei SVG-Grafiken

Ich habe einige SVG-Grafiken, bei denen die Objekte scheinbar “zufällig” mitten im Arbeitsbereich stehen. Ein Beispiel ist dies:

dp-logo-mit-rand

Für die Weiterverarbeitung und Einbindung ist das relativ ungeschickt. Ich hätte gerne eine SVG-Grafik, die “bündig” mit den enthaltenen Objekten abschließt.

Hilfsmittel hierfür: Inkscape!

Hier der genaue Ablauf:

  1. Inkscape starten: inkscape mypicture.svg
  2. Datei – Dokumenteneinstellungen
  3. Seitengröße – Seitengröße an Inhalt anpassen …
  4. Alle Umrandungen bei 0 belassen (oder auf 0 setzen)
  5. Seite in Auswahl einpassen
  6. Speichern

Danach ist die SVG-Grafik randlos:

dp-logo-ohne-rand

KeeWeb - Passwort-Management für Linux, Windows, Mac

Dieses Dokument bezieht sich auf KeeWeb, Version 1.7.2.

Browser-Version

Die Browser-Version ist erreichbar über diesen Link: KeeWeb@DP. Die Browser-Version muß nur einmalig auf dem DP-Server installiert werden und kann dann von jedem Client direkt verwendet werden.

Die Kennworte werden auch von der Browser-Version lokal auf dem Arbeitsplatzrechner gespeichert!

Installation

  • GitHub-Zweig gh-pages herunterladen
  • … und auspacken auf internal.daemons-point.com, Verzeichnis /var/www/html
  • … und umbenennen: mv keeweb-gh-pages keeweb

Damit ist die Installation abgeschlossen. Falls auf dem Rechner noch kein Apache2 installiert ist, muß dies noch nachgeholt werden.

Nachteile

  • Kein Auto-Type

Desktop-Version

Die Desktop-Version steht unter https://github.com/keeweb/keeweb/releases zum Herunterladen bereit.

Installation

Die nachfolgende Beschreibung funktioniert unter Linux.

  • KeeWeb-1.7.2.linux.x64.zip herunterladen
  • … und auspacken in /opt/keeweb (bspw. mit unzip -d /opt/keeweb KeeWeb-1.7.2.linux.x64.zip)

Damit ist die Installation abgeschlossen.

Start

Zum Starten:

1
2
cd {pfad-der-kdbx-Datei}
/opt/keeweb/KeeWeb

Auto-Type

Die nachfolgende Beschreibung funktioniert unter Linux.

1
sudo apt-get install xdotool

Danach können Benutzername und Kennwort automatisch in Webseiten eingefügt werden:

  • In KeePass: Eintrag anwählen
  • Browser: Anmeldeseite der Webseite anwählen
  • Shift-Alt-T

Probleme

Öffnen von KDBX-Dateien aus anderem Verzeichnis klappt nicht mit Desktop-Version

Wenn ich in’s Verzeichnis “/opt/keepass” wechsle und ./KeePass ausführe, scheitert danach das Öffnen einer KDBX-Datei unter /tmp.

Abhilfe: Wechsle nach “/tmp” und starte /opt/keepass/KeePass.

Quellen

Cache-Konfiguration für Octopress

Einleitung

Bei der Änderung für das feste Navigationsmenü ist mir aufgefallen, dass diese Änderung teilweise nicht wirksam wird. Hypothese: Das liegt am Browser-Cache. Abhilfe: Wir setzen die Cache-Headers.

Detailanalyse

Mittels curl führe ich einige Abfragen unserer Octopress-Seiten durch. Die für das Caching relevanten HTTP-Header liste ich nachfolgend auf.

Beispielabfrage

Abfrage mit Curl:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
uli@ulinuc:~/git/dpserver/servers$ curl -kv http://daemons-point.com
* Rebuilt URL to: http://daemons-point.com/
* Hostname was NOT found in DNS cache
*   Trying 138.201.16.240...
* Connected to daemons-point.com (138.201.16.240) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: daemons-point.com
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Thu, 10 Jan 2019 04:34:33 GMT
* Server Apache/2.4.18 (Ubuntu) is not blacklisted
< Server: Apache/2.4.18 (Ubuntu)
< Last-Modified: Tue, 08 Jan 2019 17:36:27 GMT
< ETag: "fd2-57ef5c8fce836"
< Accept-Ranges: bytes
< Content-Length: 4050
< Vary: Accept-Encoding
< Content-Type: text/html
< 
</body>
</html>

<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
...
</body>
</html>
* Connection #0 to host daemons-point.com left intact

Cache-Header

  • /
    • Last-Modified: Tue, 08 Jan 2019 17:36:27 GMT
    • ETag: “fd2-57ef5c8fce836”
    • Content-Type: text/html
  • /stylesheets/screen.css
    • Last-Modified: Tue, 08 Jan 2019 17:36:27 GMT
    • ETag: “960a-57ef5c8fd45f6”
    • Content-Type: text/css
  • /atom.xml
    • Last-Modified: Tue, 08 Jan 2019 17:36:27 GMT
    • ETag: “1a43f-57ef5c8fcd896”
    • Content-Type: application/xml

Fazit: Es sind keine “speziellen” Cache-Header gesetzt, es gibt kein “Cache-Control” und auch kein “Expires”. Damit “ziehen” die Defaults der verschiedenen Browser.

Soll-Zustand

Wir wollen erreichen, dass der Cache für maximal eine Stunde verwendet wird. Das sollte via “Cache-Control: maxage=3600” erreichbar sein.

Mit “public” erlauben wir das Caching für eventuell vorhandene Proxy-Server.

Aktionen

Alle Aktionen betiezen sich auf den vorgeschalteten Apache HTTPD:

  1. “mod_headers” aktivieren: a2enmod headers
  2. Header “Cache-Control” aktivieren via konfig-Datei: Header setifempty Cache-Control "max-age=3600, public
  3. Prozess durchstarten: service apache2 restart

Test

Vorher

1
2
$ curl -kv https://daemons-point.com/ 2>&1|grep -i cache
* Hostname was NOT found in DNS cache

Nachher

1
2
3
$ curl -kv https://daemons-point.com/ 2>&1|grep -i cache
* Hostname was NOT found in DNS cache
< Cache-Control: max-age=3600, public

Quellen

Festes Navigationsmenü in Octopress

Seitenaufbau

Auf unserer Webseite zeigen wir

  • oben links: Das DP-Logo
  • oben rechts: Das DP-Motto
  • darunter: Das Navigationsmenü
  • darunter: Den Nutzinhalt
  • rechts: Den Scrollbalken (… falls der Nutzinhalt nicht auf den Bildschirm passt)

Bisheriges Verhalten

Wenn der Nutzinhalt nicht auf den Bildschirm passt und man nach unten scrollt, dann verschwinden DP-Logo, DP-Motto und Navigationsmenü.

Wunschverhalten

Das Navigationsmenü soll immer sichtbar bleiben!

Festes Navigationsmenu

Umsetzung

Die Umsetzung erfolgt mit CSS. Es muß das Styling für die Navigationsleiste angepasst werden:

  • position – bislang:relative, künftig:sticky
  • top – neu:0px
  • z-index – neu:10

Hier die Änderungen im Detail:

1
2
3
4
5
6
7
8
9
10
11
12
13
diff --git a/sass/partials/_navigation.scss b/sass/partials/_navigation.scss
index 30fa011..fec8061 100644
--- a/sass/partials/_navigation.scss
+++ b/sass/partials/_navigation.scss
@@ -1,5 +1,7 @@
 body > nav {
-  position: relative;
+  position: sticky;
+  top: 0px;
+  z-index: 10;
   background-color: $nav-bg;
   @include background($nav-bg-front, $nav-bg-back);
   border: {

Probleme

Navigationsmenü verschwindet beim Scrollen

Beschreibung

Die in diesem Dokument beschriebene Änderung funktioniert überhaupt nicht, das Navigationsmenü verschwindet beim Scrollen nach oben außerhalb des Bildschirms!

Analyse

Die zugehörige CSS-Datei ist im Browser-Cache und wird nicht immer sofort aktualisiert!

Abhilfe

Link /stylesheets/screen.css im Browser öffnen und “F5 – Refresh” betätigen!

Quellen