Skip to content

Instantly share code, notes, and snippets.

@c0reysc0tt
Last active September 27, 2025 11:36
Show Gist options
  • Save c0reysc0tt/ccde4ffd1e5ff740569f5cd9700a4262 to your computer and use it in GitHub Desktop.
Save c0reysc0tt/ccde4ffd1e5ff740569f5cd9700a4262 to your computer and use it in GitHub Desktop.
LINUX COMMAND CHEATSHEET BASH TOOLS
####################
# CLI cheatsheet #
####################
# cheatsheet directory location:
CHEATDIR=~/.cheatsheet
# Use 'vicheat' to edit the cheatsheet
alias vicheat='vim $CHEATDIR/command_cheatsheet'
# Use 'cheat <word>' to search for <word> in the cheatsheet
cheat() {
grep -iw --color=auto $1 $CHEATDIR/command_cheatsheet
}
# OPTIONAL: Use 'thecheat <word>' to have cheatsheet results delivered in color by Homestar Runner's The Cheat.
# (Requires cowsay, lolcat, and thecheat.cow)
thecheat () {
grep -iw $1 $CHEATDIR/command_cheatsheet | cowsay -f thecheat -n | lolcat
}

bash CLI cheatsheet

A reference tool for maintaining and searching a cheatsheet for bash commands

Summary:

I use this to quickly look up Linux commands I run frequently but don't want to remember or type. It greps for whatever word you type after "cheat". My cheatsheet file is included as a starting point, but feel free to modify it or use your own as you see fit.

Setup:

  1. Copy these files to a local directory. For exaple:
mkdir ~/.cheatsheet && cd ~/.cheatsheet && git clone https://gist.github.com/c0reysc0tt/ccde4ffd1e5ff740569f5cd9700a4262 .
  1. Copy the contents of of the included .bashrc snippet to your own .bashrc or .bash_profile. For example:
cat .bashrc >> ~/.bashrc && source ~/.bashrc

.bashrc notes:

  • Make sure the CHEATDIR variable matches the location where you cloned the repo.
  • If you plan to use your cheatsheet on multiple systems but don't want to use Git, consider putting it in a folder that autopmatically syncs with a cloud storage service like Dropbox or Google Drive.
  • The thecheat function is optional. See below for additional dependencies and usage.

Usage:

Use cheat <word> to search the cheatsheet for a word. Results will look like this:

alt text

To have your results delivered by a colorful ASCII version of The Cheat from Homestar Runner, type thecheat <word> instead. This requires that both cowsay and lolcat are installed, and you'll need to copy the included thecheat.cow file into your cowsay cows folder (or make a link to it in your cows folder). On my Mac, it looks like this:

ln -s ~/.cheatsheet/thecheat.cow /usr/local/Cellar/cowsay/3.04/share/cows/thecheat.cow

alt text

Editing the cheatsheet:

You can quickly edit the cheatsheet file using vicheat. I chose that name to follow the same convention as visudo, but you can edit the alias in the .bashrc file if something else makes more sense to you.

I hope this is useful to some people out there, and I welcome your feedback! Happy cheating!

