Ubuntu Command Line Quickstart
The Linux command line, sometimes called the terminal, is one of the most powerful tools available for computer system administration and maintenance. It is an efficient way to perform complex tasks accurately and much more easily than it would seem at a first glance. Knowledge of the commands available to you and also how to string them together will make using Ubuntu even easier for many tasks. Many of the commands were created by the GNU Project as free software analogs to previously existing proprietary UNIX commands. If you are interested, you can learn more about the GNU Project at www.gnu.org/gnu/thegnuproject.html.
This chapter looks at some of the basic commands that you need to know to be productive at the command line. You will find out how to get to the command line, and learn some of the commands used to navigate the file system. Later in the book we present a Command Line Masterclass (Chapter 30), which explores the subject in greater depth. The skills you learn in this chapter will help you get started using the command line with confidence.
What Is the Command Line?
If you spend any amount of time with experienced Linux users, you will hear them mention the command line. Some, especially those who have begun their journey in the Linux world using distributions, like Ubuntu, that make it easy to complete many tasks using a graphical user interface (GUI), may speak with trepidation about the mysteries of the text interface. Others will either praise its power or comment about doing something via the command line as if it is the most natural and obvious way to complete a task.
It is not necessary for you to embrace either extreme. You may develop an affinity for the command line when performing some tasks and prefer the GUI for others. This is where most users end up today. Some may say that you will never need to access the command line because Ubuntu offers a slew of graphical tools that enable you to configure most things on your system. There are some good reasons to acquire a fundamental level of comfort with the command line that you should consider before embracing that view.
Sometimes things go wrong, and you may not have the luxury of a graphical interface to work with. In these situations, a fundamental understanding of the command line and its uses can be a real lifesaver. Also, some tasks end up being far easier and faster to accomplish from the command line.
Initially, some may be tempted to think of the command line as the product of some sort of black and arcane art, and in some ways it can appear to be extremely difficult and complicated to use. However, with a little perseverance, by the end of this chapter you will start to feel comfortable using the command line and you'll be ready to move on to Chapter 35, "Command Line Masterclass."
More importantly, though, you will be able to make your way around a command line–based system, which you are likely to encounter if you ever work with a Linux server since many Linux servers have no GUI and all administration is done using a command line interface via SSH.
This chapter introduces you to commands that enable you to do the following:
- Perform routine tasks—Logging in and out, changing passwords, listing and navigating file directories
- Implement basic file management—Creating files and folders, copying or moving them around the file system, renaming and deleting them
- Execute basic system management—Shutting down or rebooting, using text-based tools to edit system configuration files, and reading man pages, which are entries for commands included as files already on your computer in a standardized manual format
The information in this chapter is valuable for individual users or system administrators who are new to Linux and are learning to use the command line for the first time.
Ubuntu offers a number of ways to access the command line. One way is to press the key combination Ctrl+Alt+F1, after which Ubuntu will switch to a black screen and a login prompt like this:
Ubuntu 10.10 maverick seymour ttyl seymour login:
At the login prompt enter your username and press the Enter key. You will be asked for your password, which you should enter. Note that Ubuntu does not show any characters while you are typing your password in. This is a good thing because it prevents any shoulder surfers from seeing what you've typed or the length of the password.
Pressing the Enter key drops you to a shell prompt, signified by the dollar sign:
matthew@seymour:~$
This particular prompt tells me that I am logged in as the user matthew on the system seymour and I am currently in my home directory; Linux uses the tilde (~) as shorthand for the home directory, which would usually be something like /home/matthew.
Another way to quickly access the terminal is to use the desktop menu option Applications, Accessories, Terminal. This opens up gnome-terminal, which allows you to access the terminal while remaining in a GUI environment. This time, the terminal appears as white text on an aubergine (dark purple) background. This is the most common method for most desktop users, but both are useful.
Regardless of which way you access the terminal, using the virtual tty consoles accessible at Ctrl + Alt + F1-6 or via the windowed version atop your GUI desktop, you will find the rest of the usage details that we cover work the same. As you continue to learn and experiment beyond the contents of this book, you may start to discover some subtle differences between the two and develop a preference. For our purposes, either method will work quite well.
With that, let's begin.
Navigating Through the File System
Use the cd command to navigate the file system. This command is generally used with a specific directory location or pathname, like this:
matthew@seymour:~$ cd /etc/apt/
The cd command can also be used with several shortcuts. For example, to quickly move up to the parent directory, the one above the one you are currently in, use the cd command like this:
matthew@seymour:~$ cd ..
To return to your home directory from anywhere in the Linux file system, use the cd command like this:
matthew@seymour:~$ cd
You can also use the $HOME shell environment variable to accomplish the same thing. Type this command and press Enter to return to your home directory:
matthew@seymour:~$ cd $HOME
You can accomplish the same thing by using the tilde (~) like this:
matthew@seymour:~$ cd ~
Don't forget you can always use pwd to remind you where you are within the file system!
The ls command lists the contents of the current directory. It's commonly used by itself, but a number of options (also known as switches) are available for ls and give you more information. For instance, the following command returns a listing of all the files and directories within the current directory, including any hidden files (denoted by a . prefix) as well as a full listing, so it will include details such as the permissions, owner and group, size, and last modified time and date:
matthew@seymour:~$ ls -la
You can also issue the command
matthew@seymour:~$ ls -R
This command scans and lists all the contents of the subdirectories of the current directory. This might be a lot of information, so you may want to redirect the output to a text file so you can browse through it at your leisure by using the following:
matthew@seymour:~$ ls -laR > listing.txt
Table 4.1 shows some of the top-level directories that are part of a standard Linux distro.
Table 4.1. Basic Linux Directories
Name |
Description |
/ |
The root directory |
/bin |
Essential commands |
/boot |
Boot loader files, Linux kernel |
/dev |
Device files |
/etc |
System configuration files |
/home |
User home directories |
/lib |
Shared libraries, kernel modules |
/lost+found |
Directory for recovered files (if found after a file system check) |
/media |
Mount point for removable media, such as DVDs and floppy disks |
/mnt |
Usual mount point for local, remote file systems |
/opt |
Add-on software packages |
/proc |
Kernel information, process control |
/root |
Super-user (root) home |
/sbin |
System commands (mostly root only) |
/srv |
Holds information relating to services that run on your system |
/sys |
Real-time information on devices used by the kernel |
/tmp |
Temporary files |
/usr |
Software not essential for system operation, such as applications |
/var |
Variable data (such as logs); spooled files |
Knowing these directories can help you find files when you need them. This knowledge can even help you partition hard drives when you install new systems by letting you choose to put certain directories on their own distinct partition, which can be useful for things like isolating directories from one another, such as a server security case like putting a directory like /boot that doesn't change often on its own partition and making it read-only and unchangeable without specific operations being done by a super-user during a maintenance cycle. Desktop users probably won't need to think about that, but the directory tree is still quite useful to know when you want to find the configuration file for a specific program and set some program options systemwide to affect all users.
Some of the important directories in Table 4.1, such as those containing user and root commands or system configuration files, are discussed in the following sections. You may use and edit files under these directories when you use Ubuntu.
Linux also includes a number of commands you can use to search the file system. These include the following:
- whereis command —Returns the location of the command (e.g. /bin, /sbin, or /usr/bin/command) and its man page, which is an entry for the command included as a file already on your computer in a standardized manual format.
- whatis command —Returns a one-line synopsis from the command's man page.
- locate file —Returns locations of all matching file(s); an extremely fast method of searching your system because locate searches a database containing an index of all files on your system. However, this database (which is several MB in size and named mlocate.db, under the /var/lib/mlocate directory) is built daily at 6:25 a.m. by default, and does not contain pathnames to files created during the workday or in the evening. If you do not keep your machine on constantly, you can run the updatedb command with super-user privileges to manually start the building of the database. More advanced users can change the time the database is updated by changing a cron job that calls the command. There is a script in /etc/cron.daily called mlocate that does this as part of the daily maintenance for the database. You would need to either remove that script from /etc/cron.daily and put it the root crontab or change when the daily tasks are run. If you don't know how to do this right now, you should wait until you have read and understand Chapter 11, "Automating Tasks," and its discussion of cron, after which the preceding description will be clear.
- apropos subject —Returns a list of commands related to subject.
- type name —Returns how a name would be interpreted if used as a command. This generally shows options or the location of the binary that will be used. For example, type ls returns ls is aliased to `ls – color=auto' .
Managing Files with the Shell
Managing files in your home directory involves using one or more easily remembered commands. Basic file management operations include paging (reading), moving, renaming, copying, searching, and deleting files and directories. Here are some commands to do these tasks:
- cat filename —Outputs contents of filename to display
- less filename —Allows scrolling while reading contents of filename
- mv file1 file2 —Renames file1 to file2 and may be used with full pathnames to move the file to a new directory at the same time
- mv file dir —Moves file to specified directory
- cp file1 file2 —Copies file1 and creates file2
- rm file —Deletes file
- rmdir dir —Deletes directory (if empty)
- grep string file (s)—Searches through files(s) and displays lines containing matching string (a string is a series of characters like letters, numbers, and symbols, such as a word)
Note that each of these commands can be used with pattern-matching strings known as wildcards or expressions. For example, to delete all files in the current directory beginning with the letters abc, you can use an expression beginning with the first three letters of the desired filenames. An asterisk (*) is then appended to match all these files. Use a command line with the rm command like this:
matthew@seymour:~$ rm abc*
Linux shells recognize many types of filenaming wildcards, but this is different from the capabilities of Linux commands supporting the use of more complex expressions. You learn more about using wildcards in Chapter 11, "Automating Tasks."
Working with Compressed Files
Another file management operation is compression and decompression of files, or the creation, listing, and expansion of file and directory archives. Linux distributions usually include several compression utilities you can use to create, compress, expand, or list the contents of compressed files and archives. These commands include:
- bunzip2—Expands a compressed file
- bzip2—Compresses or expands files and directories
- gunzip—Expands a compressed file
- gzip—Compresses or expands files and directories
- tar—Creates, expands, or lists the contents of compressed or uncompressed file or directory archives known as tape archives or tarballs
Most of these commands are easy to use. However, the tar command, which is the most commonly used of the bunch, has a somewhat complex set of command-line options and syntax. This flexibility and power are part of its popularity; you can quickly learn to use tar by remembering a few of the simple command line options. For example, to create a compressed archive of a directory, use tar's czf options like this:
matthew@seymour:~$ tar czf dirname.tgz dirname
The result is a compressed archive (a file ending in .tgz) of the specified directory (and all files and directories under it). Add the letter v to the preceding options to view the list of files added during compression and archiving while the archive is being created. To list the contents of the compressed archive, substitute the c option with the letter t, like this:
matthew@seymour:~$ tar tzf archive
However, if many files are in the archive, a better invocation (to easily read or scroll through the output) is
matthew@seymour:~$ tar tzf archive | less
To expand the contents of a compressed archive, use tar's zxf options, like so:
matthew@seymour:~$ tar zxf archive
The tar utility decompresses the specified archive and extracts the contents in the current directory.
Essential Commands from the /bin and /sbin Directories
The /bin directory contains essential commands used by the system for running and booting the system. In general, only the root operator uses the commands in the /sbin directory. The software in both locations is essential to the system; they make the system what it is, and if they are changed or removed, it could cause instability or a complete system failure. Often, the commands in these two directories are statically linked, which means that the commands do not depend on software libraries residing under the /lib or /usr/lib directories. Nearly all the other applications on your system are dynamically linked—meaning that they require the use of external software libraries (also known as shared libraries) to run. This is a feature for both sets of software.
The commands in /bin and /sbin are kept stable to maintain foundational system integrity and do not need to be updated often, if at all. For the security of the system, these commands are kept in a separate location and isolated where changes are more difficult and where it will be more obvious to the system administrator if unauthorized changes are attempted or made.
Application software changes more frequently, and applications often use the same functions that other pieces of application software use. This was the genesis of shared libraries. When a security update is needed for something that is used by more than one program, it has to be updated in only one location, a specific software library. This enables easy and quick security updates that will affect several pieces of non-system-essential software at the same time by updating one shared library, contained in one file on the computer.
Using and Editing Files in the /etc Directory
System configuration files and directories reside under the /etc directory. Some major software packages, such as Apache, OpenSSH, and xinetd, have their own subdirectories in /etc filled with configuration files. Others like crontab or fstab use one file. Some examples of system-related configuration files in /etc include the following:
- fstab—The file system table is a text file listing each hard drive, CD-ROM, floppy, or other storage device attached to your PC. The table indexes each device's partition information with a place in your Linux file system (directory layout) and lists other options for each device when used with Linux (see Chapter 36, "Kernel and Module Management"). Nearly all entries in fstab can be manipulated by root using the mount command.
- modprobe.d/—This folder holds all the instructions to load kernel modules that are required as part of the system startup.
- passwd—The list of users for the system, including special-purpose nonhuman users like syslog and couchdb, along with user account information.
- sudoers—A list of users or user groups with super-user access.
Protecting the Contents of User Directories—/home
The most important data on a Linux system resides in the user's directories, found under the /home directory. Segregating the system and user data can be helpful in preventing data loss and making the process of backing up easier. For example, having user data reside on a separate file system or mounted from a remote computer on the network might help shield users from data loss in the event of a system hardware failure. For a laptop or desktop computer at home, you might place /home on a separate partition from the rest of the file system, so that if the operating system is upgraded, damaged, or reinstalled, /home would be more likely to survive the event intact.
Using the Contents of the /proc Directory to Interact with the Kernel
The content of the /proc directory is created from memory and exists only while Linux is running. This directory contains special files that either extract information from or send information to the kernel. Many Linux utilities extract information from dynamically created directories and files under this directory, also known as a virtual file system. For example, the free command obtains its information from a file named meminfo:
matthew@seymour:~$ free total used free shared buffers cached Mem: 4055680 2725684 1329996 0 188996 1551464 -/+ buffers/cache: 985224 3070456 Swap: 8787512 0 8787512
This information constantly changes as the system is used. You can get the same information by using the cat command to see the contents of the meminfo file:
matthew@seymour:~$ cat /proc/meminfo MemTotal: 4055680 KB MemFree: 1329692 KB Buffers: 189208 KB Cached: 1551488 KB SwapCached: 0 KB Active: 1222172 KB Inactive: 1192244 KB Active(anon): 684092 KB Inactive(anon): 16 KB Active(file): 538080 KB Inactive(file): 1192228 KB Unevictable: 48 KB Mlocked: 48 KB SwapTotal: 8787512 KB SwapFree: 8787512 KB Dirty: 136 KB Writeback: 0 KB AnonPages: 673760 KB Mapped: 202308 KB Shmem: 10396 KB Slab: 129248 KB SReclaimable: 107356 KB SUnreclaim: 21892 KB KernelStack: 2592 KB PageTables: 30108 KB NFS_Unstable: 0 KB Bounce: 0 KB WritebackTmp: 0 KB CommitLimit: 10815352 KB Committed_AS: 1553172 KB VmallocTotal: 34359738367 KB VmallocUsed: 342300 KB VmallocChunk: 34359387644 KB HardwareCorrupted: 0 KB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 KB DirectMap4k: 38912 KB DirectMap2M: 4153344 KB
The /proc directory can also be used to dynamically alter the behavior of a running Linux kernel by "echoing" numerical values to specific files under the /proc/sys directory. For example, to "turn on" kernel protection against one type of denial of service (DOS) attack known as SYN flooding, use the echo command to send the number 1 (one) to the following /proc path:
matthew@seymour:~$ $ sudo echo 1 >/proc/sys/net/ipv4/tcp_syncookies
Other ways to use the /proc directory include the following:
- Getting CPU information, such as the family, type, and speed from /proc/cpuinfo.
- Viewing important networking information under /proc/net, such as active interfaces information under /proc/net/dev, routing information in /proc/net/route, and network statistics in /proc/net/netstat.
- Retrieving file system information.
- Reporting media mount point information via USB; for example, the Linux kernel reports what device to use to access files (such as /dev/sda) if a USB camera or hard drive is detected on the system. You can use the dmesg command to see this information.
- Getting the kernel version in /proc/version, performance information such as uptime in /proc/uptime, or other statistics such as CPU load, swap file usage, and processes in /proc/stat.
Working with Shared Data in the /usr Directory
The /usr directory contains software applications, libraries, and other types of shared data for use by anyone on the system. Many Linux system administrators give /usr its own partition. A number of subdirectories under /usr contain manual pages (/usr/share/man), software package shared files (/usr/share/ name_of_package , such as /usr/share/emacs ), additional application or software package documentation (/usr/share/doc), and an entire subdirectory tree of locally built and installed software, /usr/local.
Temporary File Storage in the /tmp Directory
As its name implies, the /tmp directory is used for temporary file storage; as you use Linux, various programs create files in this directory.
Accessing Variable Data Files in the /var Directory
The /var directory contains subdirectories used by various system services for spooling and logging. Many of these variable data files, such as print spooler queues, are temporary, whereas others, such as system and kernel logs, are renamed and rotated in use. Incoming electronic mail is usually directed to files under /var/spool/mail.
Linux also uses /var for other important system services. These include the top-most File Transfer Protocol (FTP) directory under /var/ftp (see Chapter 18, "Remote File Serving with FTP"), and the Apache web server's initial home page directory for the system, /var/www/html. (See Chapter 17, "Apache Web Server Management," for more information on using Apache.)