Remember back in the days of college when you were allowed to make one sheet of notes for math exams? Well, think of this as a cheat sheet for you Linux exam. Note that commands that need to be executed as root are prefixed with #> whereas commands that can be run by any user have the prefix $>.

System Info

  • check Linux version

$> cat /etc/issue
$> lsb_release -a
  • system product name, serial number, and sku number

#> sudo dmidecode -s system-product-name
#> sudo dmidecode -s system-serial-number
#> sudo dmidecode -s system-sku-number
  • output date for a given unix timestamp

$> date -d @1231597505

CD/DVD Manipulation

  • show cd-burner/cd-reader devices

$> cdrecord -scanbus
  • show cd device information, including read/write speeds, presence of disk

$> readcd -dev 0,0 -sectors=0-0 -f=/dev/null
  • burn an ISO Image

$> cdrecord -v -eject -dao -dev=1,0 -speed=10 -driveropts=burnfree cdimage.iso
  • copy audio cd (no cdrdao)

$> cdda2wav -vall cddb=0 -D0,0 -B -Owav
$> cdrecord -v dev=1,0 -dao -useinfo -text -driveropts=burnfree *.wav
  • copy data cd (no cdrdao)

$> readcd -dev 0,0 -f=cdimage.raw
$> cdrecord -v -eject -dao -dev=1,0 -speed=10 -driveropts=burnfree cdimage.raw
  • direct cd copy (cdrdao)

$> cdrdao copy --source-device 0,0,0 --device 0,1,0 -n --buffers 32 --on-the-fly
  • raw device cd copy (cdrecord) risky

$> cdrecord -v dev=1,0 -isosize /dev/cdrom0
  • rip DVD vob file to disk

$> vobcopy -l /dev/dvd

Filesystems / Disks

  • find broken symlinks

$ find -L . -type l
  • include dot files in '*' pattern (for easily moving or copying all files in a directory)

$> shopt -s dotglob
  • match all files including dot files (without setting dotglob shopt)

$> ls .[^.]* *
  • delete all files named "target"

$> find . -name 'target' -delete
  • copy files like rsync (preserve file properties and only update files if source is newer)

$> cp -aRu src dest
  • format a removable device into FAT32

$> mkdosfs -F 32 /dev/sdaX
  • make a bootable cd image (ISO) from bootable floppy image (easy way) note: -b specifies the source file

$> mkisofs -pad -b floppy.img -R -o /tmp/cd.iso /tmp/floppy.img
  • make a bootable cd image (ISO) from a directory (won’t include directory name)

$> mkisofs -J -r -o cd.iso burnme/
  • setting up a disk: format with filesystem, then create a partition (using curses fdisk)

$> mkfs.ext3 -L LABEL /dev/sda; cfdisk
  • list hidden directories sorted by size

$> du -s .[^.]* | sort -rn
  • view S.M.A.R.T. information for ATA or SCSI harddisk

#> smartctl -a /dev/hda
  • run short test on disk using S.M.A.R.T

#> smartctrl -t short /dev/hda
  • view results of S.M.A.R.T disk check

#> smartctl -H -l selftest /dev/hda
  • watch files changing in a directory

$> watch "ls -s"
  • delete files older than 7 days

$> find . -type f -mtime +7 | xargs rm -f
 * overwrite your hard disk with random characters
$> dd if=/dev/random of=/dev/sda
  • discover and mount lvm volumes: Accessing Logical Volumns (Ubuntu)

  • perform operation on files with possible space in name; read will read to the end of the line and enclosing the result within quotes escapes the spaces

$> find . -type f |grep .ext$ | while read file do
   cmd "$file"
  • find broken symlinks

$> find . -type l | while read i ; do test -e "$i" || ls -l "$i"; done
  • fstab mount for samba/windows share

//hostname/sharename /home/$USER/mount/sharename smbfs users,credentials=/home/$USER/.smb.cnf,uid=$USER,gid=$USER 0 0
  • Create a zip file named using the contents of the directory foo excluding any SVN directories

