Ubuntu Shell Commands

26 Dec 2019

The Ubuntu operating system is a popular operating system, however often accessing a gui is either not appropriate or simple not available. These command line operations help the administration and use of an Ubuntu host.

File systems

Ubuntu can use a range of different file systems, however here are the most typical

Concepts and Glossary

Term Meaning
Symbolic Link - can cross the file system,
- allows you to link between directories,
- has different inode number and file permissions than original file,
- permissions will not be updated,
- has only the path of the original file, not the contents.
Hard link -can’t cross the file system boundaries (i.e. A hardlink can only work on the same filesystem),
- can’t link directories,
- has the same inode number and permissions of original file,
- permissions will be updated if we change the permissions of source file,
- has the actual contents of original file, so that you still can view the contents, even if the original file moved or removed

Shells such as bash, csh, ksh and dash are implementations of the POSIX standard. POSIX Standard

The implementation used by default on a system is determined by either a symbolic link or hard link on the file /bin/sh which points to a POSIX implementation.

Command Line Description
file -h /bin/sh (Symbolic link) A portable way to determine which shell is being used by a system
find -L /bin -samefile /bin/sh (Hard link) A portable way to determine which shell is being used by a system

Basic

Command Line Description
ls directory listing
ls -al formatted listing with hidden files
cd directory change directory to dir
cd or cd ~ change to home
pwd show current directory
mkdir directory create a directory dir
rm file delete file
rm -r directory delete directory dir
rm -f file force remove file
rm -rf directory force remove directory dir *
cp file1 file2 copy file1 to file2
cp -r dir1 dir2 copy dir1 to dir2; create dir2 if it doesn’t exist
mv file1 file2 rename or move file1 to file2
if file2 is an existing directory, moves file1 into directory file2
ln -s file link create symbolic link link to file
touch file create or update file
cat file show the text characters within a file
cat > file places standard input into file
more file output the contents of file
head file output the first 10 lines of file
tail file output the last 10 lines of file
tail -f file output the contents of f
man topic man pages provide command line help documentation for most commands. e.g. man ls to learn more about the ls command
nano file minimalist editor with cli gui
vi file (vim) powerful minimalist editor with no gui
Command Line Description  
grep pattern files search for pattern in files  
grep -r pattern dir search recursively for pattern in dir  
grep -iRl ‘pattern’ dir searches recursively for a literal in files within dir, listing file names only  
command grep pattern search for pattern in the output of command
locate file find all instances of file  
find . -name filename.txt searches for files called filename.txt in current directory and subdirectories  
find path -name *.txt searches for any text files with txt extension in path and it’s subdirectories  
find path -type f -empty searches for empty files  
find path -user username -mtime -7 -name *.txt searches for txt files modified by user in the last 7 days.
Note: -7 means today minus 7, not an argument flag to find itself.
 

Compare

Package Tools
sudo apt install diffutils cpm diff diff3 sdiff
Command Line Description
diff [options] from_file to_file Compare 2 files
diff3 [options] file_1 file_2 file_3 Compare 3 files
sdiff -o out_file [options] from_file to_file Compare 2 files and merge interactively

System Details

Command Line Description
date show the current date and time
cal show this month’s calendar
uptime show current uptime
w display who is online
whoami who you are logged in as
finger user display information about user
uname -a show kernel information
cat /proc/cpuinfo cpu information
cat /proc/meminfo memory information
df show disk usage
du show directory space usage
free show memory and swap usage
whereis app show possible locations of app
which app show which app will be run by default
lsusb list usb devices
dmesg show recent system log messages

Disk

