diff --git a/docs/books/admin_guide/04-advanced-commands.md b/docs/books/admin_guide/04-advanced-commands.md index 0de11f20d2..612b3d76f3 100644 --- a/docs/books/admin_guide/04-advanced-commands.md +++ b/docs/books/admin_guide/04-advanced-commands.md @@ -1,6 +1,7 @@ --- -title: Advanced Linux Commands +title: Advanced Commands for Linux users --- + # Advanced Commands for Linux users @@ -10,12 +11,12 @@ Advanced commands provide greater customization and controls in more specialized **Objectives**: In this chapter, future Linux administrators will learn: -:heavy_check_mark: some useful commands not covered in the previous chapter. +:heavy_check_mark: some useful commands not covered in the previous chapter. :heavy_check_mark: some advanced commands. :checkered_flag: **user commands**, **Linux** -**Knowledge**: :star: +**Knowledge**: :star: **Complexity**: :star: :star: :star: **Reading time**: 20 minutes @@ -28,7 +29,7 @@ The `uniq` command is a very powerful command, used with the `sort` command, esp To illustrate how the `uniq` command works, let's use a `firstnames.txt` file containing a list of first names: -``` +```text antoine xavier steven @@ -45,7 +46,7 @@ steven With no argument, the `uniq` command will not display identical lines that follow each other in the `firstnames.txt` file: -``` +```bash $ sort firstnames.txt | uniq antoine patrick @@ -55,14 +56,14 @@ xavier To display only the rows that appear only once, use the `-u` option: -``` +```bash $ sort firstnames.txt | uniq -u patrick ``` Conversely, to display only the lines that appear at least twice in the file, use the `-d` option: -``` +```bash $ sort firstnames.txt | uniq -d antoine steven @@ -71,7 +72,7 @@ xavier To simply delete lines that appear only once, use the `-D` option: -``` +```bash $ sort firstnames.txt | uniq -D antoine antoine @@ -84,7 +85,7 @@ xavier Finally, to count the number of occurrences of each line, use the `-c` option: -``` +```bash $ sort firstnames.txt | uniq -c 3 antoine 1 patrick @@ -92,7 +93,7 @@ $ sort firstnames.txt | uniq -c 2 xavier ``` -``` +```bash $ sort firstnames.txt | uniq -cd 3 antoine 2 steven @@ -107,7 +108,7 @@ The `xargs` command reads whitespace or linefeed delimited arguments from standa A first and simplest example would be the following: -``` +```bash $ xargs use of @@ -118,7 +119,7 @@ use of xargs The `xargs` command waits for an input from the standard **stdin** input. Three lines are entered. The end of the user input is specified to `xargs` by the keystroke sequence CTRL+D. `xargs` then executes the default command `echo` followed by the three arguments corresponding to the user input, namely: -``` +```bash $ echo "use" "of" "xargs" use of xargs ``` @@ -127,7 +128,7 @@ It is possible to specify a command to be run by `xargs`. In the following example, `xargs` will run the command `ls -ld` on the set of folders specified in the standard input: -``` +```bash $ xargs ls -ld /home /tmp @@ -142,7 +143,7 @@ In practice, the `xargs` command executed the `ls -ld /home /tmp /root` command. What happens if the command to be executed does not accept multiple arguments, such as with the `find` command? -``` +```bash $ xargs find /var/log -name *.old *.log @@ -151,14 +152,14 @@ find: paths must precede expression: *.log The `xargs` command attempted to execute the `find` command with multiple arguments behind the `-name` option, which caused `find` to generate an error: -``` +```bash $ find /var/log -name "*.old" "*.log" find: paths must precede expression: *.log ``` In this case, the `xargs` command must be forced to execute the `find` command several times (once per line entered as standard input). The `-L` option followed by an **integer** allows you to specify the maximum number of entries to be processed with the command at one time: -``` +```bash $ xargs -L 1 find /var/log -name *.old /var/log/dmesg.old @@ -177,7 +178,7 @@ $ xargs -L 1 find /var/log -name To specify both arguments on the same line, use the `-n 1` option: -``` +```bash $ xargs -n 1 find /var/log -name *.old *.log /var/log/dmesg.old @@ -195,7 +196,7 @@ $ xargs -n 1 find /var/log -name Case study of a backup with a `tar` based on a search: -``` +```bash $ find /var/log/ -name "*.log" -mtime -1 | xargs tar cvfP /root/log.tar $ tar tvfP /root/log.tar -rw-r--r-- root/root 1720 2017-04-05 15:43 /var/log/boot.log @@ -206,8 +207,8 @@ The special feature of the `xargs` command is that it places the input argument Using the example of the `cp` command, to copy a list of files in a directory, this list of files will be added at the end of the command... but what the `cp` command expects at the end of the command is the destination. To do this, use the `-I` option to put the input arguments somewhere else than at the end of the line. -``` -$ find /var/log -type f -name "*.log" | xargs -I % cp % /root/backup +```bash +find /var/log -type f -name "*.log" | xargs -I % cp % /root/backup ``` The `-I` option allows you to specify a character (the `%` character in the above example) where the input files to `xargs` will be placed. @@ -229,13 +230,14 @@ The `repoquery` command is used to query the packages in the repository. Examples of use: * Display the dependencies of a package (it can be a software package that has been installed or not installed), equivalent to `dnf deplist ` - ``` + + ```bash repoquery --requires ``` - + * Display the files provided by an installed package (does not work for packages that are not installed), equivalent to `rpm -ql ` - ``` + ```bash $ repoquery -l yum-utils /etc/bash_completion.d /etc/bash_completion.d/yum-utils.bash @@ -273,7 +275,7 @@ The `yumdownloader` command downloads RPM packages from the repositories. Equiv Example: `yumdownloader` will download the _samba_ rpm package and all its dependencies: -``` +```bash $ yumdownloader --destdir /var/tmp --resolve samba or $ dnf download --downloadonly --downloaddir /var/tmp --resolve samba @@ -294,7 +296,7 @@ The `psmisc` package contains utilities for managing system processes: Examples: -``` +```bash $ pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─agetty @@ -314,13 +316,13 @@ systemd─┬─NetworkManager───2*[{NetworkManager}] └─tuned───4*[{tuned}] ``` -``` +```bash # killall httpd ``` Kill processes (option `-k`) that access the `/etc/httpd/conf/httpd.conf` file: -``` +```bash # fuser -k /etc/httpd/conf/httpd.conf ``` @@ -338,13 +340,13 @@ Examples: * Display the end of the `/etc/passwd` file every 5 seconds: -``` -$ watch -n 5 tail -n 3 /etc/passwd +```bash +watch -n 5 tail -n 3 /etc/passwd ``` Result: -``` +```bash Every 5.0s: tail -n 3 /etc/passwd rockstar.rockylinux.lan: Thu Jul 1 15:43:59 2021 sssd:x:996:993:User for sssd:/:/sbin/nologin @@ -354,12 +356,86 @@ sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin * Monitoring the number of files in a folder: -``` -$ watch -n 1 'ls -l | wc -l' +```bash +watch -n 1 'ls -l | wc -l' ``` * Display a clock: +```bash +watch -t -n 1 date +``` + +## `install` command + +Contrary to what its name might suggest, the `install` command is not used to install new packages. + +This command combines file copying (`cp`) and directory creation (`mkdir`), with rights management (`chmod`, `chown`) and other useful functionalities (like backups). + +```bash +install source dest +install -t directory source [...] +install -d directory +``` + +Options: + +| Options | Remarks                           | +| ------- | ------------------------------------------------------------ | +| `-b` or `--backup[=suffix]` | create a backup of destination file. | +| `-d`    | treat arguments as directory names.               | +| `-D`    | create all leading components before copying SOURCE to DEST. | +| `-g` and `-o`    | set ownership.               | +| `-m`    | set permissions.               | +| `-p`    | preserve the timestamps of sources files.               | +| `-t` | copy all source arguments to directory. | + +!!! NOTE + There are options for managing the SELinux context (see the manual page). + +Examples: + +Create a directory with the `-d` option: + +```bash +install -d ~/samples +``` + +Copy a file from a source location to a directory: + +```bash +install src/sample.txt ~/samples/ +``` + +These two orders could have been carried out with a single command: + +```bash +$ install -v -D -t ~/samples/ src/sample.txt +install: creating directory '~/samples' +'src/sample.txt' -> '~/samples/sample.txt' +``` + +This command already saves time, now let's combine it with owner, owner group and rights management: + +```bash +sudo install -v -o rocky -g users -m 644 -D -t ~/samples/ src/sample.txt ``` -$ watch -t -n 1 date + + !!! NOTE + `sudo` is required in this case to make property changes. + +You can also create a backup of existing files thanks to the `-b` option: + +```bash +$ install -v -b -D -t ~/samples/ src/sample.txt +'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt~') +``` + +As you can see, the `install` command creates a backup file with a `~` tilde appended to the original file name. + +The suffix can be specified thanks to the `-S` option: + +```bash +$ install -v -b -S ".bak" -D -t ~/samples/ src/sample.txt +'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt.bak') ```