Linux Command-Line Tutorial

The following tutorial teaches you essential skills that make navigating your way at the shell simple.

A shell is a user interface used as a command-line interpreter. In Linux, the shell is the interpreter that allows you to interact with the operating system using various commands.

The focus of commands in this tutorial is based on how they are used in Bash, also known as the Bourne Again shell.

The login terminals in Linux are virtual terminals. Most Linux systems are configured with six standard command-line virtual terminals. These terminals are numbered from 1 to 6.

You can switch between virtual terminals with an ALT-function key combination. For example, ALT-F2 brings you to the second virtual terminal. You can switch between adjacent virtual terminals by pressing ALT-RIGHT ARROW or ALT-LEFT ARROW. For example, to move from virtual terminal 2 to virtual terminal 3, press ALT-RIGHT ARROW. If you are in a GUI virtual terminal, add the CTRL key. If the GUI is installed and you are in the first virtual terminal, you would press CTRL-ALT-F2 to get to the second virtual terminal.

Virtual terminals bring the multi-user capabilities of Linux to life. You might review a man page on one terminal, edit a configuration file in another, and monitor a log file in a third virtual terminal.

Linux uses three basic data streams. These streams are known as standard input (stdin), standard output (stdout), and standard error (stderr).

You can redirect each of these streams to or from a file. For example, if you have a relational database management system (RDBMS) named mysql and a file named schema.sql, the contents of that file can be sent to the RDBMS with a left redirection arrow (<). As shown here, schema.sql is taken as standard input:

mysql < schema.sql

Standard input can come from the left side of a command as well. For example, you can input a file into a RDBMS with a pipe:

cat schema.sql | mysql

Standard output is just as easy to redirect. For example, the following command uses the right redirection arrow (>) to send the standard output of the mysqldump program to the file named backup.sql:

mysqldump > backup.sql

You can append standard output to a file with a double redirection arrow. For example:

echo “line 1” > file

echo “appended line 2” >> file

echo “appended line 3” >> file

If you want to save the error messages of a program into a file, redirect the error stream from it with a command such as the following:

program 2> errors.log

Command substitution allows you to assign the output of a command to a variable. To redirect the output of a command to a variable, use the command within the $( ) function. For example, the following commands demonstrate how command substitution, using the date command, is used to create a backup directory with MMDDYY format and backup a home directory:

mkdir -p /backup/username/$(date +%m%d%y)

cp -a /home/username/. /backup/username/$(date +%m%d%y)

In any Bash session you can go through the history of previous commands, using the UP- and DOWN-ARROW keys, and CTRL-R to make a search. You can also take advantage of text completion, which allows you to use the TAB key almost as a wildcard to complete a command, a filename, or a variable (if the text begins with the $ character).

The Filesystem Hierarchy Standard (FHS) is the official way to organize files in Linux directories. Every FHS starts with the top-level root directory, also known by its symbol, the single forward slash (/). All other directories are subdirectories of the root directory and are described as follows.

/bin contains command binaries for non-root users. /boot contains static boot loader files. /dev contains device files. /etc contains configuration files. /home contains user home directories. /lib contains essential shared libraries and kernel modules. /media provides a mount point for removable media. /mnt provides a mount point for a temporarily mounted filesystem. /opt contains application software packages. /proc contains an in-memory virtual filesystem listing information for currently running kernel-related processes, including device assignments such as IRQ ports, I/O addresses, and DMA channels, as well as kernel-configuration settings such as IP forwarding. /root contains the home directory of the root user. /run contains data relevant to running processes. /sbin contains command binaries for the root user. /srv contains site-specific data for services. /sys contains an in-memory virtual filesystem which provides information about devices, drivers, and some kernel features. /tmp contains temporary files. /usr contains shareable, read-only data which includes libraries, command binaries, local hierarchy, and architecture-independent data. /var contains variable data.

Many software packages include extensive documentation in the /usr/share/doc directory. Every subdirectory there includes information about the capabilities of each associated package.

Linux commands and configuration files are documented in a format known as the man page. Use the man man command to obtain information on using the man pages. Press q to quit. These manuals are located in the /usr/share/man/man1 directory. All files in this directory are compressed in .gz format. Nevertheless, the less command can read those files.

That points to the operation of the man command. In other words, these two commands are functionally equivalent:

man tar