Command Line Description
df List all file systems and display the free disk space, and used disk space for each
df /path Find free disk space on the device a path
echo 'Hello, World!' > /dev/device_path Used while device is unmounted, will permit the device to be used to persist data even without a file system.
! This is a destructive operation!
head -n 1 /dev/sdx Read from an unmounted device, even when the device has no filesystem.
sudo mount /dev/device_path /path/mount_point Mounts a device on a mount point
sudo umount /dev/device_path Unmounts a device using the device path. Typically /dev/device_name e.g. /dev/sd[a-z] for disks and /dev/sd[a-z][0-9] for partitions
sudo umount /path/mount_point Unmounts a device using the mount point.
dd if=/dev/device_path of=output_image_path.img Backup a device, creating an image of disk device.
!! This is a destructive method, overwriting the output image path !!
dd if=input_image_page.img of=/dev/device_path Restore a device, using an image to overwrite the current device content.
!! This is a destructive method, erasing the device !!
1. losetup -f then
2. losetup /dev/loop[0-9] /image/path.img then
3. mount /dev/loop[0-9] /mnt/path
Mount an image file (in 3 steps).
1.Find the next available loop device
2. Associate loop device with image file
3. mount loop device at mount point
1. losetup -f then
2. losetup -P /dev/loop[0-9] /image/path.img then
3. mount /dev/loop[0-9]p[0-9] /mnt/path
Mount a partition from an image file (in 3 steps).
1.Find the next available loop device
2. Associate loop device with image file, where each partition will be given a loop device name like /dev/loop[0-9]p[0-9]
3. Mount loop device (representing a single partition) at mount point
1. umount /mnt/path
2. losetup -d /dev/loop[0-9]
Unmount a device (in 2 steps).
1. Unmount the mount path
2. Disassociate the loop device from any current image file.
lsblk List block devices, also showing mount points and volume sizes
sudo fdisk -l Lists
1. disks, getting the device name, disk label, size, sectors, units, sector sizes and i/o sizes
2. Partitions and their device name, Boot flag, Start Offset, End Offset, Sectors, Size, Id, Type
sudo fdisk -l | grep ‘^Disk /’ List all disks, including loop disks
fsck /dev/device_path !Use while unmounted only!
Checks a disk for consistency errors, and automatically attempts to resolve the errors found
fdisk /dev/path Partition a device, interactively.
m - print help
p - print partition table
n - create a new partition table
d - delete a partition
q - quit without saving changes
w - write new partition table to the device and exit
mkfs.ext3 /dev/device_path[0-9] Format the device with a EXT3 file system type
mkfs.ext4 -L myExt4Drive /dev/sdx1 Format the device with a EXT4 file system type. Flag -L adds a label for the file system. May be inappropriate for portable devices, as it maintains file permissions
mkfs.exfat -n myExFatDrive /dev/sdx1 Formats the device /dev/sdx1 and makes a exFAT file system on the device
sudo e2label /dev/sda1 new_label Updates the current label on the disk partition
find /path/to/folder -size 0 -type f List all files with zero (0) file length and delete them. Note: -print flag may be required on some OS.
sudo find /path/to/folder -size 0 -type f -delete Remove all files with zero (0) file length and delete them. The sudo elevation is required for deletions on protected file systems.

Compression

Command Line Description
tar cf file.tar files create a tar named file.tar containing files
tar xf file.tar extract the files from file.tar
tar czf file.tar.gz files create a tar with Gzip compression
tar xzf file.tar.gz extract a tar using Gzip
tar cjf file.tar.bz2 create a tar with Bzip2 compression
tar xjf file.tar.bz2 extract a tar using Bzip2
gzip file compresses file and renames it to file.gz
gzip -d file.gz decompresses file.gz back to file

Processes

May require elevation to modify processes not owned by the current user

Command Line Description
ps display your currently active processes
ps -ax display all processes currently active on a system
top display all running processes
kill pid kill process id pid
killall proc kill all processes named proc *
bg lists stopped or background jobs; resume a stopped job in the background
fg brings the most recent job to foreground
fg n brings job n to the foreground

Command Chaining Syntax

Command Line Description
op1 && op2 execute op1 and then op2 immediately after op1 completes, if and only if op1 returns zero (0)
op1 || op2 execute op1, and then op2 immediately after op1 completes, if and only if op1 returned non-zero

Privileges

Command Line Description
sudo command run a command as a root user
sudo su switch to a shell which is elevated to root user
sudo -s open a root user shell (same as above)
sudo -s -u username open a user shell as username
sudo -k forget sudo passwords (prevents sudo privileges persisting in the current shell. e.g. remote assistance)
gksudo command opens a gnome sudo dialog
kdesudo command opens a kde sudo dialog
passwd change your password
chmod permissions file change to rights on a specific file or directory.
See ‘man chmod’ for permissions
chown user:group file change ownership of a specific file or directory, to a provided user and/or group. See ‘man chown

Display

Command Line Description
sudo /etc/init.d/gdm restart restart X window manager and display login
sudo /etc/init.d/kdm restart restart X window manager and display login
(file) /etc/X11/xorg.conf X11 display configuration

System Services

sudo start service sudo stop service sudo status service /etc/init.d/service start | start service /etc/init.d/service stop | stop service /etc/init.d/service status | display service /etc/init.d/service restart | restart service runlevel | gets the current runlevel

Network

