Linux Commands
Note: Many of the commands listed here require sudo/root access in order to work.
Keyboard Shortcuts
CTRL + C stop/kill a bad command CTRL + Z pause/suspend a bad bash command (use "ps" and "kill" to kill) CTRL + U erase what you were typing (when backspace/esc just prints special characters) CTRL + D exit/logout CTRL + L clear the terminal CTRL + ALT + Fn switch screen (can switch between F1 to F6) CTRL + R search bash/command history
System
General
poweroff # shutdown a linux system (needs sudo/root access) reboot # reboot a linux system (needs sudo/root access) sudo !! # repeat previous command as sudo ssh SVR # connect to a remote server through current server ssh USR@SVR # connect to a remote server with USR username ssh SVR "command" # connect to a remote server, run a command, then disconnect ssh-keygen # generate ssh public/private key pair ssh-copy-id USR@SVR # push ssh public key to remote server SVR under user USR cat ~/.ssh/id_rsa.pub | ssh USR@SVR 'cat >> .ssh/authorized_keys' # same as previous command screen # start a screen session screen -r # reconnect a screen session # CTRL + A, then D to disconnect a screen session watch CMD # repeat CMD command every 2 seconds watch -d CMD # repeat CMD command every 2 seconds and highlight the differences watch -n 10 CMD # repeat CMD command every 10 seconds watch "CMD; CMD2" # repeat CMD and CMD2 every 2 seconds history # view command history history -c # clear entire command history history -d NUM # delete command NUM from history (use "history" to get number) !NUM # run command NUM from history (use "history" to get number) ^STR^RPL # in previous command, replace STR with RPL, then run modified command uptime # view uptime since last reboot date # view current date timedatectl # view expanded time/date timedatectl list-timezones # view all available timezones timedatectl set-timezone TZN # set timezone to TZN which CMD # find out the location of CMD command wall TXT # broadcast a message TXT to all connected users write USR # broadcast message to a specific user (type message, then press CTRL+D) echo TXT | write USR # alternate way to broadcast message TXT to a specific user USR
Hardware Info
cat /etc/issue # get Linux distro version cat /etc/*release # get more detailed info on Linux version lsb_release -a # another way to get Linux distro info uname -r # get Linux kernel version rpm -qa kernel # list all Linux kernels lscpu # get cpu info (model, speed, etc) cat /proc/cpuinfo # get more detailed cpu info free -m # get memory info cat /proc/meminfo # get memory info dmidecode --type memory # get expanded memory info (how many slots, what's in each slot, etc) lshw -class memory # another way to get expanded memory info lspci # list all pci devices lsusb # list all usb devices lsblk # list all block devices (hard drives, cdrom, etc) blkid # get the UUID for all block devices ethtool IFACE # get hardware info on network interface IFACE (max speed, etc) dmidecode | less # dump all hardware information (vendor, serial numbers, etc) -- press 'q' to exit lshw | less # another way to dump all hardware info
Memory
swapoff -a -v # turn swap file off (verbose) swapon -a -v # turn swap file on (verbose) dd if=/dev/zero of=/SWAPFILE count=4096 bs=1MiB # create a 4GB file called SWAPFILE chmod 600 /SWAPFILE # set proper permissions on file SWAPFILE mkswap /SWAPFILE # convert file SWAPFILE to a swap file swapon /SWAPFILE # add file SWAPFILE to the swap filesystem
GPU
nvidia-smi # NVIDIA System Management Interface program nvidia-smi -h # show help and options nvidia-smi -L # list all GPUs nvidia-smi -q # GPU info, including serial number nvidia-smi topo -m # get GPU topology (multi-gpu systems) nvidia-smi mig -lgip # get available MIG modes
BMC/IPMI
ipmitool -H IP -U USR -I lanplus CMD # run command CMD for system IP with user USR (will ask for password) ipmitool -H IP -U USR -P PASS -I lanplus CMD # same as previous, but use password PASS (non-interactive) ipmitool -H IP -U USR -I lanplus lan print # print BMC configuration ipmitool -H IP -U USR -I lanplus mc info # get firmware information for BMC
Booting Up
efibootmgr -v # view current EFI boot entries efibootmgr -o 0000,0002 # change boot sequence to 0000, then 0002 (run prev command to make sense of this) efibootmgr -b 2 -B # remove boot entry 0002 # Disable/Enable the GUI/X11 in CentOS 7 systemctl get-default # get default runlevel systemctl list-units --type=target # get list of valid runlevels systemctl set-default LVL.target # change default runlevel to LVL # Install/Enable the GUI in AlmaLinux 8 yum group list # show environment groups yum groupinstall "Server with GUI" # install GUI systemctl set-default graphical.target # set GUI as default (not needed if only remote GUI access is required) reboot # reboot the system # Install Grub Customizer in Ubuntu -- For Changing Boot Order After Ubuntu is Installed sudo add-apt-repository ppa:danielrichter2007/grub-customizer sudo apt-get update sudo apt-get install grub-customizer grubby --default-kernel # centos8: get full path of default boot kernel grubby --default-index # centos8: get index of default boot kernel grubby --info=ALL # centos8: get info on all boot entries grubby --set-default-index=NUM # centos8: set index NUM as default boot entry grubby --set-default=KRN # centos8: set full path KRN as default boot entry awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg # ubuntu16: get all grub menu entries
Resources: Modify an EFI boot order using efibootmgr, How to Change GRUB Boot Order in Ubuntu, How to boot into Single User Mode in CentOS, Set Time and Date, Screen How To Guide, Boot Partition is Full, Install GUI on AlmaLinux
Software & Updates
RHEL/CentOS
yum update # patch system by applying all updates yum update PKG # update the package PKG yum update --exclude=PKG # patch system, but exclude PKG (can also do wildcard: PKG*) yum update --disablerepo=REPO # patch system, but temporarily disable repository REPO (see 'yum repolist' for valid entries) yum list updates # show list of updated software (security fix) yum list installed # list all installed packages yum list available # list all available packages yum list PKG # search for package PKG yum list *PKG* # search for package with "PKG" in the name yum repolist # list all installed repositories yum install PKG1 PKG2 # install package PKG1 and PKG2 (PKG2 is optional, or you can add more) yum install PKG.rpm # install local package PKG.rpm using YUM yum remove PKG1 PKG2 # uninstall package PKG1 and PKG2 (PKG2 is optional, or you can add more) yum whatprovides FILE # display what package provides the file FILE yum provides FILE # same as "yum whatprovides FILE" yum --enablerepo=extras install epel-release # enables CentOS extra repos (used for installing open-vm-tools) package-cleanup --oldkernels --count=2 # delete old kernels except for the last 2
Debian/Ubuntu
apt-get update # get updated repositories for updating packages apt-get upgrade # actually perform the upgrade apt list --installed # list all installed packages apt search PKG # find all available packages with keyword PKG apt-get install PKG # install the package PKG apt-get remove PKG # uninstall the package PKG, keep settings data apt-get remove purge PKG # uninstall the package PKG including settings data apt-mark hold PKG # keep package PKG from updating when apt-get update/upgrade is run apt-mark unhold PKG # un-holds the package; will now be updated with everything else
Convert from CentOS 8 to CentOS 8 Stream
dnf install centos-release-stream -y # install stream repository dnf swap centos-{linux,stream}-repos # replace centos with centos-stream dnf install epel-release # install new epel dnf config-manager --set-enabled epel # enable new epel dnf config-manager --set-enabled powertools # enable powertools dnf distro-sync # sync and perform upgrade
Resources: How To yum Command, apt-get Cheat Sheet, Convert CentOS 8 to Stream
Users
General Info
id -u USR # check if a user exists id USR # get extended info about USR who # see who is logged onto the system who -u # same as who, but also gives PID for users whoami # see who you are logged in as last # print login history of all users for the past month last -wad # print login history with sorted full user/domain, ip/dns last USR # print login history of USR for the past month lastb # print bad login history lastb -wad # print bad login history with sorted full user/domain, ip/dns cut -d: -f1 /etc/passwd # List All Users cut -d: -f1 /etc/group # List All User Groups groups # List Current User Groups grep 'GRP' /etc/group # List All Users In Group GRP getent passwd # List All User Details listusers # List All Users -- Solaris/SunOS Only!
Sudo/Administrator
su # promote yourself to super user su USR # switch to user USR (must be root, does not require that user's password) sudo su # same as above sudo su - # same as above, but keeps environment variables visudo # open vi editor to modify sudo/admin access for users # To grant someone sudo access to a particular file/command, open sudoers via visudo and type # username ALL=/path/to/command.sh wall -n MSG # broadcast MSG to all users of the server wall -n < FILE # broadcast contents of FILE to all users of the server echo "TXT" | write USR XXX/N # send TXT to the terminal of USR (use who to find the XXX/N part, e.g.: pts/1)
Resources: Configuring SUDO Access, Creating a Restricted SSH User for SSH Tunneling Only, How to Use VISUDO, Understanding /etc/passwd File Format, Using LAST
Create/Modify/Delete
useradd USR # create new user useradd -m USR # create new user, create home directory if none useradd -d DIR -s SHL -G GRP1,GRP2 USR # create user USR, set home directory DIR, set login shell SHL, add to groups GRP1, GRP2 userdel -r USR # delete user and remove user folder passwd USR # reset the password of a specific user passwd -l USR # lock a user acct from use passwd -u USR # unlock a user acct passwd -d root # delete password of root account groupadd GRP # create a group named GRP groupdel GRP # delete a group named GRP usermod -a -G GRP USR # add existing user USR to group GRP gpasswd -d USR GRP # remove user USR from group GRP usermod -c "INFO" USR # modify the comment INFO for user USR (name, email) usermod -s SHLL USR # modify user USR to use shell SHLL (e.g: "usermod -s /bin/bash username")
Resources: How to Add New Linux User Account, Remove User Account in Linux, Usermod Examples
Permissions
stat -c "%a %n" FILE # get current file/directory permissions octal number for FILE chmod # change file/directory permissions chmod a+r FILE # add READ permissions for ALL users for FILE chmod +x FILE # add EXECUTE permissions for current user for FILE # other options: a=all, o=owner, g=group, +x=add execute, -r=remove read, +w=add write chmod 644 FILE # default permissions for files chmod 755 DIR # default permissions for folders chown # change file/directory ownership chown USR DIR # change DIR ownership to USR, keep original group chown USR:GRP FILE # change FILE ownership to USR, change group ownership to GRP chown -R USR:GRP DIR # recursively change DIR ownership to USR and GRP, also affects files find DIR -type d -exec chmod 755 {} \; # set all folders in DIR to 755 find DIR -type f -exec chmod 644 {} \; # set all files in DIR to 644
SELinux
getenforce # get current SELinux mode setenforce 0 # set SELinux to Permissive mode (still reports, does not survive between reboots) setenforce 1 # set SELinux to Enforcing mode (default) getsebool BOOLEAN # get value of SELinux boolean setsebool -P BOOLEAN # set value of SELinux boolean permanently restorecon -Rv DIR # restore SELinux context for DIR (useful for apache/httpd "403 forbidden" errors) /etc/selinux/config # selinux configuration (permanently set permissive or disable modes) # this is a more aggressive SELinux setter; it looks at logs and sets everything within the log to be permissible # useful when restorecon does not work, but turning off selinux does grep httpd /var/log/audit/audit.log | audit2allow -M mypol semodule -i mypol.pp
Processes
top # see a list of running processes (like taskmon), also kill processes top -U USR # see a list of running processes for USR # q exit application # z toggle color on/off # 1 toggle individual cpu on/off # m toggle memory info # W save current display for future sessions # o filter list (example: "PID=XXX" where XXX is a PID) w # show only the top part of "top" htop # more detailed version of top (must be installed) ps # see a list of processes on the system (simpler than top) ps -al # see a more detailed list of processes ps -u USR # see a list of running processes for USR iotop # monitor disk IO per process (must be installed) jobs # see a list of running/paused jobs bg # continue a recently paused process in the background, shows job id when successful fg # bring the last backrounded process to the foreground nice -NN CMD # run command CMD with priority NN (default priority is 0) nice --NN CMD # run command CMD with priority -NN (must be root) renice NN -p PID # change priority of process PID to NN kill %### # kill job with number ###, for when you stopped jobs with CTRL+Z kill -15 ### # kill the process with PID ### (use first, less harsh) kill -9 ### # kill the process with PID ### (use second, more harsh) killall -u USR # kill all processes from a user (good for ending hanging login sessions) disown %### # disown a process, process keeps running even on disconnect, NO WAY TO UNDO!
Services
service SVC status # check if a service is running -- older method (CentOS 6) service --status-all # check status of all services -- older method (CentOS 6) chkconfig --list # check service configuration -- older method (CentOS 6) systemctl enable SVC # enable a service (start on boot) systemctl disable SVC # disable a service systemctl start SVC # start the service SVC systemctl stop SVC # stop the service SVC systemctl restart SVC # restart the service SVC systemctl status SVC # check if a service is running systemctl status -l SVC # same as above but gets status without truncation systemctl is-active SVC # check if a service is active (enabled & running) systemctl list-unit-files # check status of all services
Networking
General
ping # ping a computer ibping # same as ping but for InfiniBand interfaces ifconfig # show network configuration ifconfig -a | grep ether | awk '{print $2}' # print all mac addresses for network interfaces ip addr show # netplan: show network configuration ip addr show dev ETH # netplan: show specific network configuration for ETH ip route show # netplan: get gateway ip link show dev ETH # netplan: see ETH network interface info cat /etc/resolv.conf # get dns netstat -tulpn | grep :### # find out what process is using port ### ss -tulpn | grep :### # same as previous line (ss replaces netstat) netstat -tulpn | grep LISTEN # find all ports currently in use iftop # detailed CLI view of network traffic (must be installed) hostname # view current hostname hostname NAME # set hostname as NAME temporary (goes away on reboot) hostnamectl set-hostname NAME # set hostname as NAME permanently
Resources: 'ip' Command Cheat Sheet
Settings
# To manually change your network settings using Netplan (Ubuntu 18+)... ip link # see all network interfaces and status nano /etc/netplan/*.yaml # modify network configuration (* means file could be named anything) netplan apply # reload network configuration # To manually change your network settings using the Network Manager GUI (CentOS 7+)... system-config-network # configure all network settings in GUI window (need CentOS 7 w/ GUI) nmtui # configure network settings in a command line GUI nmtui edit IFACE # configure network settings for IFACE in a command line GUI systemctl restart network # restart network interface (CentOS 7) systemctl restart NetworkManager # restart network interface (CentOS 8) # To manually change your network settings using Network Manager (CentOS 7+)... nmcli d # see all network interfaces and status nmcli c modify ETH ipv4.addresses IP/SUB # set ETH interface to IP with SUB subnet (i.e: 10.0.0.30/24) nmcli c modify ETH ipv4.gateway GATEIP # set ETH interface to GATE gateway nmcli c modify ETH ipv4.dns "DNSIP1 DNSIP2" # set ETH interface to DNS address DNSIP1, DNSIP2 optional nmcli c modify ETH ipv4.method manual # set ETH interface to manual IP settings nmcli c modify ETH ipv4.method auto # set ETH interface to DHCP nmcli c down ETH; nmcli c up ETH # reload ETH interface and settings # To manually change your network settings without Network Manager (CentOS 6)... nano /etc/sysconfig/network-scripts/ifcfg-eth0 # Configure eth0 Interface nano /etc/sysconfig/network # Configure Default Gateway /etc/init.d/network restart # Restart Network Interface service network restart # Restart Network Interface nano /etc/resolv.conf # Configure DNS Server nano /etc/hosts # Configure Hosts
Resources: CentOS 7 Network Settings, Channel bonding modes, How to create a bond in Ubuntu, Configure Static IP using Netplan, Configure VLAN in CentOS 7
Proxy
CentOS 8: Global Proxy
Create the file /etc/profile.d/proxy.sh
with the following content:
- proxy.sh
MY_PROXY_URL="<_PROXY_SERVER_>:3128" HTTP_PROXY=$MY_PROXY_URL HTTPS_PROXY=$MY_PROXY_URL FTP_PROXY=$MY_PROXY_URL http_proxy=$MY_PROXY_URL https_proxy=$MY_PROXY_URL ftp_proxy=$MY_PROXY_URL export HTTP_PROXY HTTPS_PROXY FTP_PROXY http_proxy https_proxy ftp_proxy
CentOS 8: DNF/YUM Proxy
DNF does not use the global proxy. Add the following line to the end of /etc/dnf/dnf.conf
to enable a proxy for DNF only.
proxy=<_PROXY_SERVER_>:3128
Docker Proxy
Docker does not use the global proxy. Create the file /etc/systemd/system/docker.service.d/http-proxy.conf
with the following content:
- http-proxy.conf
[Service] Environment="HTTP_PROXY=<_PROXY_SERVER_>:3128" Environment="HTTPS_PROXY=<_PROXY_SERVER_>:3128"
… then run the following commands:
systemctl daemon-reload # reload service configuration systemctl restart docker # restart docker service systemctl show --property=Environment docker # verify that environment variables are loaded
Resources: CentOS 8 Proxy Client, Docker Proxy
File Transfer
wget "http://remote.file" # Download file from the internet to current directory wget -O FILE "http://remote.file/" # Download file from the internet, rename file to FILE wget "http://remote.file/" -P DIR # Download file from the internet to DIR directory scp FILE USR@SVR: # Upload file FILE to server SVR as user USR scp -r SRC USR@SVR:DEST # Upload directory SRC to server SVR in directory DEST as user USR rsync -avu SRC USR@SVR:DEST # Same as previous, but only send newer files source <(curl -s http://script.sh) # Download script from internet, run script directly bash <(curl -s http://script.sh) # Same as previous, but works on macOS/FreeBSD curl -L https://script.sh | bash # Another method to do the same
Firewall
IPTables
iptables -S # see current iptables configuration iptables -L # lists all rules for default tables only iptables -F # flush all rules
FirewallD (CentOS)
firewall-cmd --state # check if firewall is running and active firewall-cmd --list-all # show all open ports in each active zone firewall-cmd --get-active-zones # show all active zones firewall-cmd --get-services # list all services firewall-cmd --zone=ZNE --add-service=SVC --permanent # open service SVC in zone ZNE permanently firewall-cmd --zone=ZNE --add-port=XXX/tcp --permanent # open tcp port XXX in zone ZNE permanently firewall-cmd --zone=ZNE --remove-port=XXX/tcp --permanent # close tcp port XXX in zone ZNE permanently firewall-cmd --zone=drop --add-source=IP --permanent # block IP from connecting (drops all packets) firewall-cmd --zone=drop --add-source=IP/SUB --permanent # block subnet SUB from connecting firewall-cmd --zone=ZNE --list-sources --permanent # list sources in zone ZNE firewall-cmd --zone=ZNE --add-source=IP --permanent # whitelist IP in zone ZNE firewall-cmd --zone=ZNE --remove-source=IP --permanent # remove IP from whitelist firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -d IP/SUB -j REJECT # block outgoing connection to IP firewall-cmd --direct --remove-rule ipv4 filter OUTPUT 0 -d IP/SUB -j REJECT # remove IP block rule firewall-cmd --direct --get-all-rules # view all direct rules firewall-cmd --reload # reload firewall /etc/firewalld # location of firewalld configuration (backup) /etc/firewalld/direct.xml # location of firewalld direct rules
UncomplicatedFirewall (Ubuntu)
ufw enable # enable firewall ufw disable # disable firewall ufw status verbose # get status, shows rules if firewall is enabled ufw status numbered # get status, show number for each firewall rule ufw allow PRT # open port PRT for all protocols ufw allow PRT/tcp # open port PRT for protocol TCP ufw allow SVC # open service SVC (http, https, ssh, ...) ufw allow PRT:RNG # open port range from PRT to RNG for all protocols ufw delete NUM # close port relating to rule NUM (see "ufw status numbered") ufw delete allow PRT # close port PRT by removing allow rule for PRT ufw deny from IP # block ip address IP (or range IP/SUB) ufw allow from IP to any port PRT # allow ip address IP to connect to port PRT ufw reload # reload firewall ufw reset # reset to factory settings
Resources: IBPING Manual, Network Configuration, Restart Network Service, Detect Physical State of Connector, Open Firewall Port in CentOS 7, Basic Operation of Firewalld, Introduction to FirewallD on CentOS, Ubuntu Firewall, How To Set Up a Firewall with UFW
SSL/TLS
OpenSSL
openssl genrsa -out KEY 2048 # generate private key KEY openssl req -new -key KEY -out CSR # generate CSR (named CSR) openssl x509 -req -days 365 -in CSR -signkey KEY -out CRT # generate self-signed cert CRT openssl x509 -enddate -noout -in CRT # get expiration date of certificate CRT /etc/pki/tls/certs/ # location of certificates (CRT) /etc/pki/tls/private/ # location of private key (KEY) and CSR /etc/ssl/certs/ # location of certificates (ubuntu) /etc/ssl/private/ # location of private key (ubuntu)
Resources: Setup SSL with CentOS
File Management
Navigation
pwd # print the current working directory cd .. # go up a directory cd - # go to previous directory mkdir NAME # create a directory cp SRC DEST # copy a file/directory cp -R SRC DEST # copy a directory recursively cp -p SRC DEST # copy a file/directory, preserving its permissions, owner, etc mv SRC DEST # move/rename a file/directory rm SRC # delete a file/directory/symlink rmdir DIR # delete a directory (will fail if DIR is not empty) rm -rf SRC # delete entire directory recursively with no prompts (*DANGEROUS*) ln -s SRC LINK # make the symbolic link LINK pointing to SRC
File/Directory Sizes
ls -lh /DIR/ # list DIR info in human readable form ls -d PREFIX* # list all directories with PREFIX df -lh # check amount of filesystem in use in human readable form df -aTh # similar to above du -sh /DIR/ # check total size of directory, summarizes to just 1 line du -hsx /DIR/ | sort -rh | head -10 # get largest folders, sort by largest, show the top 10 for i in G M K; do du -hsx /DIR/ | grep [0-9]$i | sort -nr -k 1; done | head -n 11 # same as above (for when the prev command doesn't quite work)
Finding Files/Directories
find # find all files in current directory and subdirectories find DIR -name "FILE" # find all files matching FILE in DIR directory find / -name "FILE" -ls # find all files on ROOT matching FILE and show details find . -type f -mtime +30 # find all files in current directory older than 30 days locate FILE # find all files matching FILE; faster than find as it's database driven locate -r /FILE$ # find all files matching exact string FILE whereis BIN # find the path for the binary BIN (like program files)
Resources: Find a Directory On Linux Based System
Directory Color Guide
Filesystem
fdisk -l # list all connected partitions fdisk -l | grep '^Disk' # simpler view of previous command df -h # list partitions, mount points, and Avail/Used/Free space df -aTh # a more detailed version of the previous command df -h -x overlay # list partitions, but don't show overlay filesystems (i.e: docker, etc) nano /etc/fstab # Edit file table umount DIR # Unmount DIR mount -a # Remount all mount points listed in file table mount SRC MNT # Mount SRC at MNT: e.g: "mount /dev/sdc1 /student" mount -t FS -o loop SRC MNT # Mount disk image: e.g: "mount -t vfat -o loop floppy.img /mnt/floppy/" mount -t iso9660 -o loop SR MT # Mount CD/DVD image SR at mount point MT mount -o ro SRC MNT # mount SRC at MNT as read-only mount -t nfs SRC MNT # mount NFS mount SRC at MNT: e.g: "mount -t nfs csc-san3:/mnt/SAN3/BACKUP2 /storage/san3" cat /dev/sdb >/dev/sdc # copy entire contents of drive SDB to drive SDC (like dd but fast & efficient) fdisk /dev/sdXX # partition disk sdXX, n=create partition, w=write partition, q=quit w/o change mkfs.ext4 /dev/sdXX1 # format partition sdXX1 as EXT4 file system mke2fs -n /dev/sdXX # see all superblocks needed to repair filesystem on SDXX (eg: sda2, sdd1, etc) e2fsck -b 000 /dev/sda2 # repair a file system using the superblock 000 vgdisplay # view all volume groups lvdisplay # view all logical volumes (lvm) cfdisk # visual partition manager (useful for lvm in ubuntu 16) lvresize -l +100%FREE /dev/VGLG # resize logical volume to remaining physical free space (useful for ubuntu 18) resize2fs /dev/VGLG # resize underlying file system to new logical drive size (useful for ubuntu 18) fallocate -l SIZ FIL # create file FIL of blank size SIZ (e.g: 10G, 2G, 100M...), faster than dd
Resources: How to Format a Disk in Linux, Mount and Unmount Examples, How To Setup NFS, Extend Logical Volume in RHEL VM, Expand a Hard Disk with Ubuntu LVM
Archives (Zip/Tar)
tar -C DEST -zxvf SRC # decompress SRC file to DEST directory, filename e.g: grid-db.tar.gz tar -czvf DEST SRC # compress SRC file/dir to DEST file unzip FILE # decompress FILE to current directory unzip FILE -d DIR # decompress FILE to directory DIR zip FILE * # compress everything in current directory to FILE zip -r FILE * # compress everything in current directory INCLUDING subdirectories to FILE zip -ur FILE FILE2 # add FILE2 to the existing archive FILE zip FILE -@ < LIST # add each file listed in LIST (1 filename per line) to the archive FILE jar -vxf FILE.war # unzip FILE.war to current directory
RAID Management
mdadm --examine /dev/sdXX /dev/sdYY # check for existing RAID blocks on drives/partitions mdadm --create /dev/mdZZ --level=Y --raid-devices=N /dev/sdXX /dev/sdYY # creates a raid device mdZZ, with raid level Y, using N devices, etc # mdZZ: md0, md1... # Y: RAID Level (0, 1, 5, 6, 10) # N: Number of drives in array cat /proc/mdstat # get instantaneous status raid build mdadm --detail /dev/md0 # get status of raid array mdadm --detail --scan --verbose >> /etc/mdadm.conf # generate linux raid config
Resources: Creating RAID 5 in Linux, Configure RAID on Ubuntu 20 Installation
iSCSI Management
yum install iscsi-initiator-utils # install iscsi initiator, if not installed systemctl start iscsi # start iscsi systemctl stop iscsi # stop iscsi systemctl restart iscsi # restart iscsi systemctl status iscsi # get status of iscsi /etc/iscsi/iscsid.conf # iscsi configuration (set CHAP user/pass) iscsiadm -m discovery -t st -p IPADDR # discover iscsi targets on target IPADDR iscsiadm -m node --login # login to discovered iscsi targets iscsiadm -m session -o show # show currently connected iscsi targets cat /proc/partitions # confirm available partitions iscsiadm -m node -T TRGT -u -p IPADDR:3260 # log out of iscsi target TRGT located on IPADDR iscsiadm -m node -T TRGT -p IPADDR -o delete # delete discovered target TRGT located on IPADDR from memory iscsiadm -m node # show all discovered targets
Resources: Configure iSCSI on CentOS, Configure iSCSI Initiator
Miscellaneous
lsof # list all open files lsof FILE # list all processes that opened FILE lsof /MNTPT # list all open files on MNTPT mountpoint lsof | grep ETC # list all open processes related to ETC rsync # see http://www.techonthenet.com/linux/commands/rsync.php rsync -avzP SRC DEST # copy SRC to DEST, archival mode, preserve permissions, owner, timestamps, etc. # use when you want to do a dd/cat but operating with files instead of blocks/bytes /etc/skel/ # Anything that goes in here gets copied to a new users directory
Resources: LSOF Command Examples, How to Use RSYNC, RSYNC Backup Help, More RSYNC Backup Help
Text Editors & Text Manipulation
vi FILE # open a file to read vim FILE # open a file to read in VIM (similar to VI, but advanced with colored text) # ESC [then] :q! [then] ENTER exit without saving changes # ESC [then] :w [then] ENTER save changes, leave vi running # ESC [then] :noh [then] ENTER clear search highlighting # ESC [then] :s/STR [then] ENTER search for STR in document # ESC [then] :## [then] ENTER skip to line ## in document nano FILE # open a file to read tail TXT # view the last 10 lines of file TXT tail -f TXT # view the last 10 lines of file TXT and keep showing any new lines (ctrl+c to exit) tail -20 TXT # view last 20 lines of file TXT tail -20 -f TXT # view last 20 lines of file TXT, keep showing any new lines (ctrl+c to exit) cat TXT # print entire file TXT to screen cat -n TXT # print entire file and show line numbers cat TXT | grep STR # print only the lines containing string STR in entire file TXT grep STR FILE # functionally the same as the previous command cat TXT | more # print file TXT to screen, make it scrollable # ENTER scroll by line # SPACE scroll by page # CTRL+C exit cat TXT | less # print file TXT to screen, scroll forward and backward # ARROW-DOWN scroll by line down # ARROW-UP scroll by line up # SPACE scroll down by page # q exit cat TXT | cut -c1-80 # print file to screen, only show from char 25-50 (neat way to disable word wrap) sed "s/STR/RPL/" FILE # substitute STR with RPL in FILE, do not modify file sed -i "s/STR/RPL/" FIL # substitute STR with RPL in FIL, save changes to file sed -i "/STR/d" FILE # delete lines containing STR from FILE, save changes to file diff FILE1 FILE2 # compare two files, FILE1 (<) and FILE2 (>) diff -c FILE1 FILE2 # same as above, but show more context around differences
Resources: Basic vi Commands
Services & Applications
Apache/HTTPD
General
yum install httpd mod_ssl # install apache with ssl support (centos) apt install apache2 # install apache (ubuntu) a2enmod ssl # (ubuntu) enable ssl mod (required for ssl) a2enmod headers # (ubuntu) enable header mod (required for security hardening) systemctl start httpd.service # start apache systemctl stop httpd.service # stop apache systemctl restart httpd.service # restart apache systemctl status httpd.service # get status of service systemctl start apache2.service # (ubuntu) start apache systemctl stop apache2.service # (ubuntu) stop apache systemctl restart apache2.service # (ubuntu) restart apache systemctl status apache2.service # (ubuntu) get status of service /etc/httpd/conf/httpd.conf # main configuration /etc/httpd/conf.d/ssl.conf # ssl configuration (optional, has location of cert/key) /etc/httpd/conf.d/userdir.conf # user folder configuration (optional) /etc/httpd/conf.d/vhosts.conf # virtual hosts configuration (optional) /etc/httpd/conf.modules.d/90-alias.conf # aliases configuration (optional) /etc/apache2/apache2.conf # (ubuntu) main configuration /etc/apache2/sites-enabled/000-default.conf # (ubuntu) default virtual host (also put ssl & force ssl here) /var/log/httpd/* # all log files, including php logs apachectl configtest # check apache configuration for errors chcon -R --type=httpd_sys_rw_content_t DIR # enable DIR to host web pages with SELinux enabled (useful for userdir)
Security Hardening
Modify configuration file /etc/httpd/conf/httpd.conf
(CentOS) or /etc/apache2/apache2.conf
(Ubuntu)…
# Modify line ~144 to disable indexes and symlinks Options -Indexes -FollowSymLinks # --- Place At End Of File --- # Web Server Security Hardening ServerSignature Off ServerTokens Prod TraceEnable off Header set X-Content-Type-Options nosniff Header set X-XSS-Protection "1; mode=block" Header set X-Permitted-Cross-Domain-Policies "none" Header always append X-Frame-Options SAMEORIGIN Header set Referrer-Policy "no-referrer" Header set Content-Security-Policy "default-src 'unsafe-inline' *.<_COMPANY_TLD_>; script-src 'unsafe-inline' 'unsafe-eval' *.<_COMPANY_TLD_>; font-src 'self' data:; img-src 'self' data:;" Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # Custom Error Pages ErrorDocument 404 /404.html ErrorDocument 403 /403.html # Force SSL <VirtualHost *:80> ServerName __SERVER_HOSTNAME_HERE__ RedirectMatch permanent ^/(.*)$ https://__SERVER_HOSTNAME_HERE__/$1 </VirtualHost> # Force SSL (Alternative Method) RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]
For CentOS, modify configuration file /etc/httpd/conf.d/ssl.conf
…
# Modify relevant parts to the following (line ~54) SSLEngine on SSLProtocol ALL -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder on SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS SSLCertificateFile /path/to/ssl/certificate SSLCertificateKeyFile /path/to/ssl/key
For Ubuntu, modify configuration file /etc/apache2/sites-enabled/000-default.conf
…
# --- Place At End Of File --- <VirtualHost *:443> ServerName __SERVER_HOSTNAME_HERE__ DocumentRoot /var/www/html SSLEngine on SSLProtocol ALL -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder on SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS SSLCertificateFile /path/to/ssl/certificate SSLCertificateKeyFile /path/to/ssl/key </VirtualHost>
Resources: Install a LAMP Stack using CentOS 7, Install a LAMP Stack using Ubuntu 20, Configure SSL in Apache on Ubuntu 20, Enable Per-User Directories, Content Security Policy, How to Implement Security HTTP Headers
PHP
Ubuntu 20: Install PHP
apt install php libapache2-mod-php php-mysql # install php
CentOS 8: Install PHP
dnf install php php-cli php-gd php-curl php-mysqlnd php-ldap php-zip # install php dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm # add remi repo (for php >v7.2) dnf install dnf-utils # install dnf utilities dnf module reset php # reset php repo dnf module install php:remi-7.4 # enable remi repo for php 7 (v7.4) dnf module install php:remi-8.1 # enable remi repo for php 8 (v8.1) dnf install php php-cli php-gd php-curl php-mysqlnd php-ldap php-zip # install php 7.4 /etc/httpd/conf/httpd.conf # Modify line ~167 to add index.php
CentOS 7: Upgrade to v7.x
yum --enablerepo=extras install epel-release # enable rhel epel yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm # add remi repo yum-config-manager --enable remi-php74 # enable remi repo (php71, php72, php73, php74) yum install php php-cli php-gd php-curl php-mysql php-ldap php-zip # install php /etc/httpd/conf/httpd.conf # Modify line ~167 to add index.php
Security Hardening
Modify configuration file /etc/php.ini
(CentOS) or /etc/php/7.4/apache2/php.ini
(Ubuntu)…
# Modify line ~375 and change expose_php from ON to OFF expose_php = Off
Postfix (Sendmail)
systemctl start postfix.service # start postfix systemctl stop postfix.service # stop postfix systemctl restart postfix.service # restart postfix systemctl status postfix.service # get status of postfix service /etc/aliases # email aliases file /etc/postfix/main.cf # postfix configuration file /etc/postfix/master.cf # postfix master configuration (enable amavisd/clamav here) /etc/postfix/header_checks # block unapproved mail attachments /etc/postfix/client_checks # block/allow senders by IP (smtpd_client_restrictions) /etc/postfix/sender_checks # block/allow senders by email (smtpd_sender_restrictions) /etc/postfix/rbl_override # whitelist servers from rbl checks (smtpd_relay_restrictions) newaliases # rehash aliases file (required for postfix) postmap /etc/postfix/client_checks # rehash client checks file (required) postmap /etc/postfix/sender_checks # rehash sender checks file (required) postmap /etc/postfix/rbl_override # rehash rbl override file (required) /var/log/maillog # postfix log file (contains postgrey log as well) mail EMAIL < FILE # send email to EMAIL, the body will be FILE mailq # view the mail queue postfix flush # flush themail queue postsuper -d NUM # delete message id NUM from the mail queue postsuper -d ALL # remove all mail from the queue postsuper -d ALL deferred # remove all deferred mail from the queue
Security Hardening
Modify configuration file /etc/postfix/main.cf
…
relayhost = [<_COMPANY_EMAIL_SERVER_>] # route all mail through mail server (e.g: 'mailhost.example.org') smtpd_client_restrictions = sleep 5 # rate limit outgoing mail
MySQL/MariaDB
yum install mariadb-server mariadb # install mysql curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup # download mariadb repo (for mysql >v10.3) bash mariadb_repo_setup --mariadb-server-version=10.6 # set for v10.6 dnf install boost-program-options # install utilities dnf module reset mariadb # reset mariadb repo dnf install mariadb-server mariadb-client mariadb-backup # install mysql v10.6 systemctl start mariadb.service # start mariadb service systemctl stop mariadb.service # stop mariadb service systemctl restart mariadb.service # restart mariadb service systemctl status mariadb.service # get status of mariadb service /usr/bin/mysql_secure_installation # first run security hardening /usr/bin/mariadb-secure-installation # same as above, for v10.6 mysql --version # test if mysql is installed and see what version is running mysql -u root -pPASS # log into mysql as administrator/root mysqlcheck -c DATABASE -u root -pPASS # check DATABASE for errors, PASS is for administrator/root mysqldump DATABASE > FILE # backup DATABASE to file FILE mysql DATABASE < FILE # restore DATABASE from file FILE mysqladmin -u root -pPASS password NEWPASS # change root password from PASS to NEWPASS
SQL-Specific Commands
source SRC.sql -- run a set of sql commands stored in a file SHOW DATABASES; -- show all databases CREATE DATABASE DB; -- create a database DROP DATABASE DB; -- delete a database USE DB; -- select a database to view/edit SHOW TABLES; -- show all tables in a database SET PASSWORD FOR 'user'@'localhost' = PASSWORD('mypass'); -- set USER password as MYPASS GRANT ALL ON DB.* to 'user'@'localhost' identified by 'pass'; -- grant USER access to DB with password PASS SELECT host, user, password FROM mysql.user; -- list all users
Resources: Migrate MySQL User Privileges
Tomcat
systemctl start tomcat.service # start tomcat service systemctl stop tomcat.service # stop tomcat service systemctl restart tomcat.service # restart tomcat service systemctl status tomcat.service # get status of tomcat service /opt/tomcat/conf/tomcat-users.xml # users config file (web mgmt console user/pass goes here) /opt/tomcat/conf/server.xml # server config file (per user folder listener goes here) /opt/tomcat/logs/ # log files
SSH/Secure Shell
General
systemctl start sshd.service # start ssh systemctl stop sshd.service # stop ssh systemctl restart sshd.service # restart ssh systemctl status sshd.service # get status of ssh service /etc/ssh/sshd_config # main configuration /etc/hosts.deny # block specific IP/IP ranges from SSH (tcp wrappers) /etc/hosts.allow # allow specific IP/IP ranges for SSH (tcp wrappers) /var/log/secure # log file location (CentOS/RHEL) /var/log/auth.log # log file location (Ubuntu/Debian) dnf install rsyslog # Required to enable log location on RHEL 8+
Security Hardening
Modify configuration file /etc/ssh/sshd_config
…
# Disable weak and deprecated ciphers Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,curve25519-sha256@libssh.org,gss-gex-sha1-,gss-group14-sha1- MACs umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512
For company-only access, run the following commands…
# FirewallD (CentOS/RHEL) firewall-cmd --permanent --zone=internal --add-source=<_COMPANY_IP_RANGE_> firewall-cmd --permanent --zone=internal --add-source=10.0.0.0/8 firewall-cmd --permanent --zone=public --remove-service=ssh firewall-cmd --reload; firewall-cmd --list-all # UncomplicatedFirewall (Ubuntu) ufw allow from <_COMPANY_IP_RANGE_> to any port 22 ufw allow from 10.0.0.0/8 to any port 22 ufw reload; ufw status
For non-company IP access, remove firewall commands and instead install Fail2Ban.
# Remove Restrictions (FirewallD) firewall-cmd --permanent --zone=internal --remove-source=<_COMPANY_IP_RANGE_> firewall-cmd --permanent --zone=internal --remove-source=10.0.0.0/8 firewall-cmd --permanent --zone=public --add-service=ssh firewall-cmd --reload; firewall-cmd --list-all # Remove Restrictions (UFW) ufw delete allow from <_COMPANY_IP_RANGE_> to any port 22 ufw delete allow from 10.0.0.0/8 to any port 22 ufw reload; ufw status
Log Analysis
Replace LOG
with the appropriate log file for the Linux architecture
# Total number of log entries for SSHD cat LOG | grep sshd | wc -l # Number of successful logins cat LOG | grep sshd | grep 'session opened' | wc -l # List IPs of successful logins cat LOG | grep -oE '.*Accepted password.*' | awk '{ print $11 }' | sort | uniq # Total number of port scan attempts (bad) cat LOG | grep -oE 'Received disconnect.*' | wc -l # Total number of IPs that did port scans (bad) cat LOG | grep -oE 'Received disconnect.*' | awk '{ print $4 }' | sort | uniq | wc -l # List IPs of port scanners, with number of attacks per IP cat LOG | grep -oE 'Received disconnect.*' | awk '{ print $4 }' | sort | uniq -c | sort -n # Total number of bad login attempts cat LOG | grep 'Invalid user' | wc -l # List usernames of bad login attempts, with number of attempts per username cat LOG | grep -oE 'Invalid user.*' | awk '{ print $3 }' | sort | uniq -c | sort -n
Resources: Parsing SSH Logs, Limit SSH by IP Address, Limit SSH without TCP Wrappers
Fail2Ban
yum install fail2ban # install fail2ban systemctl start fail2ban # start fail2ban service systemctl stop fail2ban # stop fail2ban service systemctl restart fail2ban # restart fail2ban service systemctl status fail2ban # get status of fail2ban service fail2ban-client status # list active jails fail2ban-client status sshd # view banned ips in sshd jail fail2ban-client set sshd banip IPADDR # manually ban ip address IPADDR fail2ban-client set sshd unbanip IPADDR # manually unban ip address IPADDR fail2ban-client unban --all # unban all ips in all jails fail2ban-client -h # show list of commands /etc/fail2ban/jail.conf # default config /etc/fail2ban/jail.local # custom config (overrides jail.conf, set ignored ips) /etc/fail2ban/jail.d/sshd.local # sshd config (required to protect ssh) /etc/fail2ban/filter.d/f2b-loop.conf # nested jail processor /var/log/fail2ban.log # log of fail2ban activity (bans/unbans)
Resources: Install Fail2Ban on CentOS, Increased Ban Times for Repeat Offenders
CRON
crontab -e # edit current user crontab /etc/crontab # location of system crontab /var/spool/cron/crontabs/ # location of user crontabs # Special Strings @reboot /path/to/script # Run once, at startup. @yearly /path/to/script # Run once a year........ "0 0 1 1 *" @annually /path/to/script # (same as @yearly) @monthly /path/to/script # Run once a month....... "0 0 1 * *" @weekly /path/to/script # Run once a week........ "0 0 * * 0" @daily /path/to/script # Run once a day......... "0 0 * * *" @midnight /path/to/script # (same as @daily) @hourly /path/to/script # Run once an hour....... "0 * * * *"
Resources Using crontab on Linux
CylancePROTECT
General
systemctl start cylancesvc # start cylance service systemctl stop cylancesvc # stop cylance service systemctl restart cylancesvc # restart cylance service systemctl status cylancesvc # get status of cylance service /opt/cylance/config_defaults.txt # installation defaults (required)
Installation
# First, create the installation defaults file: /opt/cylance/config_defaults.txt InstallToken=<_REDACTED_> SelfProtectionLevel=2 LogLevel=2 VenueZone=<_REDACTED_> UiMode=2 # Install Dependencies on Ubuntu apt update apt install libxml2-utils make gcc bzip2 linux-headers-generic # Install Application on Ubuntu dpkg -i cylance-protect.1604.x86_64.deb # Install Dependencies + Application on CentOS 7 yum install zlib CylancePROTECT.el7.rpm # Register Installation w/ Cylance Console /opt/cylance/desktop/cylance -r <_REDACTED_>
Active Directory
Join via 'Realm'
# Install Required Dependencies (RHEL/CentOS) yum install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python # Install Required Dependencies (Debian/Ubuntu) apt -y install realmd oddjob oddjob-mkhomedir adcli samba-common-bin libnss-sss libpam-sss sssd sssd-tools packagekit # Join to Domain realm join --user=<_ADMIN_USER_>@<_USER_AD_DOMAIN_> <_AD_DOMAIN_SERVER_> realm list # confirm proper join # Fix /etc/sssd/sssd.conf by uploading the correct copy /etc/sssd/sssd.conf # upload correct copy systemctl restart sssd # restart sssd service # Test access (should show AD groups) id <_AD_USER_> # Ubuntu Systems Only pam-auth-update # make sure 'create home directory on login' is checked dpkg-reconfigure gdm3 # fix login loop issue for GUI
Resources: Join CentOS 7 to AD, Join Ubuntu 20 to AD, Ubuntu Login Loop Fix
Leave via 'Realm'
# Leave the Domain realm leave <_AD_DOMAIN_> -U '<_USER_AD_DOMAIN_PREFIX_>\<_ADMIN_USER_>'
Resources: Removing a System from a Domain
Restrict Access by AD Group
Modify /etc/sssd/sssd.conf with the following…
[domain/<_AD_DOMAIN_>] access_provider = simple # required simple_allow_groups = group1, group2 # group(s) to allow simple_deny_groups = group3 # group(s) to deny [domain/<_USER_AD_DOMAIN_>] access_provider = simple # required simple_allow_users = user1, user2 # user(s) to allow [DOES NOT WORK, 1/25/23] simple_deny_users = user3 # user(s) to deny [DOES NOT WORK, 1/25/23]
Note: Because user specific allow/deny isn't working, it's best to use AD groups to allow/deny in the interim.
Qualys Cloud Agent
General
systemctl start qualys-cloud-agent # start qualys service systemctl stop qualys-cloud-agent # stop qualys service systemctl restart qualys-cloud-agent # restart qualys service systemctl status qualys-cloud-agent # get status of qualys service
Installation
# Install Application on Ubuntu apt update sudo dpkg --install QualysCloudAgent.deb sudo /usr/local/qualys/cloud-agent/bin/qualys-cloud-agent.sh ActivationId=<_REDACTED_> CustomerId=<_REDACTED_> # Install Application on CentOS 7 sudo rpm -ivh QualysCloudAgent.rpm sudo /usr/local/qualys/cloud-agent/bin/qualys-cloud-agent.sh ActivationId=<_REDACTED_> CustomerId=<_REDACTED_>
ULimit
This does not seem to work very well on RHEL/CentOS 7 systems. Please use cgroups instead.
/etc/security/limits.conf # adjust soft/hard limits for system resources
Resources: limits.conf Manual, How to set ulimit values
XRDP
# Install XRDP on CentOS 8 (Rocky/AlmaLinux/RHEL) dnf groupinstall "Server with GUI" # install system GUI dnf install epel-release # install pre-requisites dnf install xrdp # install xrdp systemctl enable xrdp # enable xrdp service systemctl start xrdp # start xrdp service firewall-cmd --add-port=3389/tcp --permanent # open firewall port for RDP (3389) firewall-cmd –reload # reload firewall # Install XRDP on Ubuntu 20/22 apt update # update package manager apt install ubuntu-desktop # install system GUI apt install xrdp # install xrdp systemctl status xrdp # check if xrdp service is running adduser xrdp ssl-cert # add xrdp user to ssl-cert group ufw allow 3389; ufw reload; ufw status # open firewall port for RDP (3389), reload
Resources: CentOS 8 Remote GUI with RDP, Install XRDP on Ubuntu
Disk Quotas
/dev/sdbX /DIR ext4 defaults,usrquota,grpquota 0 0 # edit /etc/fstab, add 'usrquota' & 'grpquota' to mount, reboot quotacheck -um /DIR # create user quota config quotacheck -gm /DIR # create group quota config quotaon -uv /DIR # enable user quota quotaon -gv /DIR # enable group quota quotaon -ap # show on/off status edquota -u USR # edit quota for user USR edquota -g GRP # edit quota for group GRP repquota -asu # show user quota report/status repquota -asg # show group quota report/status
Resources: Set Disk Quota, EXT4, Set Disk Quota, XFS
Docker
CentOS 7/8: Install Docker
yum install -y yum-utils # install utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # install repo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin # install docker
Resources: Install Docker on CentOS
General
systemctl start docker # start docker service systemctl stop docker # stop docker service systemctl restart docker # restart docker service systemctl status docker # get status of docker service docker run hello-world # test if docker is working docker compose up # run all dockers listed in ./docker-compose.yml docker compose up -d # same as previous but runs in the background docker compose down # stop all dockers listed in ./docker-compose.yml docker ps -a # see status of all containers, get container id docker stats # show performance statistics of all containers docker stop MYAPP # kill container MYAPP gracefully (can use id or name) docker compose pull # pull updated containers (will recreate containers on next 'compose up')
CGroups
# Install cgroups yum install libcgroup libcgroup-tools # Enable Services chkconfig cgconfig on chkconfig cgred on # Control Services systemctl status cgconfig # service that does the actual controlling systemctl status cgred # service that decides how to apply controls systemd-cgtop # see which cgroups are running and their resources # Configure /etc/cgconfig.conf # Default configuration - do not edit /etc/cgconfig.d/cpu_cap.conf # Custom configuration (can be named anything) /etc/cgrules.conf # Apply specific cgconfig rules to specific users/processes
Resources: Hand rolling your own cgroup
GIT
[working dir] -> git add -> [staging area] -> git commit -> [repository] | | | | | git log | | (shows files tracked in repo) | | | git status | (shows what's in staging) git diff (shows changes between working & staging)
get --version # show current installed version of git git init # create repo in current directory git add FILE # add FILE to repo git commit -m "MSG" # commit repo, add MSG as description git diff # show differences since last commit git log # see change log git status # see status of files (between add and commit ) git branch # see branches git branch BRCH # create branch named BRCH git checkout BRCH # switch to branch BRCH git config --global user.name <name> # set author name to NAME git config --global user.email <email> # set author email to EMAIL