#!/bin/bash
# BASH COMMAND CHEATSHEET
cat /etc/*release # find Linux distribution version
cat /etc/*-release | uniq -u | grep 'release' # show Linux release
sudo fuser -k 80/tcp # kill all processes using port 80 (useful if nginx won't stop/restart gracefully)
alias cdwww="cd /var/www/html/" # add to ~/.bashrc for shortcut to webroot
# ansible
ansible-playbook <playbook>.yml --private-key ~/.ssh/<key>.pem # specify a private key to use to connect when running playbooks on EC2 instances
# apt
apt list --installed # list all installed packages
apt-cache policy |grep http |awk '{print $2 $3}' |sort -u # list apt sources
apt-get install <package name>=<version> # install a specific version of a package
# AWS motd banner
sudo vim /etc/update-motd.d/30-banner # edit motd banner on AWS Amazon Linux AMI systems
sudo /usr/sbin/update-motd # update motd banner from contents of /etc/update-motd.d/ on AWS Amazon Linux AMI systems
# cron
sudo crontab -l -u <user> # view cron jobs for a specific user
sudo crontab -e -u <user> # edit cron jobs for a specific user
sudo sh -c 'tail -n +1 /var/spool/cron/*' # list crontab for all users
# cron time string format:
* * * * * # cron time string character positions
└─│─│─│─│── minute # run cron job (0-59) minutes past the hour, or * for every minute
└─│─│─│── hour # run cron job (0-23) hours past midnight, or * for every hour
└─│─│── day of month # run cron job on day (1-31) of the month, or * for every day
└─│── month # run cron job during month (1-12) of the year, or * for every month
└── day of week # run cron job every (0-6) days past Sunday, or * for every day of the week
# cron time special characters:
* (asterisk) # cron time: any/every
, (comma) # cron time: value list separator
- (hyphen) # cron time: defines range of values
/ (forward slash) # cron time: step value
# cron time examples:
* * * * * # run cron job every minute
0 0-6,18-23 * * * # run cron job hourly from 18:00 through 06:00
10 */2 * * * # run cron job 10 minutes past the hour, every other hour
# See http://crontab.guru for more interactive cron examples
# docker
docker --version # check Docker version
docker images # list Docker images
docker search # search the Docker Hub for images
docker pull <image> # pull an image or a repository from Docker Hub or another registry
docker create <image> # create a writeable container from an image and prepare it to run
docker run <image> # creates container from an image and runs it (similar to docker create + docker start)
docker run -it centos:latest /bin/bash # run a CentOS container, start bash and attach to to terminal
docker run -d centos:latest /bin/bash # run a CentOS container in detached mode
docker start <container> # start a stopped container
docker inspect <image or container> # show low-level information on Docker objects
docker exec <container> <command> # pass command to running container
docker exec -it <container> /bin/bash # start a bash prompt in a running container and attach it to terminal
docker stop <container name> # stop a running container
docker ps # list running containers
docker ps -a # list all containers, running or stopped
docker rm <container> # remove container
docker rm `docker ps -a -q` # remove all containers
docker rmi <image> # remove image
docker rmi -f <image> # remove image (force)
# git
git init # initialize empty git repo in .git/
git status # show current branch, list changes to be committed, untracked files, etc.
git add <file> # add untracked file to staging area
git add '*.txt' # add all new .txt files to staging area
git --git-dir=/my/path/.git/ --work-tree=/my/path/ add <file> # add file in another directory to staging area
git commit -m "<message>" # store staged changes
git --git-dir=/my/path/.git/ --work-tree=/my/path/ commit -m "<comment>" # commit changes in another directory
git log # list changes committed so far
git remote add origin <https://some.repo.com> # add remote repository
git push -u origin master # push local changes to remote repo origin (-u stores params so only 'git push' is needed next time)
git pull origin master # check for changes on remote origin repo and pull them down
git diff HEAD # check what is different from most recent commit
git diff --staged # show changes within files that have already been staged
git reset <file> # unstage <file>
git branch # show branches and highlight which branch is currently being used
git branch <branch> # create branch called <branch>
git branch -d <branch> # delete <branch> branch
git checkout -- <file> # get rid of changes since last commit for <file>
git checkout <branch> # switch to branch <branch>
git checkout -b <branch> # create and switch to branch <branch>
git rm '*.txt' # deletes .txt files from disk and stages removal of the files in the repo
git merge <branch> # merge changes from <branch> branch into current branch
git clone <repo> . # clone repository in current local directory
# grep
grep -rli --exclude-dir={dir1,dir2,dir3} keyword /search/path # search path for pattern with exceptions
grep "^[^#;]" file.name # show only non-commented lines (ignore comments)
grep '^[[:blank:]]*[^[:blank:]#;]' file.name # show only non-commented non-blank lines (ignore comments and blank lines)
# history (bash)
HISTCONTROL=ignorespace # tell bash not to record commands starting with space to history (add to .bashrc to make persistent)
history -d <number> # delete command <number> from bash history
# kubernetes
kubectl exec -it <pod name> -n <namespace> -- /bin/bash # accesh shell in a container running in a kubernetes/EKS pod (see https://kubernetes.io/docs/tasks/debug-application-cluster/get-shell-running-container/)
# ln
ln -s <target> <name> # creates a symbolic link (symlink) to <target> called <name>
# magento
php bin/magento admin:user:create --admin-user='<user>' --admin-password='<password>' --admin-email='<[email protected]>' --admin-firstname='<first>' --admin-lastname='<last>' # create admin user
rm -rf var/di/* var/generation/* var/cache/* var/log/* var/page_cache/* var/session/* var/view_preprocessed/* pub/static/* # clear out magento cache and temp directories
magento setup:install # install Magento software
magento setup:upgrade # update the Magento software
magento setup:di:compile # run single-tenant compiler
magento setup:static-content:deploy # deploy static content
magento cache:clean # clean cache type(s)
magento cache:flush # flush cache storage used by cache type(s)
magento module:{enable|disable} # enable or disable modules
magento setup:db:status # check if the database is up-to-date with the code
export PATH=$PATH:/var/www/html/bin # add to ~/.bashrc to add magento commands to $PATH
# mysql
mysql -u db_username -p db_name < db_file.sql # import database 'db_name' from 'db_file.sql' into mysql (use gunzip if file.sql.gz)
SELECT User FROM mysql.user; # mysql > show all database users
SHOW DATABASES; # mysql > show all databases
sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' file.sql > newfile.sql # make a mysql dump ready to import without SUPER permissions error
# dump mysql database 'db_name' on server 'db_server' to file:
mysqldump -h <db_server> -u <db_username> -p <db_name> --single-transaction | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | gzip > <db_file>.sql.gz
# netstat
sudo netstat -tulpn | grep :80 # find out what is running/listening on port 80
sudo netstat | grep http | wc -l # check how many http connections are open
# nginx
sudo nginx -s reload # reload nginx config
sudo nginx -s quit # gracefully shutdown nginx
sudo nginx -s stop # terminates nginx process
sudo nginx -t # nginx config syntax check (pre-load)
sudo nginx -T # displays currently running configs
sudo nginx -v # checks nginx version
ps aux | grep "[n]ginx" # check running nginx processes
service nginx status # check nginx service status
# rsync
rsync -havz --stats --progress -e "ssh -i /path/to/sshkey.pem" /path/to/local/file user@remotehost:~/ # transfer local file to home directory on remote server
rsync -havz --stats --progress -e "ssh -i /path/to/sshkey.pem" user@remotehost:~/file ~/ # transfer file from home directory on remote server to local home directory
# screen
screen # start screen
<ctrl-a> c # creat new screen window
<ctrl-a> n # go to next screen window
<ctrl-a> p # go to previous screen window
<ctrl-a> " " # show list of screen windows (allows you to select a window to change to)
<ctrl-a> w # show screen window bar
<ctrl-a> m # monitor current screen window for activity, alert when active
<ctrl-a> _ # monitor current screen window for silence or no activity, alert when inactive
<ctrl-a> d # detach from current screen
screen -ls # list screen sessions
screen -r [pid.session.name] # re-attach to screen session
https://www.howtoforge.com/linux_screen # decent screen tutorial
# ssh
ssh-keygen -t rsa # generate ssh keys
find ~/.ssh -type f -exec chmod -R 600 {} \; && find ~/.ssh -type d -exec chmod -R 700 {} \; # fix permissions on ssh folder and keys
ssh-keygen -R hostname # remove a host from known_hosts file
# tar
tar xvzf file.tar.gz # extract entire .tar.gz archive
tar tvf file.tar.gz # view a table of contents by listing all files in achieve
tar xvjf file.tar.bz2 # extract file which was compressed using a bZip2 compressor
tar zcvf archive-name.tar.gz directory-name # compress entire directory
# tmux
tmux new -s session_name # creates a new tmux session named session_name
tmux attach -t session_name # attaches to an existing tmux session named session_name
tmux switch -t session_name # switches to an existing session named session_name
tmux list-sessions # lists existing tmux sessions
tmux kill-session -t :0-9 # kill tmux session
tmux detach # detach the currently attached session
tmux new-window # create a new window
tmux select-window -t :0-9 # move to the window based on index
tmux rename-window # rename the current window
tmux split-window # splits the window into two vertical panes
tmux split-window -h # splits the window into two horizontal panes
tmux swap-pane -[UDLR] # swaps pane with another in the specified direction
tmux select-pane -t :.+ # selects the next pane in numerical order
tmux list-keys # lists out every bound key and the tmux command it runs
tmux list-commands # lists out every tmux command and its arguments
tmux info # lists out every session, window, pane, its pid, etc.
tmux source-file ~/.tmux.conf # reloads the current tmux configuration (based on a default tmux config)
# tmux shortcuts:
<ctrl-b> d # tmux detach
<ctrl-b> c # tmux new-window
<ctrl-b> 0-9 # tmux select-window
<ctrl-b> , # tmux rename-window
<ctrl-b> " " # tmux split-window
<ctrl-b> % # tmux split-window -h
<ctrl-b> { or } # tmux swap-pane -[UDLR]
# tmux crash course:
https://robots.thoughtbot.com/a-tmux-crash-course
# user and group management
useradd -s /sbin/nologin dbuser # add a user without a valid login shell (to establish SSH tunnels for DB access, for example)
groups <user> # list groups <user> is in
sudo usermod -a -G <group> <user> # add user to group
# varnish
varnishlog -g request -q 'ReqMethod eq "PURGE"' # view logged varnish purge requsts
# yum
yum list all # list all installed and available packages
yum list installed # list all installed packages
yum list available # list all available packages
yum repolist all # list all yum repositories and their status
yum repolist enabled # list only enabled yum repositories
yum repolist disabled # list disabled yum repositories
yum --disablerepo=* --enablerepo=repo_name install [packages] # only install packages from the 'repo_name' repository
# zip, gzip
gunzip file.gz # extract .gz file without tar
gzcat <filename> # look at gzipped file contents without extracting it
View raw

(Sorry about that, but we can’t show files that are this big right now.)

@taj-lab-1793
Copy link

top ==> enfin un travail intelligent

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment