Skip to content

Latest commit

 

History

History
1596 lines (1339 loc) · 59 KB

README.md

File metadata and controls

1596 lines (1339 loc) · 59 KB

CLI for Full Stack Engineers

A prioritized list of the most important CLI commands for full stack engineers

Key Principles

  • Less is more: This is a prioritized list that totally ignores less used commands or command flags - it is NOT a reference list. This doc is meant to represent the entire histogram of commands used by (or that should be used by) all full stack developers today - and aims to concentrate on the most important parameterizations of the most important commands and command cocktails
  • Audience: The audience is a full stack (or part stack) engineer, NOT a sysadmin
  • Cocktails: This doc includes command cocktails (multi commands, like a series of piped commands); man pages don’t show this, so this is a core reason for this doc
  • Terseness: Use the minimal amount of words to explain something, this is not documentation
  • Context: It might be relevant to explain when or how something should be used if it is non-obvious (or even link to the relevant doc - see strace)
  • There’s a mix of BSD and Ubuntu (many people use Mac for dev and a Ubuntu-type instance for the server) - this probably needs to be better called out; this is focused on bash
  • This doc includes other basics of the CLI (keyboard shortcuts) with the assumption that this helps people get around CLIs (e.g., when ssh-ing into a server)

Other Resources

Tools

Authors
  • Nemil Dalal (nemild at gmail)
  • Evren Cakir (code at evrencakir)
  • [If you spend more than 15 mins on this doc, add your name here]

Table of Contents

Keyboard Shortcuts
Getting around the command line
Basics
Advanced
Command Cocktails
Custom Commands

Sysadmin Basics
Setup

Keyboard Shortcut Description
Ctrl-C terminate program, TERM signal
Ctrl-\ QUIT signal
Ctrl-A go to start of line
Ctrl-E go to end of line
Ctrl-W cut the previous word
Ctrl - undo
Ctrl-U clears the line before the cursor position.
Ctrl-K Kill the line after the cursor
Ctrl-U/Ctrl-Y Cut line, write text and then paste line after new text
Ctrl-XX Move between start of line and current cursor position
Ctrl-X/Ctrl-E use text editor to input command, used for long or multiline commands, can also use fc
Ctrl-L clear screen
Ctrl-D terminate program (send EOF)
Ctrl-Z suspend program, fg to return
Ctrl-R search command history, start typing command, ctrl-r again to cycle through other matches in reverse chronological order
Ctrl-G Escape from search command mode (may be just easier to use Ctrl-C)
ESC-. past last argument of previous command
Ctrl-B/Ctrl-F Page up and down
Ctrl-D/Ctrl-U Half page up and down
Ctrl-S/Ctrl-Q stop output to screeen (for verbose commands) / resume output to screen
Ctrl-T swap previous two characters (used for misspellings)
Meta-T swap previous two words
ESC-BACKSPACE delete previous word
ESC-d delete next word

Other Basics

  • Three streams are stdin, stdout, and stderr
  • find . 2> # the 2> pipes out stderr only, can use &> to pipe out both stdout and stderr
  • pipe both standard error and stdout is |&
  • Treat output of command as a file input: diff /etc/hosts <(ssh somehost cat /etc/hosts)

Previous Commands or Arguments

history # see list of previous typed commands
history -c # clear list of previous typed commands
history | grep command # list out previous calls with command, then do !123 to run where 123 is the number shown for the command
!! # run previous command
!string # run most recent command starting with string
!string:p # print most recent command starting with string
!?string? # run most recent command with this substring
!105 # run command number 105 from history
!-2: Run command 2 before the current command in history

^abc^def^ # replace first argument with second argument in previous command (only for first occurrence)
!!:gs/foo/bar # run last command replacing all foo with bar

!:$ # last argument of previous command (also !$)
!:0 # first argument of previous command (and number can be incremented for other args)
fc # edit your last command in your editor and execute it

Some basic tricks

ls \ # the backslash lets you continue a command on the next line
cd abc; ls # the semicolon lets you put separate multiple commands on the same line
cd abc && ls # && means run second command only if first succeeds, compare to ||
\gpom # ignore the alias
 ls # leading space means don’t store in history

Other basics

Command Description
which command determine which command path is used to run command, used when you may have multiple binaries (looks through directories in your search path in order, and lists the first found)
whereis command looks through list of standard directories independent of search path, displays all files found (not just first)
env print system environment variables
export PATH=$HOME/bin:$PATH add bin path to the existing path
Commonly used flags across Linux commands
Flag Description
-v verbose or invert
--version show version
-i ignore case
-w ignore whitespace
-u user
-h pretty format the size (from bytes to mb/kb/etc), if using this when sorting, use sort -h (only non-Mac)
--color use color
-r reverse listing (descending order) or recursive
ls -- -l the double hyphen indicates that everything afterward should be considered an argument, not an option (the 'l' is not considered a command line flag, but an argument)

cd: Change Directory

cd [ANY DIRECTORY] # base usage
cd # go to home
cd ~ # go to home
cd - # go to previous directory
cd .. # go up one directory
(cd ~/asd && ls) # execute command in subshell, at end you are back in your current directory

pushd/popd: reference your working directory as a stack

pushd /home/test/ # push directory to stack
pushd /home/test/show/ # push directory to stack
pushd /home/test/doc/ # push directory to stack
dirs -v # list all directories in stack with index number
popd # pop the most recent directory from stack and cd into it
popd +1 # pop a particular directory from the list of directories (without going to that directory)

mkdir: Make Directory

mkdir dirname # base usage
mkdir -p dirname1/dirname2 # make all nested directories that don’t exit
rmdir lets you remove an empty directory
mkdir -p foo/{bar,baz} # create both bar and baz subdirectories

ls: List directory contents

ls -1 # (Number 1) list in a column
ls -l # provide information (ownership, permissions, file size, modification date)
ls -h # make disk usage info pretty (kb, mb, etc.) - not bytes
ls -r # reverses order, now ascending rather than descending
ls -t # sort by time modified, most recent at top by default (descending)
ls -G # colorize
ls -a # show hidden files/directories (all files/directories beginning with a dot)
ls -S # sort files by size
ls -F #  Display a slash (`/') immediately after each pathname that is a directory, an asterisk (`*') after each that is executable, an at sign (`@') after each symbolic link, an equals sign (`=') after each socket, a percent sign (`%') after each whiteout, and a vertical bar (`|') after each that is a FIFO
ls -d */ # directories only
ls -p # ack -v # files only
ls -ld dir/ # see details of a directory, not listing of items in a directory (used to see permissions)
ls -i # print inode
ls | wc -l # number of items in directory (including subdirectories)
ls -R . # recursively list the files and directories
ls | grep -v *.rb # filter out unwanted results, like .rb files
ls -lart # list files in the current dir by the last time they were modified. (-l = long, -a = all, -r = reverse, -t = order by mod time)

