Linux Spiekbriefje

Scripts etc

Bash

Wat heb ik ook al weer in mijn .bashrc staan? History control, kleuren, aliases, ... Zie natuurlijk ook het Bash reference manual. .bashrc wordt uitgevoerd bij opstarten van iedere terminal; .bash_logout bij uitloggen (eenmalig?).

Wat was ook al weer de sh/bash syntax voor loops en zo? Voorbeeld:

for element in aap noot mies; do echo $element; done
if [ $? -eq 0 ]; then echo "OK $(date)"; fi
if /bin/ps -A | /bin/grep motion >/dev/null 2>&1
if [ -f $CONFIG ] && grep "^chkdsk=yes" $CONFIG > /dev/null
cnt=`expr $cnt + 1`
curtick=$(( (10#`date +%M`%$interval)*60+10#`date +%S` )); # bash only

En dan de prompt... Kan je zetten met PS1, de standaard waarde voor Ubuntu is:

PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Tussen \[ en ] is een ANSI escape sequence, \e is de ESC. \[\e0;xxxxx] zet de titel van het scherm. Achtergrondkleur zou je op groen kunnen zetten door \[\e[42m\] toe te voegen, soms handig om terminals een andere kleur te geven (bijvoorbeeld als je met screen werkt). Meer info: bash, Wikipedia, ANSI sequences.

Perl

Hoe laad ik een missende module in Perl? Grote kans dat er in Ubuntu al een module voor is, voor welk geval je in de apt cache moet zoeken. Bijvoorbeeld voor de module MIME::lite kan dit met sudo apt-cache search perl mime::lite, dit gaf als resultaat libmime-lite-perl wat je vervolgens met sudo apt-get install libmime-lite-perl kan laden. Een andere methode is om de module direct van CPAN (Comprehensive Perl Archive Network) te halen, zie How To Install Perl Modules, had ik nodig voor Digest::SHA1 (sudo su --> perl -MCPAN -e shell --> install Digest::SHA1)

User interface prompting

Even nog zonder uitleg:

gdialog --msgbox "hallo" 6 20
ping `zenity --title "Select Host" --entry --text "Select host you like to ping"`

Workarounds

MSN werkt niet vanuit Empathy (envelopje rechtsboven)? Hebben meer mensen last van... Wat bij mij werkt is in een terminal het volgende commando uitvoeren, en dan Empathy opnieuw laten verbinden (reconnect):

killall telepathy-butterfly

Skype en inkskape moeten wat afwijkend worden opgestart, om mijn webcam resp. de drukgevoeligheid van mijn Wacom tablet goed af te handelen; ik heb de desktop files aangepast (bijvoorbeeld sudo gedit /usr/share/applications/skype.desktop ) zodat ze vanuit de dash goed starten, pas de regel met 'Exec' aan (eerste regel voor skype.desktop, tweede voor inkscape.desktop):

Exec=bash -c 'LD_PRELOAD=/usr/lib/i386-linux-gnu/libv4l/v4l1compat.so skype'
Exec=bash -c 'LIBOVERLAY_SCROLLBAR=0 inkscape %F'

commandLinefu.com is een site met een ruime verzameling van Linux commando's voor alle mogelijke doelen... Soort uitgebreide cheat page.

VMware player 4.0.3 installeert nog niet lekker op Ubuntu; zie deze pagina: VMware Player 4.0.3. on Ubuntu 12.04 64 Bit. Werkt voor mij!

Om in LibreOffice de default paper size (standaard papierformaat) van Letter op A4 te zetten moet je de file /etc/papersize editten en Letter vervangen door A4...

Geen goede MP4 playback? Zie Fix MP4 Playback In Ubuntu 12.04 [Gstreamer Bug Affecting Totem, Minitube, Etc.

Om een applicatie een window op een vaste positie te openen kan je CCSM gebruiken. Ga naar Window management --> Place Windows --> Fixed Window Placement. Vul daar bijvoorbeeld de titel (title=<titel>) en de x/y-coordinaten in.

Optimalisaties

In 'Startup Applications' ook hidden services zichtbaar maken, zoals desktop sharing en personal file sharing? Weet wel wat je uitschakelt!

cd /etc/xdg/autostart; sudo sed --in-place 's/NoDisplay=true/NoDisplay=false/g' *.desktop

Heb je genoeg geheugen, maar een trage disk? Dan kan je het swappen beter verlagen; bijvoorbeeld van de default value van 60 naar de waarde 10. Doe dit met 'vm.swappiness=10' in /etc/sysctl.conf. Ook kan het helpen een deel van je files (zoals de Firefox cache) op ramdisk te zetten:

  • sudo mkdir /mnt/ramdisk; sudo mount -t tmpfs -o size=1024M tmpfs /mnt/ramdisk
  • of voeg toe in /etc/fstab de regel tmpfs /mnt/ramdisk tmpfs nodev,nosuid,nodiratime,size=1024M 0 0
  • firefox via de about:config page --> browser.cache.disk.parent.directory > /mnt/ramdisk, browser.cache.disk.enable > true
  • chromium starten met de optie --disk-cache-dir="/mnt/ramdisk"

Heb je juist weinig geheugen, maar een redelijke processor: comprimeer je werkgeheugen dan met zRAM; sudo apt-get install zram-config

Screen Commandos

screen -r : verder waar je bezig was.

^a d detach (connect met 'screen -r'); ^a c new shell window, ^a k kill window; ^a S split screen; ^a 0 .. ^a 9 switch to window 0..9; ^a " list screens; ^a i window info; ^a ? help; ^a A set title. ^a [ brengt je in copy/scroll mode [hjkl^b^f].

Programma al gestart voor je je realiseerde dat je screen wilde gebruiken? reptyr kan je programma 'reparent'en; een andere ouder geven... Start in een andere terminal screen, en doe daar reptyr <PID> met PID het proces ID van het programma dat je in screen wilt hebben.

Disk defragmenteren: is dat dan nodig in Linux? Meestal niet, maar als je disk erg vol heeft gezeten dan kan e4defrag helpen: sudo e4defrag -c /dev/sda1 checkt de noodzaak, daarna indien nodig zonder de -c draaien.

Enable indexeren van de directories (snelheidsverhoging van disk access): kan alleen als de partitie niet gemount is (b.v. bij gebruik live-CD); dan sudo tune2fs -O dir_index /dev/sda1; sudo e2fsck -D /dev/sda1

Ik heb een dual-boot systeem, dus zowel een oude Windows als een nieuwe Ubuntu. Tijdens het booten kan ik met Grub2 kiezen, als ik niets kies start na 10 seconden automatisch Ubuntu. Maar, 10 seconden is wel lang wachten; heb daar 2 van gemaakt. Pas de file /etc/default/grub aan, dan Grub updaten met sudo update-grub.

Files en swap

Zoeken en hernoemen van files

De extensie van een groep files veranderen? Vermoedelijk heb je ook het rename commando op je systeem; maar er zijn verschillende versies van in omloop. Ik heb de 'perl' versie, waarbij je met een reguliere expressie de naamwijziging op kunt geven (met '-n' doet hij een testrun; '-v' geeft 'verbose output', en er is ook nog een '-f'):

# Perl versie:
rename -v 's/\.JPG$/\.jpg/' *.JPG
rename -v 's/\.JPG$/\.jpg/' */Raw/*.JPG
rename -v 's/\.(\d\d)([a-z]{3})(\d\d)\./.20$3$2$1./' *.txt; # file.21jan13.txt --> file.2013jan21.txt
rename 's/IMG_(....)(....)_(......).*.jpg/${1}_${2}_${3}km.jpg/' *

# Non-perl versie
rename .JPG .jpg *.JPG

Het 'dd' commando is handig om ISO images van CD's te maken, b.v. dd if=/dev/cdrom of=/tmp/cdimg1.iso (wel de cdrom eerst unmounten)

Met find kan je op allerlei mogelijke manieren files vinden, en eventueel ook bewerken. Een paar voorbeelden hieronder. Wil je weten welke processen sommige files in gebruik hebben (bijvoorbeeld omdat je niet kan unmounten), gebruik dan fuser (ook hieronder).

find . -xdev -user kees -exec chown kees:users {} +
find /home/kees -xdev -newer marker.txt -print
function ff () { find . $2 $3 $4 $5 $6 $7 $8 $9 -xdev -iname $1 -print }
sudo fuser -v -m /mnt/data

Encryptie verwijderen van swap

Encryptie van je home directory (Ubuntu) is prima, maar encryptie van je swap kan hibernate-problemen geven. Heb het daarom maar uitgezet (ook voor de snelheid op mijn oude laptop). Is wel een security-lek, maar ik swap toch niet zo veel...

sudo swapoff -a
sudo cryptsetup remove /dev/mapper/cryptswap1
sudo gedit /etc/crypttab
*remove the /dev/sda4 line*
sudo /sbin/mkswap -L swap /dev/sda4
sudo swapon /dev/sda4
sudo gedit /etc/fstab
*replace /dev/mapper/cryptswap1 with /dev/sda4*

DropBox encryption

Soms wil je ook gevoelige data als inloggegevens op Dropbox kwijt, maar... ook zij weten het wachtwoord. In dat geval zou je een encrypted bestandssysteem (EncFS) over een folder in Dropbox kunnen mounten, en in die folder je gevoelige gegevens kwijt kunnen. De uitleg staat op 'Encrypt Your Private Dropbox Data with EncFS', download hier de Gnome wrapper gnome-encfs (met handige tips).

# Eenmalig per PC: sudo apt-get install encfs
# Eenmalig per PC: sudo install gnome-encfs /usr/local/bin
# Eenmalig per PC: mkdir ~/Dropbox_Private
# Eenmalig: encfs ~/Dropbox/.encrypted ~/Dropbox_Private
# Eenmalig per PC: gnome-encfs -a ~/Dropbox/.encrypted ~/Dropbox_Private

gnome-encfs --mount; # Om hem te mounten
# Unmount: fusermount -u ~/Dropbox_Private

Encrypted home directory toch lezen

Gaat met ecryptfs-unwrap-passphrase. Zie ook deze Ubuntu encrypted page. Was iets als hieronder, het eerste commando levert je (na invoer van het wachtwoord voor die gebruiker) een hex string op die je op de plaats van de ???? in het laatste commando moet invullen:

sudo ecryptfs-unwrap-passphrase /mnt/UbuntuOld/home/.ecryptfs/kees/.ecryptfs/wrapped-passphrase
sudo mkdir /mnt/tempmount
sudo mount -t ecryptfs /mnt/UbuntuOld/home/.ecryptfs/kees/.Private /mnt/tempmount \
-o key=???????,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,\
ecryptfs_passthrough=n,,ecryptfs_enable_filename_crypto=yes

Boot en filesystem issues

Herstellen van een boot-partitie: kijk eens naar de 'Boot Repair' tool. Heb ik op een Ubuntu-installatie op een USB-stick toegevoegd, en in ieder geval al een keer heeft het me 'gered', mijn 10.10 Ubuntu op een oud systeem wilde niet meer starten; opstarten vanaf de USB en boot-repair de 'Recommended repair' laten doen en het werkte weer.

Controleren van ext-filessytem gaat met e2fsck -n -v <filesystem>, maar dit repareert niet (door -n, laat alleen zien wat er moet gebeuren), een draaiend filesystem kan je beter niet repareren terwijl het draait (of unmounten, of bij boot). Om een disk check te forceren bij opstarten:

sudo touch /forcefsck ; # force disk check at next reboot

Archives en backups

Paar van de vele tar opties: -c: create, -f <file>: archive name, -h: dereference, -j: bzip2, -z: gzip, -p: preserve permissions, -v: verbose, -x: extract

tar is 'het zip-commando van linux'. Kan heel veel, en heeft veel opties... Zie bijvoorbeeld deze tutorial met voorbeelden. Paar handige varianten: (1) creƫer archive als bzip2 file, bewaar rechten, sla sommige dirs over (zie ook -X excludelist_filename); (2) en (3) haal bepaalde files uit het archief; (4) maak van te voren een schatting van grootte (in kB) van nog te maken bzip2 archief

tar -pcjf homedir.tar.bz2 /home/me/ --exclude "/home/me/temp/" --exclude "/home/me/pictures"
tar xvf archive_file.tar /path/to/dir1/ /path/to/dir2/
tar xvf archive_file.tar --wildcards '*.pl'
tar -cjf - /directory/to/archive/ | wc -c

Een ander handig commando voor backups is rsync. Dit kopieert (bij de juiste opties) alleen maar die files die zijn gewijzigd. Heeft erg veel opties...

rsync -aruv /van/directory/* /naar/directory/ ; # archive ( -a = -rlptgoD ), recursive, update, verbose
rsync -rlptxz --modify-window=100 --max-delete=-1 --safe-links --progress --exclude '*.bak' --exclude-from excludelist.txt <from> <to> ; # mijn back-up argumenten (op Windows target: -ruv ipv -rlpt)

Paar van de vele rsync opties: -a: archive (=-rlptgoD), -l: keep symlinks, -p: preserve permissions,  -r: recursive, -u:update, -v: verbose, -z: compress, --delete, --dryrun, --partial, --progress, 

Files naar of van een remote systeem back-uppen? Dan is sftp (secure FTP) ook wel een handige tool (al kan rsync ook remote werken). Hiermee kan je via een veilige verbinding hele directories heen en weer sturen (moet wel SSH op het remote systeem draaien). Niet de meest snelste methode, maar wel flexibel. Werkt interactief, maar je kan ook een batch-file met opdrachten meegeven met -b. Gebruik ik wel om 's nachts een set files over te huizen, bijvoorbeeld bij 's avonds in een 'screen'-sessie starten met een 4 uur wachtperiode (heel bot, maar werkt wel), de ingesprongen regels in blauw staan in sftp_batch.txt (let op: de -r optie is er pas vanaf OpenSSH versie 4.7):

        # eerste regels in sftp_batch.txt:
        mkdir
mijn\ directory
        put -r mijn\ directory
        quit

eval $(ssh-agent)
ssh-add <mijn_key_file.openssh>
sleep $(( 60*60*4 )); nice sftp -oPort=22 -b sftp_batch.txt kees@123.456.789.100:/mnt/data/public

Let op: ik gebruik bij mijn SSH server op het remote systeem geen wachtwoord, maar een public/private key paar. Door deze van te voren te laden met ssh-add hoef je geen wachtwoord in te typen op het moment dat sftp start.

Voor rsync is de remote syntax meer als hieronder. Ook scp zou kunnen helpen, ook hieronder:

rsync -avz -e "ssh -oPort=22" /home/kees/My\ Documents kees@123.456.789.100:/mnt/data/public
scp -r /home/kees/My\ Documents kees@123.456.789.100:/mnt/data/public

En daarnaast is er nog Unison, om meerdere computers met elkaar synchroon te houden, evt met backup. Ik gebruik mijn Raspberry als centrale server, waarmee ik mijn desktop en laptop synchroniseer. Meer op mijn Raspberry server pagina.

File global replace met sed

sed is een handige opdracht om in een file text te wijzigen. Met een commando kan je in een (of meerdere files meerdere wijzigingen doorvoeren, met gebruik van reguliere expressies. Enkele heel simpele voorbeelden (-i geeft aan 'in-place' edit):

sed -i.bak 's/ugly/beautiful/g' /home/bruno/old-friends/sue.txt
sed 's/\([a-z]*\).*/\1/' # vergeet niet de'\' voor de haakjes
sed -is 's|<h\(.\) align="center">|<h\1>|' *.html
find /home/bruno/old-friends -type f -exec sed -i 's_[ \t][ \t]*to[ \t]*_,\t_g' {} \;
perl -e "s/old_string/new_string/g;" -pi.bak $(find <DirectoryName> -type f)

Maar, sed is geen perl, en heeft slechts beperkte reguliere expressies (bijvoorbeeld: de '*' werkt wel, de '+' niet; al krijg je met '-r' extended reguliere expressies), zie de laatste regel met perl in plaats van sed. -s: multiple files.

Netwerkschijf mounten

Netwerkschijf weer mounten, heb ik een scriptje voor maar dat verwacht dat er al een mount-point is... en cifs-utils moeten geinstalleerd zijn. sudo apt-get install cifs-utils; sudo mkdir /media/netdrive; mount -t cifs //<je_netwerkdrive_ip>/shared /media/netdrive -o rw,credentials=<je_credentials_file>,uid=<je_username>,gid=users

En verder

Files 'veilig' verwijderen (zodat de inhoud echt gewist wordt) kan met schred --remove --zero --iterations=2 <files> (of kortweg shred -u -z -n 2 <files>). Let op, werkt niet 100% op alle type file systems, met name niet op systemen met journalling (bv ext3 in mode data=journal)en niet op alle flash-based devices als USB sticks, omdat deze niet altijd 'in-place' wijzigen... Ander commando is 'wipe -r -Q 2'.

Files met scp kopieren? scp -P <port> raspberry:scripts/Home/20131221.log ~/Documents/20131221.log

Kijken of twee directories hetzelfde zijn? diff is hier een manier. Meer manieren? How to compare two directories.

diff -rq orig/ backup/ ; # -r: recursive, -q: quiet (niet de details bij file-verschillen)

Users en groups

Users, groepen, en de bijhorende nummers (uid en gid) zijn altijd verwarrend voor beginners... Je gebruikt het tenslotte zelden. Standaard zit iedere gebruiker (aangemaakt met adduser) in zijn eigen group, wat ik niet zo handig vind, ik maak de standaard-gebruikers liever lid van 'users'. Je kunt natuurlijk met de hand in /etc/group en /etc/passwd gaan klungelen, maar het gaat makkelijk met het usermod commando met -g optie. Gebruik -a -G group om andere groepen toe te voegen.

Wil je het user nummer (uid) veranderen (bijvoorbeeld om op alle systemen de users dezelfde uid's te laten hebben), dan gaat dat ook met usermod: het voordeel is dat dan bijvoorbeeld ook de ownership van de files in de home directory van de user automatisch wordt aangepast, je hoeft dus geen chown te doen op de files in /home/user... En zo zijn er meer opties om de users te beheren. Tip: group-id (gid) van files goedzetten kan bijvoorbeeld handig met het find commando.

sudo adduser --uid 1010 --ingroup users --encrypt-home pi; # Ubuntu: new user pi, in group users
sudo usermod -a -G users pi; # add pi to group users
sudo usermod -g users pi; # set primary group for pi to users
sudo usermod -u 1010 pi; # change uid
sudo find / -xdev -uid 1000 -exec chown pi:pi {} +; # update all files of 1000

Website opzuigen

Soms handig om een groep webpages in een keer op te halen, bijvoorbeeld om off-line te lezen op mijn tablet

wget --recursive --no-clobber --page-requisites --html-extension --convert-links --domains <het_te_bezoeken_domain> --no-parent --wait=10 --level=2 --referer=http://<waar_komen_we_vandaan>/ --user-agent="Mozilla/5.0 (X11; Linux x86_64) Gecko Firefox/5.0" http://<de_op_te_halen_subsite>

Belastingaangifte 2011 in Ubuntu 11.04

Vanaf de site van de belastingdienst gedownload de linux.tar.gz file, uitgepakt in een tijdelijke map, en de bin en share mappen naar .local gekopieerd. Toen in een terminal de volgende commando's uitgevoerd:

cd ~/.local/bin
./ib2011ux -Lib2011

Het programma vraagt eerst om lettertype; heb gekozen voor Arial, size 10 punts. Het programma vraagt dan of je de van je bekende gegevens wilt downloaden; opent daarvoor een browser window waar je met DIGID kunt inloggen. Vervolgens kan je je bestand downloaden. Helaas, daarna pakt het programma het nog niet automatisch op... Ik heb de file gekopieerd naar zowel ~/.local/bin als naar ~/.local (denk dat de eerste eigenlijk genoeg is), en toen het programma eenmalig opgestart (keren daarna weer zoals hierboven beschreven) met het onderstaande commando, waarmee hij de gedownloade gegevens inleest:

./ib2011ux -Lib2011 <mijnsofinummer>.ibv2011

ClamAV

Om een of andere reden deed de Virus Scanner GUI niet helemaal wat ik wil (sommige folders worden niet goed verwerkt, zoals .thunderbird); iets wat overigens in Ubuntu 12.04 opgelost lijkt te zijn. Dus toen maar met de hand (clamscan is de engine voor de clamtk user interface; freshclam is het commando om de database bij te werken):

/usr/bin/clamscan -r --cross-fs=no --phishing-cloak=yes --max-filesize=100M --block-encrypted --detect-broken --infected --bell .thunderbird

Geeft een output als hieronder (er zit blijkbaar een encrypted pdf in een van mijn mails, kan natuurlijk; zou een virus kunnen bevatten):

.thunderbird/3yxtfx8l.default/Mail/Local Folders/2009_kees_in: Heuristics.Encrypted.PDF FOUND
.thunderbird/3yxtfx8l.default/training.dat: Heuristics.Broken.Executable FOUND
----------- SCAN SUMMARY -----------
Known viruses: 1143729
Engine version: 0.97.3
Scanned directories: 194
Scanned files: 2241
Infected files: 2
Data scanned: 1064.23 MB
Data read: 761.91 MB (ratio 1.40:1)
Time: 124.906 sec (2 m 4 s)

Nog wat losse opdrachten

Remove programs

Om een programma te verwijderen kan je normaal het software center gebruiken. Soms werkt dat niet, en moet je het handmatig doen. Vind eerst de preciese program name met dpkg --get-selections | grep <naamfragment>, en dan verwijderen met sudo apt-get remove <volledige_naam> (of met sudo dpkg -r <volledige_naam>).

Diversen

Wat restjes die niet in de andere groepen thuis horen:

sudo shutdown -r now
mediatomb -e eth0 -p 49153 -a /<toe_te_voegen_dir>
tkdiff .mediatomb/config.xml Temp/config_nslu.xml
gksu gconf-editor
pngcrush -brute but_load.png but_load_new.png
sudo cp newwallpaper.jpg /usr/share/backgrounds; sudo gedit /usr/share/gnome-background-properties/precise-wallpapers.xml
gdialog --msgbox "hallo" 6 20
ping `zenity --title "Select Host" --entry --text "Select host you like to ping"`
sudo netstat -anltp ; # list open tcp/ip sockets
sudo mount -t iso9660 -o loop "<path>/image.iso" /mnt/image; # mount an iso image
sudo -i; gedit /etc/sysctl.d/10-magic-sysrq.conf; # en kernel.sysrq = 500 voor Alt-Sysreq-rev(BUSIER)
sudo fstrim -v / ; # SSD ruimte reclaimen (speed improvement)
gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf [...] lastfile.pdf; # plak PDFs aan elkaar
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf; # comprimeer PDF