Introduction to the shell

The shell is for most Unix users the main interface to an Unix-based system like Linux or Mac OS X. The shell is a command line interface to the system and comes in different flavors like bash, tcsh, ksh, zsh, etc. While multiple shells exist, the most popular shells used are bash for interactive use and sh for system scripting.

A lot can be configured in the shell, for example the prompt. The prompt is the string that is displayed before the command line and can be changed by modifying the PS1 variable. The prompt normally also shows the current working directory and the current user, but this is a convention. A second convention is that if the prompt ends with a #, then your in a shell with root privileges and when it ends with a $, then you are in a shell with normal user privileges.

# whoami

$ whoami

This convention is used in all examples on this site together with the assumption that the user is logged in as user01 and is by default located in the /home/user01 directory.

Sudo and su

Every shell is running under the account that was used to login with. This account also refered to as an user is member of a primary group that is required, and can also have up to 16 or 32 secondary groups depending is Network File System (NFS) is used or not.

With the command id you can get the primary group and the secondary groups of the user that is currently logged in.

$ id
uid=1000(user01) gid=1000(user01) groups=1000(user01)

The command can also be extended to get the groups of other users defined on the system as is show below for the user root.

$ id root
uid=0(root) gid=0(root) groups=0(root)
# whoami
$ su root
$ su - root
$ su - root -c "env"
$ su root -c "env"
$ sudo -l
$ sudo su -
$ sudo cat /var/log/messages
$ sudoedit /etc/hosts

Monitoring the system and processes

Process state:

  • D - Uninterruptable Sleep

  • R - Running or Runnable

  • S - Sleeping

  • T - Stopped or Traced

  • Z - Zombie

$ uptime
$ w

Showing who is logged on

$ who

cat /proc/cpuinfo

$ lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  4
  On-line CPU(s) list:   0-3
Vendor ID:               GenuineIntel
  Model name:            Intel(R) Core(TM) i5-6260U CPU @ 1.80GHz

Showing processes

$ ps -ef
$ pstree
$ pgrep <process name>

Process priority

Default value is 0

  • 0-19: can be set by the user

  • -20- -1: can only be set by root

$ nice <command>
$ nice -n 15 <command>
$ renice -n 7 <PID>
$ renice -n 7 $(pgrep <process name>)

Working with files

Archiving and compression

# tar cf archive.tar file1 file2 file3
# tar cf /root/etcbackup.tar /etc
# tar tf /root/etcbackup.tar

Compression methods:

  • z - gzip

  • j - bzip

  • J - xz

# tar czf /root/etcbackup.tar.gz /etc
# tar cjf /root/logbackup.tar.bz2 /var/log
# tar cJf /root/sshbackup.tar.xz /etc/ssh
# mkdir /root/logbackup
# cd /root/logbackup
# tar xjf /root/logbackup.tar.bz2
# mkdir /root/etcbackup
# cd /root/etcbackup
# tar xf /root/etcbackup.tar


Copy a file to a remote host:

$ scp /etc/sudo.conf /etc/sudoers server02:/tmp

Copy a file to a remote host as root:

$ scp /etc/sudo.conf [email protected]:/tmp

Copy a file from a remote host as root to the current directory:

$ scp [email protected]:/tmp/sudo.conf .

indien je hele directories wilt overzetten moet je de -r vlag meegeven:

With the -r flag scp will copy the contents of the directory:

$ scp -r /etc [email protected]:~


$ sftp [email protected]
[email protected]'s password:
Connected to localhost.

sftp> ls
bin output
sftp> mkdir test
sftp> cd test
sftp> put /etc/hosts
Uploading /etc/hosts to /home/user/test/hosts
/etc/hosts 100% 510 0.5KB/s 00:00


Rsync is a fast, reliable, efficient, secure, and portable file transfer. The example below will copy the contents of the directory /etc to the directory /srv/rsync/etc/:

$ rsync -av /etc /srv/rsync

The example below will copy the contents of the directory /etc/ to the directory /srv/rsync/:

$ rsync -av /etc/ /srv/rsync

Copy log files from server01 to /tmp on the current host:

$ rsync -av server01:/var/log /tmp

Remote login with SSH keys

$ ssh-keygen
$ scp ~/.ssh/ [email protected]:~/.ssh/
$ cd .ssh
$ cat >> authorized_keys
$ ssh-copy-id [[email protected]]remotehost