Popular usages

ls -lah
ls -ltr # sort by time, with latest at bottom
ls -larthG # same as above plus show hidden, human readable file size, colorize

man: Manual

man command # shows manual page for command typically using less
man -k keyword # do a keyword search for manpages containing a search string

# For bash built ins, use help

# The following are popular commands in man
Ctrl-B/Ctrl-F # page up and down
/searchterm # to search forward, can use standard vim commands including n and N to go forward and backward to searchterms, use this to search for flags ('-n')
?searchterm # search backward
h # display help, keyboard shortcuts
man man # shows section numbers
man ascii # ascii table
man hier # explanation of file systen
man 2 ls # go to section 2 of ls, search for what each section number means
# Most users find their info in sections 1 (User commands), 6(Games), and 7(Miscellaneous)
# use with whatis (complete word matches) and apropos/man -k (partial word matches), to determine what commands are available
# can also use info or help

cat: Print a file to the screen

cat abc.txt def.txt # can use on multiple files
cat abc.txt def.txt > new.txt # concatenate multiple files in order into a single file
cat *.txt # output all files matching *.txt

cat > file.txt # Create file, edit, then CTRL-D to save and exit

cat -n # number lines starting at 1, can also call nl -b a
cat -b # number non-blank lines, can also call nl -b t
cat -T # Show tabs in a file
Note: Don’t pipe a cat ('cat hello | dosomething'), instead 'dosomething < abc.txt'

# backwards cat is tac

less: Print a file with pagination

used to print files with pagination, can use standard keyboard shortcuts like page up and down, plus some vim commands like search (/ and ?, n and N). q to quit, arrow keys (and vim navigation keys) to move up and down, switch between files

less filename.txt # print file with pagination
less filename.txt filename2.txt # open multiple files, can use :n and :p to move back and forth
less +F # use instead of tail -f, can Ctrl-C, /searchterm, and then type F to have search terms highlighted
less -r # retain color codes, e.g., use with color options on the command you are piping to less
less -S # chop lines that go past screen end (rather than wrapping), allows horizontal scrolling

head: Display the first part of a file

Both head and tail show a delimiter with a filename, and can be used for multiple files simultaneously

head -100 abc.txt # number of lines, can also do -n 100, default is 10 when not specified
head -c50 # first 50 characters
head abc.txt def.txt # multiple files
head * # list all files in directory, with name as delimiter
head -q *txt *gbk # heads of multiple files w/o delimiters

tail: Display the last part of a file

# head flags from above apply here
tails -n +10 file.txt # show last lines of file starting with 10th line