$> zip -r foo -x \*.svn/*


  • record realmedia streams to disk with vsound

$> vsound -f output.wav -t realplay test.rm
  • record realmedia streams to disk with mplayer

$> mplayer -dumpstream rtsp://whatever/stream.rm
  • record rtsp streams to disk with mencoder (use mplayer-plugin’s "Copy URL" feature to capture the url)

$> mencoder rtsp://whatever/stream.wmv -ovc copy -oac copy -o output.wmv
  • encode rtsp steams to disk with mencoder (use mplayer-plugin’s "Copy URL" feature to capture the url)

$> mencoder rtsp://whatever/stream.wmv -ovc lavc -oac mp3lame -o output.avi
  • convert wma files to ogg (requires win32 codecs)

$> for i in *.wma; do mplayer -ao pcm -aofile "${i%.wma}.wav" "$i"; oggenc "${i%.wma}.wav"; rm "${i%.wma}.wav"; done
  • record from line-in (or microphone) to mp3 (you will need to adjust your capture volume level)

$> arecord -f cd -t raw | lame -r - out.mp3
  • disable screensaver (can be put in a loop shorter than screensaver interval to keep it dead); mplayer also has a disable option

$> gnome-screensaver-command -deactivate
  • Convert recordmydesktop ogv file to flv

$> ffmpeg -i input_file.ogv -b 1600k -ar 11025 output_file.flv


$> Set which program opens when media (CD, DVD, Digital Camera, etc) is inserted in Gnome
  • Open up Nautilus, select Edit > Preferences from the menu and set the program to handle each event in the Media tab

Package Management

  • find which package owns a file

$> rpm -qf /path/to/file
  • query rpm packages by short name

$> rpm -qa --qf "%{NAME}\n"
  • list installed rpm names sorted by size

$> rpm -qa --queryformat '%10{SIZE} %{NAME}\n' | sort -n -r
  • reinstall an rpm

$> rpm -Uvh --replacepkgs rpm_packagename.rpm
  • build an rpm from a tarball

$> rpmbuild -tb application.tar.gz
  • show all tags available for rpm queryformat

$> rpm --querytags
  • show all rpms (name, version-release, installed date)

$> rpm -qa --qf "%{NAME}\t%{VERSION}-%{RELEASE}\t%{INSTALLTIME:date}\n" | sort
  • show all rpms (name, installed date) by recently installed

$> rpm -qa --last
  • Import a GPG key into the RPM repository (ascii public key)

#> rpm --import
  • Extract files from an rpm archive (into current directory)

$>  rpm2cpio package.rpm | cpio -idmv --no-absolute-filenames
  • Hold back packages (space separated) from being updated by yum in /etc/yum.conf

$> exclude=packagename1 packagename2
$> ./configure make checkinstall
  • Hold back a debian package from being upgraded

$> echo "firefox hold" | dpkg --set-selections

Text Manipulation

  • append "content" as root to file "target-file" using sudo

$> echo "content" | sudo tee -a target-file > /dev/null
  • convert DOS text file format to UNIX, specifically endlines (part of sysutils debian package)

$> fromdos FILE
  • remove unprintable characters, except for spaces

$> cat file-in.txt | tr -d -c [:print:][:space:] > file-out.txt
  • find and replace text in a set of files

$> find -type f -exec sed -i 's/search/replace/' {} \;
  • occationally the terminal will get out of whack; one simple command can make it work as expected again

$> reset
  • apply a patch, removing files that are marked as deleted in the patch, with a fuzz factor of 2

$> patch --dry-run -F 2 -E -p0 < patch.txt
  • open file in vim so you can see the BOM

$> vim -b file-with-bom
  • find non-ascii characters in a file

$> grep -P -H -n "[^[:graph:][:space:]]" FILE

Bash & Shell

  • test bash script for syntax without executing

$> bash -n
  • glob matching all the files in a directory, including hidden files (files that begin with .)

$> * .[^.]*
  • run command, bypassing any alias

$> \command


  • jump to a byte offset in the buffer (a file)

$> :go 456


  • Remove file(s) from git history

$> git filter-branch --index-filter 'git rm --cached  --ignore-unmatch <file>' HEAD
$> rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune


  • Check files which have changed after a specified date

$> cvs log -NS -R -d ">YYYYMMDD"
  • Run synchronization report

$> cvs -nq update -Pd 2>&1 | grep -v "cvs update: New directory"
  • Synchronize with repository

$> cvs -q update -Pd 2>&1 | grep -v "cvs update: New directory"


  • Merge a feature branch into the trunk (with dry run option)

$> cd trunk
$> svn merge --dry-run -r BASE:HEAD http://svnhost/path/to/branch
  • Specifying username for svn+ssh other than login name

$> export SVN_SSH='ssh -l username'; svn commit filename
  • When doing an import, you have include the directory name that you want to create

$> svn import new-project

Maven 2

  • Create an empty web application project

$> mvn archetype:create -DgroupId=com.mycompany.myapp -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-webapp
  • Synchronizing select directories from a maven mirror

$> rsync -azv --include /sf --include /sf/saxon --exclude "/*" --exclude "/*/*/" rsync:// ./


  • Change root user password