less /usr/share/man/man1/tar.1.gz

The whatis command followed by what you are searching for searches the titles of man pages.

The apropos command followed by what you are searching for searches the description of man pages.

The list of available info manuals is somewhat limited. However, the coverage of some topics (for example, the Bash shell) is usually more extensive than a corresponding man page. For a full list of info documents, run the ls /usr/share/info command. When an info manual is not available, a request defaults to the associated man page. 

To learn more about the Bash shell, run the pinfo Bash command. pinfo has a user interface similar to the Lynx Web browser, and it is a more user-friendly alternative to the traditional info command.

Info manuals are organized into sections. To access a section, move the cursor to the asterisked entry and press ENTER. Press q to quit.

Familiarize yourself with the following commands. Study the command switches. These switches allow you to change the behavior of a command and are usually preceded by one or two dashes (such as cp -a or cp --archive). To quickly get help when using a command, simply add the --help switch.

The history command displays your command history, Each command is preceded by a number. To rerun a command, type an exclamation mark (!) followed by the number, and press ENTER.

The clear command clears the screen.

The uname command displays system information.

The timedatectl command displays or sets the system’s time and date.

The hostnamectl command displays or sets the system’s host name.

The sysctl command tunes kernel run-time parameters in the /proc/sys directory. To modify these parameters, edit the configuration files within the /usr/lib/sysctl.d directory, then use the sysctl -p command to reload the configuration.

The tar command, originally developed as a tape archiver, compresses and decompresses files and directories. The following command creates (-c) an archive, compresses it with xz (-J) compression, in verbose (-v) mode, with the filename (-f) that follows:

tar -cJvf /backup/username/$(date +%m%d%y).tar.xz /home/username

Use tar to extract (-x) that file with the following command:

tar -xJvf /backup/username/mmddyy.tar.xz /home/username

The crontab command is used to edit (-e), list (-l), and remove (-r) cron files. The word cron is derived from chronos, the Greek word for time. The cron system acts as a task scheduler and runs commands at set times. For example, to schedule a daily backup of your home directory, open the crontab for your user account with the crontab -e command, and enter the following (percent signs (%) in the command, unless escaped with a back slash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input):

@daily tar -cJvf /backup/username/$(date +\%m\%d\%y).tar.xz /home/username

The pwd command identifies (prints) the working directory.

The cd command changes directories. The cd command by itself navigates to your home directory. The tilde (~), which represents the active user’s home directory, is not required for that command. Another common shortcut is two consecutive dots (..) to represent the directory that is one level up in the hierarchy, therefore cd .. moves to the parent directory of the working directory. The cd - command quickly returns to your previous working directory.

The mkdir and rmdir commands make and remove directories respectively. Use the -p switch to include subdirectories. For example, mkdir -p dir1/dir2/dir3 and rmdir -p dir1/dir2/dir3.

The ls command lists files and directories. Use the ls command to reveal all (-a) hidden files, give you file or directory details with long (-l) listings, give you information on the working directory (-d), or on a directory that you pass as an argument (e.g., ls -ld dir1), sort by modification time (-t), and recursively (-R) list the contents of subdirectories. The ll command is a quick shortcut for long listings, as it is the equivalent of the ls -l command. When listing a large number of files and directories, use the ls | less command to scroll the listing.

The mv command renames files and directories. For example, the mv file1 file2 command changes the name of file1 to file2.

The cp command copies files and directories. The archive (-a) switch adds recursion and preserves attributes. For example, the cp -a /home/username/. /backup/username command copies all subdirectories of the username’s home directory along with associated files into /backup/username.

The dd command converts and copies files using the if (input file) and of (output file) options. For example, if a USB device is located on /dev/sdc, you can write the linux.iso file to the device with the dd if=linux.iso of=/dev/sdc status=progress command.

The ln command creates hard and soft links, which allow you to refer to files and directories using different names.

The rm command removes files and directories. The rm command is dangerous. At the command line, there is no trash bin. Get into the habit of using the GUI to delete files.

The vim command edits text files. Use the vim filename command to open a file, and if filename does not yet exist, it will be created as soon as you write (:w) the file. Search forward (/) or backward (?) followed by the search term. Automatically search for the next (n) occurrence after that. To navigate, you can use hjkl in place of the ARROW keys and CTRL-D/CTRL-U in place of PAGE DOWN/PAGE UP. Insert (i) text, or open (o) a new line, then press ESC to return to command mode. Undo (u) changes, discard (:q!) changes, write and quit (:wq), quit (:q), or get help (:help). You can start a tutorial with the vimtutor command.

