Posts from 2016-06

xfreerdp connection string

posted on 2016-06-29 03:20

xfreerdp is superior to rdesktop, as it can be used for connecting to a Microsoft VDI (Virtual Desktop Structure). rdesktop can be used for connections to terminal servers, however does not work with a VDI where you connect to a connection broker, and be handed off to another virtual machine afterwards.

All this was tested on debian 8 with version 1.1.0 of the freerdp-x11 package.

This is the most practical example I have found so far:

nohup xfreerdp --plugin cliprdr --ignore-certificate -g 3200x1750 -u USER -d DOMAIN -p $(cat PASSWORDFILE) SERVERNAME-OR-IP &>/dev/null &

It so

  • starts in the background (&)
  • detached from the current console (nohup)
  • without spamming the nohup.out logging by redirecting STDOUT and STDERR (&>/dev/null)
  • using clipboard exchange (--plugin cliprdr)
  • without prompting for acceptance of self-signed certificates (--ignore-certificate)
  • and a certain resolution (-g 3200x1750)

Especially the --ignore-certificate flag and the --plugin cliprdr were a damned pain to find, since the xfreerdp documentation and the man pages are just plain wrong. Let alone mixing three different flagging notations (--XXX, +XXX, /:XXX) being a sign of a really seriously fucked up user interface.

determine ASN from shell

posted on 2016-06-29 01:35

whois can actually use different whois servers for querying. Their output differs, but whois.cymru.com is pretty decent:

whois -h whois.cymru.com <IP-OR-ASN>

I.e.

sjas@zen:~$ whois -h whois.cymru.com $(host sjas.de | head -1 | awk '{print $4}')
AS      | IP               | AS Name
24940   | 78.47.176.149    | HETZNER-AS , DE

In reverse, for looking up which organization is behind a specific AS number:

sjas@zen:~$ whois -h whois.cymru.com AS24940 | tail -1
HETZNER-AS , DE

Downside is, it will not lookup domains, only IP's or ASN's.

If no whois server is specified via the -h flag, whois.arin.net will be used for domains, IP addresses and ASN numbers. whois.cymru.com is however more terse and often more preferable.

nodejs debian install howto

posted on 2016-06-28 18:40

create dedicated node user

 # add user
 useradd -m -U -G sudo -s /bin/bash nodejs

 # create random password for copy-pasting
 pwgen -A0 16 1

 # set password
 passwd nodejs

install from package management and official script

# change user
su nodejs
# go to homedir
cd

# install
### you could also use for version 4, instead of v6 as we will do
##curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -
curl -sL https://deb.nodesource.com/setup_6.x | sudo bash -
sudo apt-get install -y nodejs

# back to root
exit

If you just install the nodejs package without executing the script, npm, nodejs's package manager will be missing.

fix user rights

 # remove complete sudo
 deluser nodejs sudo
 # let our user handle node installl stuff
 # `visudo` for editing `/etc/sudoers`, then put in there:
 Cmnd_Alias NODE_CMDS = /usr/bin/npm
 nodejs ALL=(ALL) NOPASSWD: NODE_CMDS

linux find long paths

posted on 2016-06-28 12:10

Sometimes applications have problems with pathnames the exceed 1024 characters. I.e. this happens with certain backup applications. Here the pathnames came for apache caching files.

The easiest way to find those on a linux system is via find:

find / -regextype posix-extended -regex '.{1000,}'

This will show all paths that exceed 1000 characters in lengths.

proxmox: restoring backups

posted on 2016-06-11 10:42

First, create backup via gui, at the backup tab of your vm.

Go to backup save location and copy it to wherever you want to restore it. Maybe you need to fix ssh keys to directly copy the data directly, i.e. copy the current host's content of ~/.ssh/id_rsa.pub over to the ~/.ssh/authorized_keys of your destination machine.

After ssh'ing to the destination hypervisor, do:

qmrestore vzdump-qemu-100-2016_06_06-19_38_36.vma.lzo 616 -storage local

This would restore your backupped vm image automatically to a 'newly created' VM with ID 616 on your local storage.

linux: resize vm to full disk size

posted on 2016-06-11 10:38

fter resizing the the virtual harddisk of your virtual machine, several other steps are needed so you can utilize this additional space within the VM. This will only talk about increased sizing, which will usually just work. Unlike with downsizing, which are the same steps just in reverse order, but where you can easily kill your currently still running system. Handle downsizing with very, very much care.

