Linux Spiekbriefje
Mijn Linux spiekbriefje met belangrijke maar niet vaak gebruikte commando's...
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 -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*
Pas op, bij een distributie-update (dus bijvoorbeeld Ubuntu 16.04 naar 18.04) wordt de swap weer
opnieuw als encrypted ingesteld. Opnieuw uitzetten dus. Let op, bij mkswap veranderd de file
UUID, zorg dat ook /etc/fstab en /etc/initramfs-tools/conf.d/resume deze
nieuwe UUID gebruiken. Anders wordt booten hééééél traag. En even sudo update-initramfs
-u draaien...
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 --exclude "/home/me/temp/*" --exclude
"/home/me/pictures/*" /home/me/
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
Install/Remove programs
Programma installeren gaat normaal met sudo apt-get install
<programmanaam> . Heb je een losstaande download als .deb file,
gebruik dan sudo dpkg -i <package_naam> .
Om een programma te verwijderen kan je normaal het software center gebruiken. Alternatieven zijn
sudo apt-get remove <programmanaam> resp. sudo dpkg -r
<programmanaam> (gebruik purge om ook de configuratiebestanden te
verwijderen). Soms werkt dat niet soepel, en moet je meer 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> ).
Ps: desktop icons bevinden zich in ~/.local/share/applications (per user) en
/usr/share/applications (shared).
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 -dSAFER -dFirstPage=22
-dLastPage=36 -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 nice dd if=/dev/zero of=zero1.bin bs=16M count=64
# 1 Gbyte file with zero's
|