The less command scrolls in both directions through a text file or data stream with the PAGE UP, PAGE DOWN, and ARROW keys. Search forward (/) or backward (?) followed by the search pattern. Press q to quit.

The echo command displays data to the screen.

The cat command concatenates files into one continuous output. For example, the cat file1 file2 > file3 command combines file1 and file2 into file3.

The diff command identifies the differences between two files or directories.

The grep command globally searches through a file or data stream using a regular expression and displays (prints) the result(s). For more information on regular expressions, type man 7 regex. For example, the grep pattern file1 command searches the file1 file for pattern.

The sed command provides a stream editor to search for and replace text in a file. For example, the sed -i “s|pattern1|pattern2|” file1 command replaces all instances of pattern1 with pattern2 in the file1 file.

The find command finds files based on certain options and expressions. For example, use the find /home/username -name "*.docx" command to find all files ending with a .docx extension in the /home/username directory.

The locate command quickly locates files and directories. Searches do not require a full name. Use the updatedb command to update the database of installed files and directories.

The useradd and groupadd commands add users and groups respectively.

The usermod and groupmod commands modify users and groups respectively.

The passwd command changes a user’s password.

The chgrp command changes the group owner of files and directories.

The chown command changes ownership of files and directories. Only the root user or those with super user privileges can change the owner assigned to a file or directory by using the chown command. The recursive (-R) switch applies changes to all files in a directory, including all subdirectories. For example, chown can be used to change only the user owner or both the user and group owner:

sudo chown -R username /home/username

sudo chown -R username:group /home/username

The chmod command changes mode for file and directory access permissions. Permissions are assigned the following numeric values: read (r) = 4, write (w) = 2, and execute (x) = 1 and can be added (+), removed (-), or set (=) to the exact mode for the user (u), group (g), and all other (o) users. Therefore, the following three commands are identical:

chmod u+rwx, go-rwx /home/username

chmod u=rwx, go= /home/username

chmod 700 /home/username

The getfacl command gets access control lists (ACLs) on files and directories.

The setfacl command sets access control lists (ACLs) on files and directories.

The su command opens a shell for the user. Use the su - username command to log in to the username account. 

The sudo command grants a user administrative privileges. For example, use the sudo reboot command to give a user permission to reboot the system.

The ps command displays a snapshot of currently running processes. For example, if a program were to suddenly hang, you might want to kill any associated processes. The ps aux | grep program command could then help you identify the process(es) you need to kill.

The pgrep command is also useful because it combines the features of ps and grep. In this case, the pgrep -a program command is functionally equivalent to ps aux | grep program.

The top command displays CPU/memory-intensive processes that are overloading your system. You can kill a process from the top task browser by pressing k and entering the process ID (PID) to kill (you must either be the owner of the process or have super user privileges). Press q to quit.

The kill and killall commands terminate currently running processes. For example, if top fails to kill a hung process, you can try the kill -s SIG PID command to send special signals to running processes, where SIG is one of the process signals listed with either the kill -l command or the man 7 signal command. When attempting to terminate a stubborn process, use INT (interrupts) or HUP (hangs up) signals if the default TERM (terminates if possible) signal does not work. Use the KILL (unconditionally terminates) signal as a last resort, as it can lead to corrupted files. Run the sudo lsof command to list open files and their processes prior to attempting to using the KILL signal. Use the killall command to terminate multiple processes running under the same name, or if you want to terminate a process by referring to its command name rather than its PID.

The renice command allows you to lower the priority of a process that is overloading your system. Use this command for critical processes you cannot afford to kill. Priority numbers range from -20 to 19. A negative number increases the priority, and a positive number decreases the priority. For example, the renice -n 10 PID command lowers the priority for the PID that is overloading your system.

The nmtui command uses Network Manager’s text-based user interface for managing network settings.

The nmcli command uses Network Manager’s command-line interface for managing network settings. Use the nmcli dev status command to display the status of network devices.

The ip command displays network settings. Use the ip address show command to show IP address information. Use the ip route command to display the routing table. The ip command is flexible. For example, the ip a s command is functionally equivalent to ip addr show or ip address show.