This guide assumes you have a single partition, which is used by LVM, where in you have your filesystem(s) in different logical volumes.

resize the partition

I have a vm with hostname called 'test', which has a single disk (/dev/vda), with a single partition (/dev/vda1), which is used by lvm. LVM volume groups are usually called like the hostname (best approach I know of, so here test), and the logical volumes what they are used for (root, swap), or where they are mounted (i.e. var_lib_vz, not shown here).

root uses ext4 as file system.

Initially the disk size was 50G and was increased to 500G.

After the disk size was increased, you can see the available space on the device:

root@test:~# lsblk
NAME             MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0               11:0    1 1024M  0 rom
vda              253:0    0  500G  0 disk
+-vda1           253:1    0   50G  0 part
  +-test-root 252:0    0 14.3G  0 lvm  /
  +-test-swap 252:1    0  976M  0 lvm  [SWAP]

Use a partition manager of your choice (fdisk or cfdisk for disks with an MBR, gdisk or cgdisk for disks using a GPT, or parted if you know what you are doing.), delete your partition. Recreate it with the maximum size, reboot.

Then it should look like this, with adjusted partition size:

root@test:~# lsblk
NAME             MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0               11:0    1 1024M  0 rom
vda              253:0    0  500G  0 disk
+-vda1           253:1    0  500G  0 part
  +-test-root 252:0    0   49G  0 lvm  /
  +-test-swap 252:1    0  976M  0 lvm  [SWAP]

resize PV, LV, file system

First make LVM format the addition free space: (It will 'partition' it so it can work with it, effectively splitting it into junks of like 4MB if I recall correctly.)

root@test:~# pvresize /dev/vda1
  Physical volume "/dev/vda1" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

Since the PV was already a member of the VG, no need to extend the VG.

Now for the actual volume:

root@test:~# lvextend -L 499G /dev/test/root
  Size of logical volume test/root changed from 49.04 GiB (12555 extents) to 499.00 GiB (127744 extents).
  Logical volume root successfully resized.

Here I specified it to be resized to 499GB. If I wanted to just use all available space, I'd do:

lvextend -l +100%FREE /dev/mapper/test-root

root@test:~# lvextend -l +100%FREE /dev/mapper/test-root
  Size of logical volume test/root changed from 450.00 GiB (115200 extents) to 499.04 GiB (127755 extents).
  Logical volume root successfully resized.

The -L is just easier to remember.

Lastly, resize the used filesystem:

root@test:~# resize2fs -p /dev/mapper/test-root
resize2fs 1.42.13 (17-May-2015)
Dateisystem bei /dev/mapper/test-root ist auf / eingeh�ngt; Online-Gr��en�nderung ist
erforderlich
old_desc_blocks = 1, new_desc_blocks = 32
Das Dateisystem auf /dev/mapper/test-root is nun 130821120 (4k) Bl�cke lang.

Verify it:

root@test:~# df -h
Dateisystem              Groesse Benutzt Verf. Verw% Eingehaengt auf
udev                      983M       0  983M    0% /dev
tmpfs                     201M    3.2M  197M    2% /run
/dev/mapper/test-root  492G    2.3G  469G    1% /
tmpfs                    1001M       0 1001M    0% /dev/shm
tmpfs                     5.0M       0  5.0M    0% /run/lock
tmpfs                    1001M       0 1001M    0% /sys/fs/cgroup

proxmox: qemu-img convert

posted on 2016-06-11 10:33

In proxmox you sometimes want to convert images from one type to another.

available types

QCOW2 (KVM, Xen)    qcow2
QED   (KVM)         qed
raw                 raw
VDI   (VirtualBox)  vdi
VHD   (Hyper-V) vpc
VMDK  (VMware)  vmdk
RBD   (ceph)    rbd

example

qemu-img convert -f raw -O qcow2 vm-100-disk-1.raw vm-100-disk-1.qcow2

-f is the first image format, -O the second. Look at the manpage to guess why -f is called -f.

gitolite emergency access

posted on 2016-06-11 10:32

In case you somehow managed to lock yourself out of your gitolite access list (lost key, commited misconfiguration, ...), there is an easy way to bypass this problem.

  1. ssh to your server
  2. su gitolite (or whatever user you use for running gitolite)
  3. cd
  4. git clone $HOME/repositories/gitolite-admin.git temp
  5. fix everything you need, exchange keys, do whatever you need to fix it
  6. git commit your changes
  7. gitolite push