tail -f # don't exit, but keep outputting data as appended (used especially in viewing logs), see the less +F command for a potential replacement
tail -F # same as -f except if the file is replaced or truncated, follow the new file that is now pointed to by the filename
tail -f "my_server.log" | grep "my process" # Filter lines containing a match for "my process" from a text stream
tail -f /var/log/*.log # tail all log files 
tail -f /var/log/syslog -f /var/log/auth.log # multiple files

echo: Write arguments to the standard output

echo "line1\nline2" >> .bash_profile # append string to end of .bash_profile, quick way to edit
echo "line1\nline2" > output.txt # quick way to create file with text, compare to touch and then nano/vim
echo -n "Hello" # this line is not followed by a newline as is standard
echo -e "Hello\nWorld" # interpret backslash escape sequences like newline ('\n') and tab ('\t')
echo -e "\nalias ..='cd..'" >> .bash_profile # quickly append text to the end of a file

# multiline
echo "This is the first line
This is the second line"

echo $var # print shell variable
echo $(pwd) >> log # way to run a command and append to file
echo "ls -l" | at midnight # execute command at a certain time
echo {a..z} # print a through z, can be used for numbers as well

ln: Make link

Used primarily for symbolic or soft link

ln -s /a.out b.out # create symbolic link, a pointer to the original file - use to create a pointer rather than a deep copy, ls -l will show what a symbolic link points to, make sure to use absolute link path for the source file/dir
ln -sb # backup of existing files if overwriting
ln -sf # if target file link exists, unlink so that the new link may occur

grep: File Pattern Searcher

For most programming needs, it is preferable to use ag or ack

grep 'substring' --color file1.txt file2.txt # search for substring can be used with multiple files
grep 'substring' -riI --color . # recursive (-R is the same), ignore case, ignore binary file matches, highlight match in color, a common usage

# The basics (substring and path follow the flag)
grep -i # case insensitive
grep -v # invert
grep -c # incidence count
grep -x # exact match
grep -n # show line numbers
grep -w # search for whole words
grep -l # list filenames with matching content
grep -I # ignore binary file matches
grep -m n # show only n number of matches in each file

# Show context
grep -A # 3 lines after
grep -B # 3 lines before
grep -C # 3 lines before and after

# include exclude files and/or folders
grep --include="*.js"
grep --exclude="*.js"
grep --exclude-dir="./tmp"
grep --include-dir="./directory_to_scan"

# Regular expressions
grep -E # interpret pattern as a regular expression, can also use egrep
grep -E -o # print only matching part of the line (-o option is used often with -E option)

# For gzipped files
zgrep –i substring /var/log/syslog.2.gz

# No Regular Expressions (faster grep)
grep -F # or fgrep

# Getting pattern from a file
grep -f pattern_file file

# Popular usages
grep -iIrn computesSum * # Case insensitive search through all of the files recusively starting from my current directory for the string "computesSum" but does not search binary files.  When a match is found, print the line number it was found on
grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' input.txt > output.txt # grep for IP address
grep -r --include="*.py" "pattern" /path/to/dir # grep recursively through files of a certain type, such as .py files
grep -m 1 "needle" *.txt # show only the first match in each file

ack (and ag): grep-like tool

Optimized for programmers searching source codel; ignores .git folder, minified files, etc.

Many ack flags are similar or the same as grep; most programmers using git should use ag which is faster than ack and has a few other benefits (respecting .gitignore, etc.)

ack

ack 'substring' # search for substring
ack --ruby 'substring' # find files in a specific language
ack -w 'substring' # whole word search
ack -l 'substring' # list filenames with matching content
ack -C 3 'substring' # show context around match

ack -cl # list filenames with matches, along with incidence
ack -ch # list number of total matches
ack --python # restrict search to a language
ack -f . # list all files that will be searched
ack -g substring # look for files in subdirectories that has substring in its path

ag

# defaults to ignoring binary files plus those in .gitignore, .hgignore, .agignore and svn:ignore; default folder depth is 25

ag -i # ignore case
ag foo -G bar # find 'foo' in filenames matching bar

# File types
ag --list-file-types # list file types that can be specified
ag --html # search only html files, with extensions as listed in previous command

# restrict to files based on regex
ag -g pattern # print filenames matching pattern
ag -G pattern substring # only searches filenames matching pattern

# caveat for logs/piping: defaults to printing only the first 10k matches per file, and 2k characters per line

find: Walk a file hierarchy (search for files etc. matching certain criteria, can also be used with xargs/parallel )

find . -name "hello.txt" # standard usage
find . -name "*.txt"
find / -name "ice.log" # search filesystem root for files named ice.log 
find . -name “abc” 2>/dev/null # output to dev null when doing global search, and don't want to discard errors (e.g., file is not accessible because not a super user)
-iname "abc.txt" OR -iname "*.txt" # search for case insensitive
-mtime -7 # modified time is within seven days previous to today, can also use 7s, 7m, 7h, 7d, 7w to specify seconds/minutes/hours/weeks
-ctime -7 # created time is within 7 days of today
-print0 # used with xargs -0 option, can pipe find results to xargs
-type l/f/d # search for a type of item, f = file, l = symbolic link, d = directory
-not # invert all filtering criteria
find abc/ # lists everything recursively in directory
find -inum 16187430 # inode number 
find -maxdepth 1 # only list in current directory, not subdirectories
find -perm 444 # search based on permissions

# Popular usages
find . -type f -ls # shows sizes/dates on tree of files, but easier to read than ls -lR
find . | wc -l # number of files in directory and subdirectories
find . -name "*.foo" -exec tail {} \; # output the last 10 lines in each .foo file in directory and subdirectories
find . -iname '*foo*' # find all files that contain foo in their name
find . -type d -empty -delete # find and remove empty directories
find . -type f -empty -delete # find and remove empty files
find . -type d -ctime -5 # find all directories created in the last 5 days
find ./ -not -type d -printf "%T+ %p\n" | sort | tail -1 # find last modified file in currenct directory
find -L . -type l # find broken sym links
find ~/chat -name *.txt | xargs grep 'substring' # grep for term in each matched file

jobs: (and fg and bg)

Job is a program you interactively start that is not a daemon. Jobs in background that required input are automatically stopped.

jobs # list out jobs, states are Running, Stopped; + is most recent job that is still running, - is second most recent
sleep 10000 & # start job in background
sleep 100000 # start job in foreground, then Ctrl-Z to suspend, each new job is higher number than others currently running
bg %2 # background the suspended job (assuming the number is 2), bg on its own will background the highest numbered job
fg %1 # bring job 1 to foreground, also can do %1, fg on its own will foreground the most recent/highest numbered job
fg %find # search for starting of string
fg %?ace # search for substring
kill %2 # kill job number 2

nohup: No hangup

Keep command running when logged out

nohup command | run command, ignoring any hangup signals (used when starting a process on a server which you want to keep running when you logout)

tar: Archive file or path

Create a single file from multiple files and/or subdirectories (old tape archive)

tar -cvf . ~/abc.tar # compress, verbose, compress to filename provided
tar -tvf # get info
-xvf # extract, verbose, extract filename provided
-xvzf # extract, verbose, uncompress gzip, extract filename provided
-cvzf # gzip as well as archiving
-cvjf # bzip2 as well as archiving
-cvJf # xz as well as archiving

gzip: Compress

xz and bzip2 are slower to compress but often much smaller (below), but gzip is still commonly used

gzip -l abc.gz # info on compressed file (compression ratio)
-d # decompress

bzip2 and xz

bzip Similar options to gzip (though not exact). xz is slower and requires more memory, but leads to smaller output files.

bzip2 abc.tar out.bzip # compress
bzip2 -d out.bzip # decompress
bzip2 -r archive_name.bzip folder_to_compress

xz abc.tar out.xz # compress
xz -d out.xz # decompress
xz -l out.xz # list

zip: Cross platform zip (Mac OS X)

zip -r archive_name.zip folder_to_compress #compress
unzip archive_name.zip #extract
zip -r -X archive_name.zip folder_to_compress #make a zip and exclude invisible Mac resource files such as “_MACOSX” or “._Filename” and .ds store files

sort

sort abc.txt def.txt # ascending, can do multiple files
sort /path/to/directory/*.csv # sort all files

sort -r # descending, z to a, 10000 to 1
sort -n # sort according to numerical value on line (even if there is other text on the line)
sort -R # randomize, GNU sort
sort -f # ignore case
sort -u # show max 1 of each unique element
sort -k 2 # start at key 2 (used for separated columns, like the history command)
sort -k2,2 # sort only by 2
sort -k1,1 | sort -s -k2,2 # sort by 1, then secondarily by 2

sort -h # sort by human readable size (use with -h on another command, like du -h), GNU sort
sort -T /some/tmp/dir # can set a custom temp directory for large sort jobs
sort -t , # use custom separator

uniq

Note: only compares adjacent lines for equality, so typically need to sort in advance

uniq -c # give incidence of line, will show repeated only once
uniq -d # only output duplicated items, single time
uniq -u # only output lines not repeated (different from sort -u)
uniq -i # case insensitive

uniq -cd # Show count of lines that have duplicates

wc: Word Count

# by default shows num lines, words, characters (in that order)
wc -w # word count only
wc -l # line count only
wc -c # bytes
wc -m # characters

wc -L # longest line length, used often for style in code, where 80 lines max may be a desired norm in a team

find path/to/dir | xargs wc -l # count the number of lines of all files in a directory

ssh: Open SSH client

set the ~/.ssh/config file to make life easier on client side for sshing into commonly used servers
~/.ssh/authorized_keys # list of public keys that are authorized to login to this server

ssh -i ~/.ec2/abc.pem [email protected] # ssh into server with public key at path
ssh -i ~/.ec2/abc.pem [email protected] "command_to_run" # ssh into server with public key at path, run command_to_run, and disconnect
ssh -p 1000 remote_host # ssh to port 1000 on remote
ssh hostname "cd abc && ls -lah" # ssh then run command
ssh -D 1234 hostname # use hostname as a SOCKS proxy on localhost:1234
ssh -f -N -R 8888:example.com:80 username@remote_host

ssh -L # specify that the given port on the local side should be forwarded to port on remote side
ssh -R # 

# Can suspend a session by pressing 1. Enter 2. ~ 3. CTRL-Z
# Tilde (~) lets you send commands to SSH

# Setup
ssh-keygen # to generate private and public key ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub
ssh-keygen -p # change or remove passphrase
ssh-copy-id username@remote_host # automated way of copying public key to remote server's authorized_keys file
sudo nano /etc/ssh/sshd_config # Uncomment and ensure 'PasswordAuthentication no' and 'PermitRootLogin no' to prevent login by password and root login, can also change default port to reduce risk of intrusion; will need to restart afterward: sudo service ssh restart

sftp: Secure FTP

sftp ftp.example.com
sftp [email protected]

# upload/downlod
put file.txt
get file.txt

# batch upload/download
mput *.txt
mget *.txt

bin # binary mode

# commands on local file system can be run by appending l in front
lpwd
lls
lcd dir
lmkdir dir

mv: Move file from src to dest

mv src_file_or_directory dest_file_or_directory # base usage
mv srcfile srcfile srcfile destdirectory # can move multiple sources at once
mv hello.{txt,old} # quick rename

rename: Batch rename

rename 's/\.html$/\.php/' *.html # rename html file extensions to php
-n # add this flag to list what would change without changing
-v # add this flag to show changes made

cp: Copy a file from src to dest

cp src dest # base usage
cp -R srcdir destdir # recursive

rm: Remove file

rm abc.txt # base usage, remove file
rm -rf abc # recursive deletion (including subdirectories), f is force delete, use with caution
rm -i # prompt before deleting
rm !(*.foo\|*.bar\|*.baz) # delete everything but

# can also use srm for secure removal
srm -m /path/to/file # 7 pas
srm /path/to/file # 35 pass

diff: Compare two files

first lines in output refer to source lines, then a letter (a = add/+, c = change/!, d = delete/-), and then destination lines

-c # context mode
-u # unified mode
-y # side by side

-b # ignore things that change the whitespace only
-b # ignore blank lines
-w # ignore all space
-i # ignore case

-a # treat file as text
-C 3 # output num of copied context, 3 lines is default
-q # show only that the files differ, useful for scripts

diff -r DIRECTORY1 DIRECTORY2 # show the difference between two directories
diff -rq DIRECTORY1 DIRECTORY2 # show the difference between two directories, only showing the names of files that differ

diff <(sort file1) <(sort file2) # show the difference between two files
diff -r tree1 tree2 | diffstat

nl: Line Numbering

is there a reason to use this rather than cat?

nl -b a # number all lines
nl -b t # number non-empty lines

scp: Secure Copy

scp server1:~/abc/def.txt . # base usage
scp -C # compression enable
scp -i abc.pem # use public key
scp -l 5000 # limits bandwith used, Kbit/s
scp -P 21 # remote port
scp -p # preserve modification time
scp -r # recursively copy entire directories
scp -v # verbose mode

tmux: Terminal Multiplexer

Enables a number of terminals to be accessed and controlled from a single terminal; great for multiple panes/windows/sessions (windowing) and persistent state on remote servers

Hierarchy:
Sessions (Overall theme, like work or sysadmin) > Windows (Projects within theme) > Panes (Views within a project, seen on a single screen)

Highly encouraged to name sessions and windows

Note:

  • CTRL-b is the prefix key required before pressing a key (can be changed - e.g., for ex-users of screen); many commands allow you to use this as well as an actual command
  • May consider remapping CAPSLOCK to CTRL to make life easier

The Basics

# ---------------------------------------------
# SESSIONS
# ---------------------------------------------
tmux new -s session_name # start and attach
tmux a # attach to first available session
tmux a -t session_name # attaches to an existing session
tmux ls # list sessions
tmux detach # CTRL-B d

tmux rename-session -t <old> <new> 
tmux kill-session -t <session>  

# CTRL-b ? # List all keybindings
# CTRL-b : # command prompt where you can execute any command tmux supports

Main Keyboard Shortcuts
Put the prefix key before keys listed below (default: CTRL-B)

Command
(Key)
Session Window Pane
Create :new -s SESSION_NAME
New: c
Pane to Window: !
Horizontal Split: %
Vertical Split: "
Rename $ ,
List tmux ls
s SESSION_NAME
w
Search f SEARCH_TERM
Close / Kill :kill-session -t SESSION_NAME & x
Previous / Next ( / ) p / n Arrow Key (selects pane in specified direction)
Last l ;
Select / Move to index NUMBER q NUMBER
Swap :swap-window -s 3 -t 1 (Keyboard: . NUMBER) { }

Other

# ---------------------------------------------
# COPY/PASTE (with emacs bindings)
# ---------------------------------------------
CTRL-b [ # enter copy mode
     * SPACE to start copying text at cursor
     * move cursor to end of desired text
     * ENTER to copy selected text

CTRL-b ] # paste selected text

# ---------------------------------------------
# OTHER
# ---------------------------------------------
tmux info # list out every session, window, pane, etc.
tmux list-commands # list out every tmux command and its arguments
tmux list-keys # lists out all bound keys, and relevant tmux command
tmux source-file ~/.tmux.conf # reload the tmux config file. tmux default config file is in ~/.tmux.conf

# CTRL-b t # show time in current pane

# Kill all tmux windows
killall tmux

# Use this to start tmux on iTerm 2
# will use iTerm 2 interface for tmux, but will let you restore environment when you need
tmux -CC
tmux -CC attach

# with credit:
# Josh Clayton: http://robots.thoughtbot.com/a-tmux-crash-course
# Cody: http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/

cURL: Transfer a URL

Certain commands taken from here

# The Basics
curl http://www.example.com/index.html -o abc.html # output to file abc.html
curl -O http://www.example.com/index.html # output to the remote filename on local, in this case index.html

# Common Options
curl -X POST # can use the standard verbs, plus custom ones
curl -H "Accept: application/json" # set custom headers, can add multiple by using multiple flags # can also use --header
curl -d "birthyear=1905&press=%20OK%20"  http://www.example.com/when.cgi # send data to server in body, automatically POST, can also separate by separate -d arguments rather than an &
curl -d @invoice.pdf -X POST http://devnull-as-a-service.com/dev/null # post a file
curl -i http://www.example.com # show response body AND headers 

# Other
curl -v # verbose
curl --cacert file.pem
curl -d '{"user": {"name": "zaiste"}}' -H "Content-Type: application/json" http://server/
curl --data-urlencode
curl --form upload=@localfilename --form press=OK [URL] |
curl -u myusername:mypassword http://localhost # pass a username and password for server authentication

curl --head # head request only

curl ifconfig.me/ip # get IP
curl ifconfig.me/port # get port

wget: Network Downloader

# Basics
wget http://path.to/file
wget http://path.to/file1 http://path.to/file2

wget -O abc.html http://www.example.com/def.html # output to file
wget -i tmp.txt # download a list of URLs, file list has URLs listed one per line
wget -b # background download, with log file at: /wget/log.txt
wget -c http://www.example.com/abc.tar.bz2 # continue a previously interrupted download, typically make 'wget -c' an alias for wget so it is automatic


wget -pk http://path.to.the/page.html # To mirror a whole page locally
wget -mk http://site.tl/ # To mirror a whole site locally
wget http://www.myserver.com/files-{1..15}.tar.bz2 # To download files according to a pattern

wget -w 2 -r -np -k -p http://www.stanford.edu/class/cs106b # recursively download an entire site, waiting 2 seconds between hits (courtesy Stanford Startup Engineering class)
wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com # Download an entire website

cut: Cut out selected portions of each line of a file

cut -d':' -f 1,5 # d is delimeter, f is field number, add -s to only show lines with this delimeter (else will print whole line)
cut -c1 # extract character
cut -c1-5 # extract range of characters
cut -c1- # extract from 1 to end
--complement # invert

join: Relational database operator

join -1 1 -2 2 abc.txt def.txt # default join is on field 1, use -1 and -2 to specify column if different, inner join by default
-t , # use , as field delimiter
-a1 -a2 # left outer join, right outer join; both together are full outer join

tee: copies standard input to standard output, making a copy in file

used when you need to store intermediate output

ls | tee abc.txt | something_else
ls | tee -a abc.txt # append to the file, rather than overwrite
tee abc.txt def.txt # output to multiple files

jq: JSON Command Line Tool

Useful for cURL-ing APIs and json files, non-standard so install with package manager of choice

curl http://www.example.com/abc.json | jq '.' # prettify json
curl http://www.example.com/abc.json | jq '.[0]' # restrict output to first element in array
curl http://www.example.com/abc.json | jq '.abc.def' # restrict output to "def" key within "abc" key
jq 'length' < abc.json # number of elements in JSON array
jq '.[0] | {message: .commit.message, name: .commit.committer.name}' < abc.json # create two new keys with the associated data from the input (can nest)

-S # sort keys in alphabetical order
# Just the basics, see docs for more details: http://stedolan.github.io/jq/manual/

convert: Image conversion

Image conversion using ImageMagick - useful especially for resizing and converting formats.

convert src.jpg dest.png # convert from one format to another
convert image.png -resize 50% out.png
convert a.png b.png c.png +append out.png

at: Schedule command for later execution

command at {time}

# {time} can be either
# now | midnight | noon | teatime (4pm)
# HH:MM
# now + N {minutes | hours | days | weeks}
# MM/DD/YY

atq # To list pending jobs
atrm {id} # To remove a job (use id from atq)

mount: Mount file systems

mount # show all mounted file systems
mount | column -t

mount /dev/sdb1 /u01 # mount device to directory

Other commands

Command Description
pwd print working directory
touch abc.txt def.txt create empty file or files
date date and time
date +%s / date -r 1231006505 to/from unix epoch time
date +"%Y%m%d_%H%M%S" print out date in format for affixing to filenames
cal / cal 3 1973 / cal -m 3 / cal -y 2013 calendar of current month
dirname/basename basename will strip suffix provided as second argument
whois hostname
pidof
mcookie generate pseudo random string
whatis command short description of command
apropos command find commands like this
pbcopy / pbpaste macintosh, pipe to/from these for clipboard, see alias section for Linux
units convert between units
hostname displays the system name
read var1 set variable to stdin
yes print y forever, used if you want dummy text, often used with head to restrict to a certain number of lines, can also tack on a prefix/suffix to make each line unique
script record everything typed in a text file
file abc.txt get info on file type
clear clear screen

ifconfig: Configure network interface

ifconfig -a # view all network interfaces
ifconfig eth0 # show a single interface
ifconfig eth0 up # turn on
ifconfig eth down # turn off
ifconfig eth0 192.168.2.2 # assign IP address to interface, may need sudo privileges

ifconfig eth0 promisc # turn on promiscuous mode
ifconfig eth0 -promisc # turn off promiscuous mode

gcc

gcc def.c # compiles, assembles and links a program, executable is in a.out
gcc -c abc.cpp # compile cpp
gcc abc.o def.o -o def.out # link and create binary with filename, -o is output
gcc -Iabc/def/ # look for include files in directory before looking in standard locations (can use mutliple of these)

parallel: Run commands in parallel

# this is for non-BSD systems
parallel command -- 1 2 3 # each item past the -- is passed to the
command singly, with
-n 3 # send 3 arguments at a time, default is 1
-j 5 # max jobs in parallel
parallel -- ls "cat abc.txt" "df -h" # run specified commands
# split is used with parallel, as split can break up a file before you farm it out to multiple servers

xargs: execute multiple arguments

# run a command on a list of files, used typically from the piped output of another command (e.g. find and ls)
ls | xargs cat # run cat on all files listed from ls
-n 2 # 2 files per call
-I abc # use abc as a value that will be replaced by the filename, sets to 1 file per all when using this
-P 5 # parallel
-0 # add this argument on when using with find -print0

ldd: print shared library dependencies

# used to determine shared library dependencies for binaries, useful when attempting to copy a binary from one system to another
ldd -v # verbose

rsync

# used rather than scp when want more complex usage - e.g., can create a directory at the destination if it doesn't already exist
rsync -avz server:abc/ .# recursively transfer all files, using compression (z), plus archive mode (a - preserves symbolic links, dates) and verbose (v)
rsync -avp # preserve permissions
# Others: -r, copy recursively, -h human readable numbers

pgrep: Find processes by name

pgrep mysql
pgrep -n # most recent processes
pgrep -n emacs # most recent emacs
pgrep -u bob # only processes started by Bob
pgrep -l # list out name as well, not just PID
pgrep -v # inverts matching
pgrep -f abc.rb # Find the pids of processes with 'abc.rb' as an argument, like 'ruby abc.rb'

awk

[General Tutorial] (https://www.digitalocean.com/community/tutorials/how-to-use-the-awk-language-to-manipulate-text-in-linux) awk one liners

Awk executes its code once every line $1 is first field, $2 is second, etc. $0 is whole line

Custom variables
NR - row number NF - total number of fields (columns) $NF - contents of last field OFS - output delimiter

awk '/search_pattern/ { action_to_take_on_matches; another_action; }' file_to_parse # standard structure, print is default action if nothing specified
awk '/search_pattern/ { print $1; } /etc/fstab # print column 1
awk 'BEGIN{x=""}{x=x"@"$1}END{print x}' # Begin run at start, End run at end
awk -F ',' '{print $3}' filename # print 3rd column in CSV file
awk '{s+=$1} END {print s}' filename # Sum the values in the first column and print the total

tr: Translate Characters (replace a character with another)

tr ' ' '\_' < abc.txt # replace spaces with underscore, and print to stdout
echo abcdef | tr 'abcdef' 'xyzabc' # each single character in the first string is translated to the corresponding character in the second string
tr '[:lower:]' '[:upper:]'
tr "A-Za-z" "a-zA-Z" # reverse case
tr "a-z" "A-Z" # make lowercase uppercase
tr -d '\r' # delete character, useful when moving txt files between Windows and Linux
tr -dc 'a-z A-Z \t \n '\32'' # invert delete
tr -s '\n' # make multiple instance just a single instance
tr '[:upper:]' '[:lower:]' # upper to lower case

time

time ls # run ls and profile time
wall/real time - can be less than some of system + user time, given parallelism
system time (system calls) vs user time (time spent running user requested command)

sleep

sleep 5; echo "done"  # sleep for 5 seconds then proceed
sleep 5s # sleep for 5 seconds
sleep 5m # sleep for 5 minutes
sleep 1d 5h 5m 10s # can create a list, Linux only
# useful in loops to delay

sed: Stream Editor

Primarily used for substitution (leading 's' below) Tutorial

sed 's/day/night' abc.txt def.txt # replace first 'day' with 'night' per line, can use with multiple files
sed -e 's/day/night' -e 's/something/else/g' abc.txt # -e lets you specify separate commands
sed 's/day/night/;s/something/else/g' abc.txt # same as above
sed -i # inplace editing, replaces file
sed -i.bak # inplace editing, replaces file, and saves backup file with given extension

sed 'G' abc.txt # enters a blank line after each line
sed '=' abc.txt # add line number before each line

sed '/hello/s/world/& !/' hello.txt # replace only on lines that match a certain pattern
sed '/^$/d' file.txt # delete all empty lines

sed '5s/day/night' abc.txt # substitute only on line 5
sed '5!s/day/night' abc.txt # everywhere other than line 5

sed -E # use regular expression
sed -e s/[a-z]/(&)/ # & means use found section

# Common usages
sed '/^[[:space:]]*$/d' input.txt > output.txt # remove blank lines from a file
sed -e 's/<[^>]*>//g' index.html # strip HTML

seq: Sequence

seq 5 # print sequence of numbers starting at 1
seq 1 10 # print from 1 to 10
seq 1 3 10 # go from 1 to 10 in steps of 3
seq -s 'abc' 5 # prepend number onto string

jot: Generate Data

jot NUM LOW HIGH STEP
jot -b hello # repeat word
jot -w hello # use as start
jot -r # random
jot -s’:’ # print data with string as separator (not newline)

mktemp: Create Temp File

mktemp -t abc # use abc as template
-d # make directory instead of file

watch: Execute a program periodically, showing output fullscreen

watch -n 5 tail /var/log/messages # runs every 5 seconds after previous run completed
watch --precise -n 5 # tries to run 5 seconds from previous start
watch -d # highlight differences between successive updates
watch -e # exit if the return value is non-zero

watch -d ls -l # watch contents of a directory change

lsof: Lists open files for active processes, including pipes and network sockets

# by default ORs results, not ANDs
# a good tool to be used with strace
# without arguments, lists all open files for default processes
-a # AND the results, this is where the real power comes in
lsof /some/dir/path # list all open files under path
lsof somefile.txt
lsof -i # list IP Sockets
lsof -iTCP
lsof -i TCP:22
lsof -i -sTCP:LISTEN # Find listening ports
lsof -iTCP:80 -sTCP:LISTEN
lsof -i -sTCP:ESTABLISHED # Find established connections
lsof -iUDP # UDP is for media, when speed matters, but quality does not
lsof -i :80 # list all processes on specific port, this is for web processes
lso [email protected]:21 # Show connections to a specific host
lsof -i @192.168.1.2:6881=6887 # Show open connections within a port range
lsof -u username
lsof -u ^username # all users but username
lsof -c top # show files/connections open by a binary
lsof -p 1232 # for pid
lsof -p `pidof auditd`
lsof -i @fw.google.com:2150=2180 # port range

lsof -t /path/to/file | xargs kill -9 # only output the process PID, then pipe to kill

| grep LISTEN for ports that are awaiting connections
| grep ESTABLISHED

xxd: convert binary to hex

xxd somefile.bin # can be used to then compare two binary files with diff
xxd -i somefile.bin # create C array
xxd -r # reverse operation

strace: Trace system calls and commands (for non-BSD)

best article on this topic is here, dtruss is for Mac

-s 2000 # max 2000 characters per call
-F # follow children
strace -p 123 # use PID 123, for running process
-o output.log # output results to file
-c # incidence count by system call, can compare over time
-T time each execution call
# can man most system calls
# can use lsof's FD column to find files

split: Split file

This command is often used in concert with parallel: split breaks up a file (like a data CSV), and then parallel lets you process each section concurrently

split -b 75m input.zip # cut into multiple files of 75m max
split -n 5 filename # split into 5 files
split -l 10 filename # split into files with each having 10 lines (except last)

cat `ls x*` > reassembled.zip

dtruss

TODO

openssl

openssl genrsa -out server.key 2048 # create a 2048 bit private key
openssl req -new -key server.key -out server.csr # create a Certificate Signing Request
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt # Sign certificate using a private key and CSR

openssl sha1 filename # get sha1 hash of filename
# can also use m5sum on file, to get md5 hash
md5sum file.txt

openssl dgst -sha256
openssl dgst -ripemd160
openssl s_client -connect www.domain.com:443 -showcerts # get certificate from a certain server

ping: Send request to network host

ping google.com # see if a site is up and you can connect to it, resolves domain to IP; does continuously till you terminate
ping -c 3 google.com # ping 3 times then quit

traceroute (Print route packets take to host) and mtr (Network Diagnostic)

traceroute google.com
traceroute -m 255 google.com # up to 255 hops away, default is 30
traceroute google.com 70 # change packet size to 70 bytes
traceroute -w 0.5 host # wait time for response
traceroute -q 5 host # queries per hop

# mtr combines ping and traceroute, main advantage is continous updating, typically use this rather than traceroute
mtr google.com
mtr --report google.com # sends 10 packets to each hop

host: DNS Lookup Utility

Get IP or other servers of domain

host -t mx google.com # MX servers
host -a google.com # all servers

nslookup: Query internet name serve

nslookup example.com
nslookup -query=mx example.com
nslookup -type=ns example.com

dig: DNS Lookup Utility

Testing for DNS info associated with a domain

dig example.com # defaults to A records
dig example.com MX # mail records
dig example.com ANY # all records
dig your_domain_name.com +short # IP that domain points to only

dig @8.8.8.8 hostname.com # pick another DNS server to query (8.8.8.8 is Google's)

[Start of More Advanced?]

ab: Apache Benchmarking

ab -n 100 -c 50 http://www.example.com/ # send 100 requests with a concurency of 50 requests to an URL ab -t 30 -c 50 URL http://www.example.com/ # send requests during 30 seconds with a concurency of 50 requests to an URL

tcpdump: Dump traffic on a network

(Note: This needs to be culled)

# Basics
tcpdump -i eth0 # capture traffic of a specific interface
tcpdump -A tcp # captura all traffic
tcpdump host 2.3.4.5 # capture all traffic to or from host (src, dest below restrict to one direction)
tcpdump -i eth0 src 192.168.1.1 dest 192.168.1.2 and port 80 # capture the traffic from a specific interface, source, destination and port

# for a quick primer on TCP look here: TODO
tcpdump -n # don't resolve names, keep IP addresses
-X # displays both hex and ASCII content within the packet
-S # absolute sequence numbers
-s 96 # only takes first 96 by default, can change, 0 is all
tcpdump -nS # Basic communication
tcpdump -nnvvXS
tcpdump -nnvvXSs 1514
tcpdump src 2.3.4.5
tcpdump dst 2.3.4.5
tcpdump port 3389
tcpdump portrange 21-23
-w capturefile # write to file
-r capturefile # read from file

netstat: Show network status

Basics:
Ports 1 - 65,535

  • 1 - 1024 associated with Linux, must typically have root priveleges to assign to this range
  • 1024 - 49151 are registered ports, can be reserved by IANA
  • 49152 and 65535 are for private use

Standard ports

Port Number Service
20 FTP data
21 FTP control port
22 SSH
23 Telnet, insecure (don't use, use 22 instead)
25 SMTP
80 HTTP
110 POP3
143 IMAP
443 HTTPS
587 SMTP, message submission
netstat # print list of open sockets
sudo netstat -plunt # show port and listening socket associated with the service
netstat -a # list all ports
netstat -at # all TCP
netstat -au # all UDP

netstat -l # active listening

netstat -a # show statistics
netstat -r # display routing table information
netstat -c 1 # update at time

nmap: Host Discovery and Port Scanning

# uses SYN by default, Discovery mode of host (port 80 is used), then Scan
# need to use with sudo
nmap localhost
nmap 192.16.10.0
nmap scanme.nmap.org # test server
nmap -sn {{192.168.0.1/24}} # discover hosts in the 192.168.0.X area , without a port scan

nmap -O hostname # tells you Operating System information
nmap -PN remote_host # assume host is up
nmap -p 1000 remote_host # scan a specific port
nmap -p1-10000 # scan range of ports, default is 1663 ports
nmap -p22,23,10000-15000 192.168.10.0/24 # scan selected ports
nmap -sP abc.com # ping scan, sends ICMP echo and TCP ACK
nmap -sT remote_host # scan for TCP connection
nmap -n -PN -sT -sU -p- remote_host # scan for every TCP and UDP open port
nmap -sS remote_host # SYN scan

nmap -sF # FIN scan
nmap -sX # XMAS scan, Christmas Tree packet has all options on, used primarily in scans and DOS
nmap -sA # ACK scan
nmap -sN # NULL scan
nmap -oN # .nmap output, human readable
nmap -6 # scans ipv6

nc: reads and writes tcp or udp data

nc -l 80 # listen on port
nc 128.0.0.1 21 # connect to a certain port (then can write to it)
cat somefile.txt | nc -l 1000 # serve a file on port
nc 128.0.0.1 21 > somefile.txt # receive a file

icon: Convert from one encoding to another

iconv -f FROM_ENCODING -t TO_ENCODING input_file
iconv -l # list supported encodings
grep . *.txt # prints all matched files in directory, and prepends filename to each line
grep . * # prints all matched files in directory, often used when want to quickly look at settings files in a given directory
diff <(ls) <(ls) # compare ouput of two commands, rather than having to write each to a file first
wc < abc.txt # use this instead of cat abc.txt \| wc, saves a new process, important only for big files; don't pipe a cat
(head -5; tail -5) < data # explore first 5 and last 5 lines
head -3 data* | cat # list out first three lines of all files
time read # simple stopwatch, Ctrl-C to stop
curl -sS https://getcomposer.org/installer | php # pull down a php file and run it with the php interpreter

This section is for things related to user management, process management, filesystem, or the general system.

Users, Groups and Permissions

useradd/userdel: Add/delete user

useradd some_username
userdel -r username # delete a user with home directory
userdel johndoe group | remove user from group

chown: Change ownership (chown)

chown bob file.txt
chown bob:new_group file.txt # change group and owner
chown -R user:group path/to/directory/ # apply recursively
chown --reference=file.txt secondfile.txt # transfer owner and group from reference to secondfile
chown -h bob path/to/symlink # change owner of symlink

chmod: Change mode

read is 4, write is 2, exec is 1, use sums
user/owner (u), group (g), other/everyone else (o), all (a)
For shell scripts, you need both r and x to run them, for binary only x

chmod 755 # rwx, rx, rx
chmod 644 # rw, r, r
chmod ugo+rwx abc.out # this commands shows everything at once, can also use minus (-)
chmod +x abc.out
chmod -x abc.out
chmod g+x abc.out
chmod go-rwx file.txt
chmod -R # apply recursively to all files in the subdirectory
chmod o=g file.txt # give others the same rights as the group

sudo chmod -R 700 secret_folder # allow only root access to folder

chgrp: Change Group

chgrp webmasters file.txt

su: Become Super User

sudo su # switches you to root user, use carefully
su - johndoe -c 'ls' # run command as user
su - johndoe # switch to user

passwd: Change password

passwd # change password
passwd -d johndoe # disable password
passwd -a demo sudo # 

Other commands

Command Description
whoami Prints your username
who list users on the system
w users on system, show who is logged in and what they're doing (more info than who)
users list of users who are currently logged in
finger username info on user, including logins
last, last username list of login history for a user or all users
groups Outputs the groups to which your account belongs to.

Processes and Jobs

top: Display and update sorted information about processes

Linux and BSD flavors of top are very different use htop, not top when possible

top -U johndoe # see processes owned by johndoe
top -s 10 # 10 second delay between updates
top -n 10 # 10 iterations, then quit


# Keys
# M - sort processes by memory usage
# P - sort processes by processor usage
# k - kill current tagged process
# /substring - Search processes for substring

# O then letter from list - sort by variable
# z - show running process
# c - show absolute path
# k PID - kill pid
# r - renice
# h - help
# q - quit

htop

u - filter by user t - tree mode s - strace l - lsof F - follow a process h - help k - kill a process I - invert sort order

P - sort by processor usage M - sort by memory usage T - sort by time [Type in pid to find]

ps: Process status

ps aux | grep process # standard usage, display info about all users processes; often used in conjunction with kill
ps axjf # tree view
ps aux | grep '[h]ttpd' # bracket first letter in grep to exclude the grep result
ps auxww # list all running processes including the full command string

ps # shows just the processes started at terminal
ps -A # show all process info
ps -fA # show all process info (verbose)

pstree # see process tree
pstree -p # show pids

ps -l # long option
ps -u abc,def # users
ps -f -p 123 # find by process id
ps -f -ppid 123 # find by parent process id
ps aux --sort pmem # sort by column

kill: Kill

# Basics:
# 1 - SIGHUP - Hang up signal. Programs can listen for this signal and act (or not act) upon it.
# 2 - SIGINT - Interrupt
# 3 - SIGQUIT
# 6 - SIGABRT
# 15 - SIGTERM - Termination Signal, default signal sent by kill
# 9 - SIGKILL - Kill Signal, immediate kill by the kernel

man 7 signal # see full list of signals

kill 2592 # kill PID 2592, send TERM signal when not specified
kill -9 2592 # non-ignorable kill, SIGKILL
kill %1 # kill job number 1 from 'jobs' list
kill -SIGTERM 2931 # can use any of the signals above
pkill -9 ping # same as kill -9 `pgrep ping`
kill -l # list all signal names

killall: Killall

killall command # kills all instances of command owned by user (root user kills every process)

pkill: kill all instances of a command

pkill -f httpd # kills all instances of httpd dameon owned by user

vmstat: Report virtual memory statistics

vmstat -a # info on memory, swap etc
vmstat -S M # outputs in megabytes 
vmstat 2 6 # update every two seconds, stop after 6 iterations

nice: execute a utility with an altered scheduling priority

-19/-20 are highest priority and 19/20 are lowest priority (lowest priority take minimal resources)

nice -n 12 myproc # starts  process "myproc" setting the "nice" value to 12
renice 17 -p 1134 # change the priority of job with pid 1134 to 17

Disk

du: Disk Usage

# Basics
du /some/dir
du -sh /some/dir # disk usage of items in directory, but does not traverse (s = summarize) subdirectories
du -h --max-depth=1 # List human readable size of all sub folders from current location

du * | sort -r # display usage of each file and subdirectory in current directory starting with largest, can use with head to get the largest items at top
du -shc * # same as above, but adds a total at the end

du --max-depth=1 -b | sort -k1 -rn # largest files in directory, linux only, not Mac

# Use ncdu is faster when looking at why a disk is full

df: Disk Free

df -h # disk free by volume, h is pretty format for size (mb, kb, etc)
df -lh # local file systems only
df -h --total # add total column, non-BSD

df -m # show in megabytes
df -h # show in gigabytes

free

free -mt # latter option uses space in megabytes with total
free -s 5 # refresh at 5 second intervals

Package Management

sudo

sudo command # become a root temporarily (to execute a command), prompts for password when first typed and then won't ask for password again for a 5 min window during that terminal session
sudo !! # run previous command as sudo

Package management - apt-get, brew, and install from source

sudo apt-get upgrade #upgrade packages
apt-get -y update && apt-get upgrade && reboot #update, upgrade all packages, and reboot
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -;
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'; #add a repository
sudo apt-get install -y python-software-properties python g++ make # install all of the following packages without prompting for confirmation
sudo apt-get remove g++ # remove package
sudo apt-get update # update list of packages available
# apt-get is the main package manger for Ubuntu Linux
sudo apt-get install -y python-software-properties python g++ make # install all of the following packages without prompting for confirmation
sudo apt-get remove g++ # remove package
sudo apt-get update # update list of packages available
# Homebrew is a popular package manager for Mac, can also use port
brew install formula # install a formula, you should not have to use sudo with brew
brew remove formula
brew update formula
brew search formula
# can also install from source, this is the preferred way so you are not clobbering an existing package, and so it is easy to delete if needed
./configure --prefix=$HOME/my-sqlite-dir # pick whatever name you want
make
make install

# else, you can do this
./configure
make
sudo make install

Hierarchy (Key locations/files to know)

cat /etc/passwd # list of all users
cat /etc/group # list of all groups on system
cat /etc/shadow # list of all hashed passwords

# Other key folders
# /bin - keep basic commands, minimal needed to boot
# /dev - devices
# /root - home directory of root user
# /usr - stores all non-essential programs
# /etc - main configuration directory
# /vars - system logs and backups

man hier # get an explanation of the system directory structure

Other

alias: Create a command alias

alias m='less' # create alias m to call less command
unalias m # remove alias

export: export shell variables

export EDITOR=/usr/bin/vim # set a new EDITOR variable:
VAR=value # alternative syntax
export VAR

Add export statements to ~/.bash_profile or ~/.profile or /etc/profile file to export variables permanently

$ vi ~/.bash_profile

source: executes the content of the file passed as argument, in the current shell. It has a synonym in '.' (period)

source ~/.aliases # executes ~/.aliases script 

shutdown: Shutdown System

shutdown -r now
shutdown now
shutdown -h +10

service

service ssh start
service ssh restart
service ssh stop

dd: convert and copy a file

# Read from /dev/random 2*512 Bytes and put it into /tmp/abc.txt
dd if=/dev/random of=/tmp/abc.txt count=512 bs=2

Other commands

Command Description
uptime time system has been up
uname -a get all system information
echo $0 determine which shell (e.g., bash)
hash, hash -r table of where commands can be found based on usage, -r empties table when you may have changed the path