The iptables and ip6tables commands manage firewall rules and network address translation.

The nslookup command performs a name server lookup. For example, if example.corp is your LAN domain, the nslookup example.corp command verifies the operation of your local DNS server. If you experience an Internet connectivity problem, the nslookup google.com command verifies World Wide Web DNS resolution.

The ping and ping6 commands test network connectivity. You need to press CTRL-C to stop these commands.

The tracepath  and tracepath6 commands trace the path to a destination.

The ss command shows sockets on the local system. For example, the ss -patun command displays the PIDs (-p) running on all (-a) TCP (-t) and UDP (-u) sockets in numeric (-n) format.

The nmap command displays a network map of open ports. The nmap command provides a network mapper utility used for network port scanning. For example, to conduct a network security audit, scan the ports offering network services inside and outside your system's firewall:

sudo nmap 127.0.0.1

sudo nmap 192.168.0.1 

The systemctl command manages system services. Use systemctl to start, stop, restart, reload, enable, and disable services, as well as display their status. Use the systemctl list-units
--type=service --all | less
command to scroll all services.

The journalctl command displays the content of the system journal. By default, the journal log files are temporarily stored in a RAM ring buffer in the /run/log/journal directory. To enable persistent logging, edit the /etc/systemd/journald.conf configuration file, and set the Storage directive to persistent. Use the systemctl restart systemd-journald command to load the new configuration. Use the journalctl -f command to follow journal entries as they are added in real time.

The tail command is useful for monitoring a log file. For example, the tail -f /var/log/file.log command monitors the file.log log and displays new lines on the screen as new log entries are recorded.

The telnet command can verify the operation of a service. For example, use the telnet localhost 25 command to test the Postfix SMTP service.

The ssh command provides secure shell remote access. For example, ssh username@192.168.0.1.

The ssh command can be used to forward the output of a GUI application over a network. It works if the local system runs a X server while you call remote GUI client applications from remote systems. All you need to do is connect to the remote system with the -X switch. For example, the following command sequence starts the Network Manager Connection Editor, which provides a graphical network management tool for configuring network settings on the remote system:

ssh -X username@192.168.0.1

nm-connection-editor

The scp command securely copies files and directories remotely. For example:

scp file1 username@192.168.0.1:/home/username/Documents

The sftp command provides a secure FTP client.

The wget command uses the World Wide Web to get files.

The apt-cache command performs a search of package cache for available Debian-based packages. Use the apt-cache search pattern | less command to scroll the search results. Add the --full switch to show an in-depth package description.

The apt-get command manages Debian-based packages obtained from repositories. Use apt-get to update the package index files after you add a new repository, as well as install, upgrade, and remove packages. An update must be performed before an upgrade or dist-upgrade.

The dpkg command manages individual Debian-based packages. Use dpkg to install (-i) and remove (-r) packages, as well as list (-L) files installed to your system from packagename.

The yum command manages Red Hat-based packages obtained from repositories. Use Yellowdog Updater Modified (yum) to update the package cache with makecache after you add a new repository, as well as search for, list info for, install, erase, update, and upgrade packages. Use the yum search pattern | less command to scroll the search results. In many cases, problems with yum can be solved with the yum clean all command.

The rpm command manages individual Red Hat-based packages. Use the Red Hat Package Manager (rpm) to install (-i), erase (-e), and query (-q) packages. rpm queries can be used to provide detailed information (-qi) and list only configuration (-qc) files installed to your system from packagename.

The zypper command manages SUSE-based packages obtained from repositories. Use zypper to search for, list info for, install, remove, and update packages. Use the zypper search pattern | less command to scroll the search results.

The fdisk, gdisk, and parted commands manage partitions.

The pv*, vg*, and lv* commands manage physical volumes, volume groups, and logical volumes respectively.

The mkfs command makes a filesystem.

The fsck command performs a filesystem check.

The mount and umount commands mount and unmount a filesystem respectively. As for ISO files, the mount -o loop linux.iso /mnt command mounts the noted ISO file to the /mnt directory.

The df command displays filesystem disk space usage. Use the -h switch to display the sizes in a human-readable format.

The grub2-* commands manage GRUB, the GRand Unified Bootloader.

The logout command ends a login session on the system.

The reboot command reboots the system.

The shutdown command shuts down the system.