Done. 7.) is gitolite push, not git push!

clamav

posted on 2016-06-11 10:30

For quick virus scans, if you have nothing else handy:

# install
apt install clamav

# install virus bases
freshclam

# scan
#everything
clamscan -r /
#specific folder, and show only 'hits'
clamscan -r -i /var/www

Some other valueable options:

  • --bell rings a bell
  • --remove deletes directly, files are gone!
  • --move=/some/path/here moves infected files it found to the given path

debian: build newest kernel

posted on 2016-06-05 19:23

prerequisites

You should have like 50G of harddisk space available. Since I currently don't (SSD), I use an external harddisk.

Also:

apt install build-essential kernel-package libssl-dev xz-utils ncurses-dev

These are like ~1,3G of additional files on your main system, if you install without the --no-recommends flag.

get sources

Head over to kernel.org and download the source of the kernel of your choice. You should know what stable means and wether you want to use a release client or not, else get the stable kernel.

I will use the current RC release.

extract, copy current config, start compiling

tar xJvf linux-4.7-rc1.tar.xz
cd linux-4.7-rc1/

# copy currently used configuration. otherwise use `make menuconfig`.
cp /boot/config-`uname -r` .
yes "" | make oldconfig

# see how many cores you can use for compiling
# count amount of cores on top, then press 'q'
htop

# build, pass corecount with '-j' flag
make-kpkg -j4 --append-to-version "-sjas" --initrd buildpackage
# if the previous step failed, do these
## make clean
## rm -rf .config
## make menuconfig # save to .config  and exit immediatly
## then redo the previous make-kpkg

I also had a more specific error last time:

make[4]: *** No rule to make target 'debian/certs/benh@debian.org.cert.pem', needed by 'certs/x509_certificate_list'.  Stop.
Makefile:985: recipe for target 'certs' failed

Solution was to comment the CONFIG_SYSTEM_TRUSTED_KEYS line out from my .config.

linux wifi cli handling

posted on 2016-06-04 14:56

Here's a walktrough on using a linux computer with a wifi card to access wlans via the cli tools. This guide is debian specific and assumes you use one of the WPA protocols for encrypting your wifi.

available tools

  • ip
  • iw
  • iwlist
  • iwconfig
  • dhclient
  • wpa_supplicant
  • wpa_passphrase
  • /etc/network/interfaces
  • wicd

You can use all of these, but it just happens you do not really need them all.

discern wlan IF

iw dev:

phy#0
    Interface wlan0
    ifindex 2
    wdev 0x1
    addr 00:22:66:88:00:22
    type managed

wlan0 is my wifi interface and will be uses as an example here from now on.

enable IF (if needed)

ip l s dev wlan0 up

find networks

iw dev wlan0 scan | grep -i -e ssid -e signal

brings:

    signal: -79.00 dBm
SSID: ng-2.4G
signal: -85.00 dBm
SSID: ng-5G

So you know the available networks as well as the signal quality.

An alternative would be: iwlist wlan0 scan | grep -i -e ssid -e signal:

    Quality=26/70  Signal level=-84 dBm  
    ESSID:"ng-5G"
    Quality=36/70  Signal level=-74 dBm  
    ESSID:"ng-2.4G"

I will choose ng-2.4g for the next examples.

set up WPA and run daemon

# i just do not like these storing under /etc
mkdir /root/.wpa
# you are promted for the passphrase
# tee is used to show the output written to the file also directly at the shell
wpa_passphrase ng-2.4g | tee -a ~/.wpa/wpa_supplicant.conf  
## hide contents from others since the original pass is included as comment
chmod 600 ~/.wpa/wpa_supplicant.conf
# run daemon in the backgroud, automtically brings IF up
wpa_supplicant -B -i wlan0 -c ~/.wpa/wpa_supplicant.conf

So now your wpa_supplicant.conf should contain something like this:

root@zen:/home/sjas/blog# wpa_passphrase ng-2.4G MY_PASSWORD
network={
    ssid="ng-2.4G"
    #psk="MY_PASSWORD"
    psk=0b1846ee861de86ebbf663bcd5087ba6cc2bbf0b3d9125361c52e95eef28ef6a
}

