Check the CPU usage of the 5 most CPU-intensive processes:
ps -eo %cpu,comm,pid,user,etime --sort=-%cpu | head -6
Sometimes you'll want to use top instead of ps. Sometimes ps is inaccurate while top is accurate.
top -d 10 -o +%CPU
Check the memory usage of the 5 most memory-hungry processes:
ps -eo %mem,comm,pid,user,etime --sort=-%mem | head -6
See a process's full process tree along with its arguments:
pstree -pals $PID
List all partitions:
df -h -x tmpfs -x devtmpfs
List only local partitions:
df -hl -x tmpfs -x devtmpfs
Find the 9 largest directories in /dir/ (does not work correctly at root directory /):
du -hx -d 1 /dir/ | sort -hr | head
Find the 9 largest directories and files in /dir/ (does not work correctly at root directory /):
du -hax -d 1 /dir/ | sort -hr | head
Find the 10 largest directories and files in root directory / (This is necessary because du -d provides incorrect output when run on the root directory):
du -shx /* 2>/dev/null | sort -hr | head
Recursively find the 20 largest files in /dir/ larger than 1 gibibyte:
find /dir/ -type f -size +1G -exec du -h "{}" \+ | sort -hr | head -20
For files smaller than 1 gibibyte: replace +1G with -1G
For files larger than 500 mebibytes: replace +1G with +500M
Recursively find the 20 largest files in /dir/ larger than 1 gibibyte, older than 1 year old, and give the total space used by all such files (not just the largest 20):
find /dir/ -type f -size +1G -mtime +365 -exec du -chx "{}" \+ | sort -h | tail -21
Find the 10 most recently modified files and directories in /dir/:
stat -c "%y %n" /dir/* | sort -hr | head -10
Recursively find the 10 most recently modified files in /dir/ that have been modified in the last 24 hours:
find /dir/ -type f -mtime -1 -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | head -10 | cut -d ":" -f 2-
See which processes are writing the most to disk:
iotop -Po -d 10
Use the [LEFT] and [RIGHT] arrow keys to choose which column to sort the results by, and use the [R] key to reverse the sorting order.
See which files and directories a process is writing to:
lsof -p $PID
Backup a directory to another location:
rsync -vazHAP "$SOURCE" "$DESTINATION"
Same as above but with root privileges on the remote machine:
rsync --rsync-path="sudo rsync" -vazHAP "$SOURCE" "$DESTINATION"
Same as above but using an AskPass program to provide a mandatory password upon sudo-ing:
rsync --rsync-path='export SUDO_ASKPASS="$PATH_TO_ASKPASS_PROGRAM"; sudo -A rsync' -vazHAP "$SOURCE" "$DESTINATION"
Check what processes are listening on what ports:
ss -tupln
Check what Docker containers are listening on what ports:
docker ps --format "table {{.Names}}\t{{.Ports}}"
Check what Podman containers are listening on what ports:
podman ps --format "table {{.Names}}\t{{.Ports}}"
List all virtual machines:
virsh list --all
List a virtual machine's allocated CPU's:
virsh vcpucount $VM_NAME
List a virtual machine's allocated memory:
virsh dommemstat $VM_NAME | grep actual
List the mount points of a virtual machine's drives:
virsh domblklist $VM_NAME
Start, stop, or reboot a virtual machine:
virsh start $VM_NAME
virsh shutdown $VM_NAME
virsh reboot $VM_NAME
Verify that one or more TLS certificates are valid:
openssl verify -CApath /etc/ssl/certs/ -CAfile [CA-BUNDLE.crt] [TLS.crt] [TLS-2.crt] [TLS-3.crt] [...]
Note that -CApath /etc/ssl/certs/ is necessary when the CA bundle doesn't contain the root CA certificate, which is normal and expected by most web browsers but not expected by openssl.
Record to the terminal the output of one or more commands every 5 seconds:
while sleep 5; do [ONE OR MORE COMMANDS SEPARATED BY SEMICOLONS]; echo; done
Stop it with [Ctrl + C]
Record in the background to a file the time (with time zone) and output of one or more commands every 5 seconds, and save the recording command's PID:
while sleep 5; do date +"%H:%M:%S %:z"; [COMMAND 1]; [COMMAND 2]; [COMMAND 3]; [...]; echo; done >> record.log & echo $! > recorder.pid
Monitor updates to that file:
tail -f record.log
Remember to kill it when you don't need it anymore, otherwise it will perpetually eat up drive space:
kill $(cat recorder.pid) && rm recorder.pid
In case you lose the recording command's PID, it will show up here if you're still in the same terminal session:
jobs -l
If you're not in the same terminal session, it will still show up here, though with unrelated processes, so try not to kill anything important:
ps -C bash -o pid,user,args
You can see the PID of the current terminal session with this:
echo $$
Search for SELinux denials:
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent -c $COMMAND_OR_PROCESS_NAME
If you think SELinux is denying operations inside a container, but don't see any denials from ausearch try:
semanage dontaudit off
and then run ausearch again. Don't forget to
semanage dontaudit on
when you're done testing.
SSH through a jump server:
ssh -J $JUMP_USER@$JUMP_SERVER_IP $TARGET_USER@$TARGET_IP
Create an SSH tunnel to a TCP socket through a jump server:
ssh -L localhost:$LOCAL_PORT:$TARGET_IP:$TARGET_PORT -N $JUMP_USER@$JUMP_SERVER_IP
Completely clear your bash history:
cat /dev/null > ~/.bash_history && history -c
You might want to do this when you have sensitive information like passwords in your bash history.
List installed packages:
dnf ls --installed
List files in a package:
dnf rq -l $PACKAGE
See what package/s provide a file:
dnf wp $FILENAME
See patches already installed for a CVE:
dnf upif --list --with-cve --installed | grep $CVE
See patches for a CVE that are available but not yet installed:
dnf upif --list --with-cve | grep $CVE
List installed packages:
zypper se -i
List files in a package:
rpm -ql $PACKAGE
See what package/s provide a file:
zypper se --provides --match-exact $FILENAME
See patches for a CVE that are available but not yet installed:
zypper lp --cve=$CVE