Package Utilities
sudo apt install wireless-tools iwconfig iwlist iwspy iwpriv ifrename
sudo apt install net-tools ifconfig hostname domainname nmap arp rarp netstat iptunnel ipmaddr route dnsdomainname nisdomainname ypdomainname slattach
Command Line Description
ifconfig show network details
iwconfig show wireless information
sudo iwlist scan scan and list wireless networks
sudo /etc/init.d/networking restart restart network, used for manual configuration
(file) /etc/network/interfaces manual configuration
ifup interface bring interface up
ifdown interface bring interface down
ping host ping host and output results
whois domain get whois information for domain
dig domain get DNS information for domain
dig -x host reverse lookup host
wget file download file
wget -c file continue a stopped download
sudo /etc/init.d/dns-clean start flush dns cache
sudo systemd-resolve –flush-caches flush dns caches
sudo systemd-resolve –statistics validate dns cache size
traceroute host traces the route to a host machine
sudo netstat -plnt list active listening sockets with PID
sudo netstat -plnt | grep ‘:80’ list active listening sockets with PID on port 80
nmap -sP 192.168.2.0/24 List all devices on the network
nmcli dev wifi View a list of the available WiFi networks, transfer rate, signal strength and security
wpa_passphrase ssid passkey » wpa_supplicant.conf Note: Suitable for a Raspberry Pi, not Ubuntu appends a new SSID and passkey combination to the wpa_supplicant.conf, using encryption to store the passkey in an form which avoids plain text

Firewall

Command Line Description
ufw enable enable firewall
ufw disable disable firewall
ufw default allow allow all connections by default
ufw default deny deny all connections by default
ufw status display current firewall status and rules
uwf allow port allow port
ufw deny port deny port
ufw deny from ip deny specified ip address

Secure Shell - SSH

Command Line Description
ssh user@host connect to host as user
ssh -p port user@host connect to host on port port as user
ssh -R listening_port:localhost:22 remote_user@remote_host -i key.pem Enable SSH Tunnelling on a machine, establishing communication through which a reverse connection can be made.
ssh listening_user@localhost -p listening_port Connect to listening SSH Reverse Tunnel
ssh-copy-id user@host add your key to host for user to enable a keyed or passwordless login
sshfs user@host:/remote/path /local/path mount a remote path to a local path using ssh

Package Management

Command Line Description
apt-get update retrieve list of available packages
apt-get upgrade upgrade all packages
apt-get dist-upgrade upgrade Ubuntu version
apt-get install pkg install package pkg
apt-get purge pkg uninstall package pkg
apt-get autoremove remove all obsolete packages
apt-get -f install fix broken packages
dpkg –configure -a fix broken packages
(file) /etc/apt/sources.list all apt packages configuration
snap find package searches for a snap package named package
sudo snap install package installs a snap package named package
snap list display list of installed snaps
sudo snap refresh package attempt to get latest version of snap package
sudo snap refresh update all snap packages
sudo snap revert package rollback to the previous version of a snap package

Snippets

Reverse SSH Tunnel

To enable a persistent SSH Reverse Tunnel, use autossh rather than ssh as it will attempt to reestablish the tunnel open, if the connection is lost.

Prerequisite: sudo apt install autossh

  1. Create and add the following to /etc/systemd/system/autossh.service Note: the argument flags -t -t ensures the SSH pseudo terminal is not rejected

     [Unit]
     Description=Auto Reverse SSH
     Requires=systemd-networkd-wait-online.service
     After=systemd-networkd-wait-online.service
     [Service]
     ExecStart=/path/to/autossh -i /path/to/key.pem -R <port>:localhost:22 ubuntu@<remote.fqdn.host> -t -t
     [Install]
     WantedBy=multi-user.target
    
  2. Enable using sudo systemctl enable autossh.service to ensure it starts on the next boot

  3. Start the service immediately, rather than wait for the next boot using sudo systemctl start autossh.service Note: the .service is not mandatory here and can be dropped but rather used to demonstrate what is really being done by systemctl

  4. Check the status using systemctl status autossh to ensure that the service has correctly established the connection. Look for a line beginning with Active: active (running) to indicate succes. If a failure has occurred, the easiest way to find it is using the command journalctl | grep autossh.

Shell Alias shortcuts in .profile

If there are operations which are regularly typed into the shell or which are complex, specific and/or verbose, you can add an alias into your .profile file.

  1. Add a record to your ~/.profile file as follows
  alias pstree="ps axjf"
  1. Log out of the account, exit and log back in again

  2. In command shell type pstree to see the system process in a hierarchical tree

  3. To see all aliases which are defined just type alias