This is likely not everything you need to connect. So either discern everything else that is missing parameter-wise by hand, or use wicd if you have a desktop environment installed.

Once you connected to the wifi of your choice, do ps aux | grep wpa_supplicant and see how it was started, and which config references via -c. Copy its contents over to your wpa_supplicant.conf.

set up interface in /etc/network/interfaces for automatic connecting

manual wlan0
iface wlan0 inet dhcp
    pre-up wpa_supplicant -B -D wext -i wlan0 -c /etc/wpa_supplicant.conf
    post-down killall -q wpa_supplicant

usage

# enable
ifup wlan0

#disable
ifdown wlan0

how about several wlan configurations?

This is what I might use in my case:

/etc/network/interfaces:

manual wlan0
iface home2 inet dhcp
    pre-up wpa_supplicant -B -D wext -i wlan0 -c /var/lib/wicd/configurations/c404150241b4
    post-down killall -q wpa_supplicant
iface home5 inet dhcp
    pre-up wpa_supplicant -B -D wext -i wlan0 -c /var/lib/wicd/configurations/c404150241b3
    post-down killall -q wpa_supplicant

These have to be used a little differently, i.e.:

## acitivate one network:
ifup wlan0=home2
## and deactivate
ifdown wlan0

## or activate the other one:
ifup wlan0=home5
## and deactivate
ifdown wlan0

This may seem quite a bit unwieldy, but I am just fed up with network-manager or its relative, wicd, by now.

iwlwifi problems

posted on 2016-06-04 14:49

If running into problems with a intel-based wifi card, try these:

/etc/modprobe.d/iwlwifi.conf:

# disable 801.11n support and enable software crypto:
options iwlwifi 11m_disable=1
options iwlwifi swcrypto=1

# or with slow network speed in n-mode, try antenna aggregation:
options iwlwifi 11n_disable=8

racktables password management

posted on 2016-06-02 23:48

Starting with racktables 0.20.11 a new plugin management was introduced. This post depicts how to use external plugins, especially how to get password management into this DCIM solution.

My regular layout looks like this:

root@racktables:/var/www/racktables# tree -L 2
.
|-- RackTables-0.20.11
|   |-- COPYING
|   |-- ChangeLog
|   |-- LICENSE
|   |-- Makefile
|   |-- README -> README.md
|   |-- README.Fedora
|   |-- README.md
|   |-- gateways
|   |-- plugins
|   |-- scripts
|   `-- wwwroot
|-- RackTables-0.20.11.tar.gz
|-- htdocs -> RackTables-0.20.11/wwwroot/
|-- logs
`-- tmp

By convention, webroots are always set up under /var/www/<domainname>, and docroots at /var/www/<domainname>/htdocs. To easier switch between versions and not having to reconfigure vhosts or add new ones, the versions are just thrown into the webroot. htdocs is a symlink created and points to wwwroot, as racktables wants it. Newer versions are simply dropped into the webroot, and htdocs is symlinked to the new installation.

The plugins folder is where you put plugin files into.

For password management, I found the following script on the mailinglist here.

The full script will be copy-pasted below without any modifications, it worked out-of-the-box with racktables 0.20.11:

<?php

/*
 * Object passwords tab by Gjermund Jensvoll
 * Version 0.7
 *
 *
 * INSTALL:
 *
 *      1. create ObjectPWs Table in your RackTables database
 *

CREATE TABLE IF NOT EXISTS `ObjectPWs` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `object_id` int(10) unsigned NOT NULL,
  `user_name` char(64) DEFAULT NULL,
  `password_hash` char(64) DEFAULT NULL,
  `comment` text,
  PRIMARY KEY (`id`),
  KEY `object_id` (`object_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1490 ;

 *      2. copy passwords.php to plugins directory
 *  3. change $key variable to something random (important!)
 *  4. make sure passwords.php is only readable by webserver and root (also important!)
 *
 */


$tab['object']['passwords'] = 'Passwords';
$tabhandler['object']['passwords'] = 'passwordsTabHandler';

//$ophandler['object']['passwords']['addPW'] = 'addPW';
//registerOpHandler (object, passwords, addPW, addPW, after);

$key = "hj9kai2uru1Hoo6eezooyeeghohy9Ielah5aek9wa3quaek3tohjerie3iuPo6chu6ahj";