$> /usr/bin/mysqladmin -u root -p password 'new-password'
  • Give user access to all tables

mysql> GRANT ALL PRIVILEGES ON *.* TO some_user@localhost IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
  • Change password for existing user

mysql> SET PASSWORD FOR 'user'@'hostname' = PASSWORD('passwordhere');
  • Reset auto-increment value for table

mysql> ALTER TABLE tbl_name AUTO_INCREMENT = 1;
  • Backup a single database

$> /usr/bin/mysqldump --complete-insert --add-drop-table --lock-tables --user=username -p database > backupfile.sql
  • Cancel a partially typed query

mysql> select * from \c
  • Display results as records rather than in tabular form

mysql> select * from table \G

Services & Run Levels

  • Add a system startup service in Debian (where servicename is the name of the startup script)

#> /usr/sbin/update-rc.d servicename defaults
  • Remove a system startup service in Debian (where servicename is the name of the startup script)

#> /usr/sbin/update-rc.d -f servicename remove
  • Shutdown (halt) a system

#> halt
  • Reboot a system

#> shutdown -r
  • Go to another runlevel (in this case 3)

#> telinit 3


  • Setting the system hostname (be sure to add it to /etc/hosts as well)

#> echo > /etc/hostname; /bin/hostname -F /etc/hostname
  • notify KDE of change in hostname

$> kdontchangethehostname old_hostname new_hostname
  • check if a host is available (for a given port)

$> nc -z hostname 22 -w 1 >/dev/null 2>&1 && echo connected!
  • Find computers on local network with an open SSH port

$> nmap -p 22 --open -sV
  • Access a local computer when connected to the VPN

$> ssh hostname.local


  • After updating the /etc/aliases file, it is necessary to update the database using

#> newaliases

Job Control

  • Where’s my crontab?

$> /var/spool/cron/$USERNAME
  • Start a job in the background, disconnected from terminal (joblist is a file with a list of commands)

$> at -f joblist now
  • Crontab Syntax

  • Kill processes matching a pattern (where $PATTERN is the search string)

$> ps -e -opid,command | grep $PATTERN | awk '{print $1}'| xargs kill -9
  • Prevent command from exiting even if you disconnect from the shell

$> nohup command
  • Watch the output of a command as its results change in real time

$> watch df

Kernel Modules

  • Disable USB 2.0 (to prevent autoloading, add it to /etc/hotplug/blacklist)

#> rmmod ehci_hcd
  • After removing a loadable module, be sure to run /sbin/depmod to update the dependencies and module load sets

Apache Configuration

  • In order to strip the query string when using mod_rewrite, append a ? to the end of the redirect and the query string will be dropped

RewriteRule ^oldpath/index.php$ /newpath/index.php? [R=301,L]


  • Pass an option to SSH (in this case don’t allow a regular password prompt)

$> ssh -oNumberOfPasswordPrompts=0 user@hostname
  • Copy public rsa key directly into authorized_keys2 file on remote host

$> cat ~/.ssh/ | ssh $USER@$REMOTE_HOST "cat >>~/.ssh/authorized_keys2"
  • Another way to copy public rsa key around:

$> ssh-copy-id -i ~/.ssh/ $USER@$REMOTE_HOST
  • Establish an ssh tunnel using a local port to route traffic to a remove service

$> # an example with real values to tunnel SMTP traffic through SSH using an alternate port
$> ssh -L 8025:localhost:25 -f -N
  • Setup a proxy tunnel, so that you can access the internet through another computer

$> ssh -f -N -2 -C -D 4567 $USER@$REMOTE_HOST
$> ssh -R $TUNNEL_PORT:localhost:22 -f -N $USER@$REMOTE_HOST
  • Connecting to reverse ssh tunnel

$> ssh -p $TUNNEL_PORT localhost
  • Tunnel HTTP traffic through reverse ssh tunnel

$> ssh -L $LOCAL_LISTEN_PORT:localhost:80 -f -N -p $TUNNEL_PORT $USER@localhost

Note: If you are going to use tunneling from different hosts, it might be convenient to set the ssh_config variable NoHostAuthenticationForLocalhost to yes to prevent those nasty messages

X Windows / Graphics

  • Take a screenshot, with optional delay

$> sleep 3s; import -window root screenshot.png
  • Get window information (particularly id)

$> xwininfo
  • Rearrange desktop icons in KDE

$> dcop kdesktop KDesktopIface rearrangeIcons
  • Enable the nvidia driver

$> sudo nvidia-glx-config enable
  • Restart X within a session

  • Restart X from login screen (xdm/gdm/kdm)