// Function for adding new passwords
function commitNewPassword($object_id, $user_name, $password, $comment) {
        global $key;
    /* TODO check permissions */

    $encrypted = openssl_encrypt($password, "AES-256-CBC", $key);
    return usePreparedExecuteBlade
    (
        "INSERT INTO ObjectPWs (object_id, user_name, password_hash, comment) VALUES (?, ?, ?, ?)",
        array ($object_id, $user_name, $encrypted, $comment)
    );

} /* commitNewPassword */


// Function for updating existing passwords
function commitUpdatePassword($pw_id, $user_name, $password, $comment) {
        global $key;

    /* TODO check permissions */

    $encrypted = openssl_encrypt($password, "AES-256-CBC", $key);
    return usePreparedExecuteBlade
    (
        "UPDATE ObjectPWs SET user_name=?, password_hash = ?, comment = ? WHERE id = ?",
        array ($user_name, $encrypted, $comment, $pw_id)
    );                        

} /* commitUpdatePassword */


// Function for deleting passwords
function commitDeletePassword($pw_id) {

    /* TODO check permissions */

    return usePreparedExecuteBlade
    (
        "DELETE FROM ObjectPWs WHERE id = ?",
        array ($pw_id)
    );

} /* commitDeletePassword */


// Main function
function passwordsTabHandler () {
        global $key;


// Show warning for IE users
echo "<SCRIPT language=\"JavaScript\">
<!--
var browserName = navigator.appName;
var bN = navigator.appCodeName;
if (browserName == \"Microsoft Internet Explorer\") {
document.write(\"<center><br><br><font color=red>This page requires a html5 capable browser. Turn off compatability mode in Internet Explorer.</font></center>\");
}
//-->
</SCRIPT>"; /* IE warning */

// JS toogle show/hide password
echo "<SCRIPT language='JavaScript'>
function ShowHide(pwfieldId,buttonId)
{
        if(document.getElementById(pwfieldId).type != 'password')
        {
                document.getElementById(pwfieldId).type = 'password';
                document.getElementById(buttonId).value = 'show';
        }
        else
        {
                document.getElementById(pwfieldId).type = 'text';
                document.getElementById(buttonId).value = 'hide';
        }
}
</SCRIPT>
"; /* toogle show/hide password */


        $display ="<center><br><br><br>\n";

// Debug _POST array
//if (isset($_POST['object_id']))
//print_r ($_POST);


        if (isset($_POST['op'])) {
                if ($_POST['op'] == "addPW") {
                        commitNewPassword($_POST['object_id'], $_POST['user_name'], $_POST['password'], $_POST['comment']);
                }
        if ($_POST['op'] == "editPW") {
            commitUpdatePassword($_POST['pw_id'], $_POST['user_name'], $_POST['password'], $_POST['comment']);
        }
        }

        if (isset($_GET['op'])) {
            if ($_GET['op'] == "delPW") {
                commitDeletePassword($_GET['pw_id']);
                }
        }



        // Table header -> display
        $display .= "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>";
        $display .= "<tr><th>&nbsp;</th>";
        $display .= "<th class=tdleft>Username</th>";
        $display .= "<th class=tdleft>Password</th>";
        $display .= "<th class=tdleft>Comment</th>";
        $display .= "<th>&nbsp;</th></tr>";

        assertUIntArg ('object_id', __FUNCTION__);
        $object = spotEntity ('object', $_REQUEST['object_id']);

        // Existing passwords -> display
        $query = "SELECT * FROM ObjectPWs WHERE object_id = '$object[id]'";
        $result = NULL;
        $result = usePreparedSelectBlade ($query);
        while ($row = $result->fetch (PDO::FETCH_ASSOC)) {
                $pw_id = $row['id'];
                $object_id = $row['object_id'];
                $user_name = $row['user_name'];
                $password = openssl_decrypt($row['password_hash'], "AES-256-CBC", $key);
                $comment = $row['comment'];


                $display .= "<form method=post id=editPW name=editPW autocomplete=off action=\"\">";
                $display .= "<input type=hidden name=\"pw_id\" value=\"".$pw_id."\">";
        $display .= "<input type=hidden name=\"op\" value=\"editPW\">";
        $display .= "<input type=hidden name=\"object_id\" value=\"".$object_id."\">";
                $display .= "<tr><td><a href='?page=object&tab=passwords&object_id=".$object_id."&op=delPW&pw_id=".$pw_id."' onclick=\"javascript:return confirm('Are you sure you want to delete this password?')\">";
                $display .= "<img src='?module=chrome&uri=pix/tango-list-remove.png' width=16 height=16 border=0 title='Delete this password'></a></td>";
                $display .= "<td class='tdleft' NOWRAP><input type=text name=user_name value='".$user_name."' size=20></td>";

                $display .= "<td class='tdleft' NOWRAP><input type='password' id='password".$pw_id."' name='password' value='".$password."' size=30 required>";
                $display .= "<input type='button' id='button".$pw_id."' value='show' onclick=\"javascript:ShowHide('password".$pw_id."','button".$pw_id."')\"></td>\n";


                $display .= "<td class='tdleft' NOWRAP><input type=text name=comment value='".$comment."' size=30></td>";
                $display .= "<td><input type=image name=submit class=icon src='?module=chrome&uri=pix/tango-document-save-16x16.png' border=0 title='Save changes' onclick=\"javascript:return confirm('Are you sure you want to edit this password?')\"></td></form></tr>";

        }        


        // Form to add new password -> display
        $display .= "<form action=\"\" method=post autocomplete=off id=\"addPW\" name=\"addPW\">";
        $display .= "<input type=hidden name=\"object_id\" value=\"".$object['id']."\">";
        $display .= "<input type=hidden name=\"op\" value=\"addPW\">";
    $display .= "<tr><td><input type=image name=submit class=icon src='?module=chrome&uri=pix/tango-list-add.png' border=0  title='add a new password'></td>";
    $display .= "<td class='tdleft'><input type=text size=20 name=user_name tabindex=100></td>";

        $display .= "<td class='tdleft'><input type=text name='password' id=newpassword tabindex=101 size=30 required>";
        $display .= "<input type='button' id='newbutton' value='hide' onclick=\"javascript:ShowHide('newpassword','newbutton')\"></td>\n";

    $display .= "<td class='tdleft'><input type=text size=30 name=comment tabindex=102></td>";
    $display .= "<td><input type=image name=submit class=icon src='?module=chrome&uri=pix/tango-list-add.png' border=0 tabindex=103 title='add a new password'></td></tr>";
    $display .= "</form>";
    $display .= "</table><br></center>";


    // Output all display
    echo $display;

} /* passwordsTabHandler */

?>

Read the instructions on top carefully, create the database table, and save it to plugins/passwords.php. After a page reload you should have the Passwords tab when opening an object in racktables.

This blog covers .csv, .htaccess, .pfx, .vmx, /etc/crypttab, /etc/network/interfaces, /etc/sudoers, /proc, 10.04, 14.04, AS, ASA, ControlPanel, DS1054Z, GPT, HWR, Hyper-V, IPSEC, KVM, LSI, LVM, LXC, MBR, MTU, MegaCli, PHP, PKI, R, RAID, S.M.A.R.T., SNMP, SSD, SSL, TLS, TRIM, VEEAM, VMware, VServer, VirtualBox, Virtuozzo, XenServer, acpi, adaptec, algorithm, ansible, apache, apache2.4, apachebench, apple, applet, arcconf, arch, architecture, areca, arping, asa, asdm, autoconf, awk, backup, bandit, bar, bash, benchmarking, binding, bitrate, blackarmor, blockdev, blowfish, bochs, bond, bonding, booknotes, bootable, bsd, btrfs, buffer, c-states, cache, caching, ccl, centos, certificate, certtool, cgdisk, cheatsheet, chrome, chroot, cisco, clamav, cli, clp, clush, cluster, coleslaw, colorscheme, common lisp, configuration management, console, container, containers, controller, cron, cryptsetup, csync2, cu, cups, cygwin, d-states, database, date, db2, dcfldd, dcim, dd, debian, debug, debugger, debugging, decimal, desktop, df, dhclient, dhcp, diff, dig, display manager, dm-crypt, dmesg, dmidecode, dns, docker, dos, drivers, dtrace, dtrace4linux, du, dynamictracing, e2fsck, eBPF, ebook, efi, egrep, emacs, encoding, env, error, ess, esx, esxcli, esxi, ethtool, evil, expect, exportfs, factory reset, factory_reset, factoryreset, fail2ban, fbsd, fdisk, fedora, file, filesystem, find, fio, firewall, firmware, fish, flashrom, forensics, free, freebsd, freedos, fritzbox, fsck, fstrim, ftp, ftps, g-states, gentoo, ghostscript, git, git-filter-branch, github, gitolite, global, gnutls, gradle, grep, grml, grub, grub2, guacamole, hardware, haskell, hdd, hdparm, hellowor, hex, hexdump, history, howto, htop, htpasswd, http, httpd, https, i3, icmp, ifenslave, iftop, iis, imagemagick, imap, imaps, init, innoDB, innodb, inodes, intel, ioncube, ios, iostat, ip, iperf, iphone, ipmi, ipmitool, iproute2, ipsec, iptables, ipv6, irc, irssi, iw, iwconfig, iwlist, iwlwifi, jailbreak, jails, java, javascript, javaws, js, juniper, junit, kali, kde, kemp, kernel, keyremap, kill, kpartx, krypton, lacp, lamp, languages, ldap, ldapsearch, less, leviathan, liero, lightning, links, linux, linuxin3months, lisp, list, livedisk, lmctfy, loadbalancing, locale, log, logrotate, looback, loopback, losetup, lsblk, lsi, lsof, lsusb, lsyncd, luks, lvextend, lvm, lvm2, lvreduce, lxc, lxde, macbook, macro, magento, mailclient, mailing, mailq, manpages, markdown, mbr, mdadm, megacli, micro sd, microsoft, minicom, mkfs, mktemp, mod_pagespeed, mod_proxy, modbus, modprobe, mount, mouse, movement, mpstat, multitasking, myISAM, mysql, mysql 5.7, mysql workbench, mysqlcheck, mysqldump, nagios, nas, nat, nc, netfilter, networking, nfs, nginx, nmap, nocaps, nodejs, numberingsystem, numbers, od, onyx, opcode-cache, openVZ, openlierox, openssl, openvpn, openvswitch, openwrt, oracle linux, org-mode, os, oscilloscope, overview, parallel, parameter expansion, parted, partitioning, passwd, patch, pct, pdf, performance, pfsense, php, php7, phpmyadmin, pi, pidgin, pidstat, pins, pkill, plasma, plesk, plugin, posix, postfix, postfixadmin, postgres, postgresql, poudriere, powershell, preview, profiling, prompt, proxmox, ps, puppet, pv, pveam, pvecm, pvesm, pvresize, python, qemu, qemu-img, qm, qmrestore, quicklisp, quickshare, r, racktables, raid, raspberry pi, raspberrypi, raspbian, rbpi, rdp, redhat, redirect, registry, requirements, resize2fs, rewrite, rewrites, rhel, rigol, roccat, routing, rs0485, rs232, rsync, s-states, s_client, samba, sar, sata, sbcl, scite, scp, screen, scripting, seafile, seagate, security, sed, serial, serial port, setup, sftp, sg300, shell, shopware, shortcuts, showmount, signals, slattach, slip, slow-query-log, smbclient, snmpget, snmpwalk, software RAID, software raid, softwareraid, sophos, spacemacs, spam, specification, speedport, spi, sqlite, squid, ssd, ssh, ssh-add, sshd, ssl, stats, storage, strace, stronswan, su, submodules, subzone, sudo, sudoers, sup, swaks, swap, switch, switching, synaptics, synergy, sysfs, systemd, systemtap, tar, tcpdump, tcsh, tee, telnet, terminal, terminator, testdisk, testing, throughput, tmux, todo, tomcat, top, tput, trafficshaping, ttl, tuning, tunnel, tunneling, typo3, uboot, ubuntu, ubuntu 16.04, udev, uefi, ulimit, uname, unetbootin, unit testing, upstart, uptime, usb, usbstick, utf8, utm, utm 220, ux305, vcs, vgchange, vim, vimdiff, virtualbox, virtualization, visual studio code, vlan, vmstat, vmware, vnc, vncviewer, voltage, vpn, vsphere, vzdump, w, w701, wakeonlan, wargames, web, webdav, weechat, wget, whois, wicd, wifi, windowmanager, windows, wine, wireshark, wpa, wpa_passphrase, wpa_supplicant, x11vnc, x2x, xfce, xfreerdp, xmodem, xterm, xxd, yum, zones, zsh


Unless otherwise credited all material Creative Commons License by sjas