Unix terminal, a simple cheatsheet
Unix terminal is a powerful tool.
I think that a lot of tasks (including my own forensics analysis workflows) can be accomplished more quickly on a “terminal only” environment.
Here my brief cheatsheet with useful commands and tips.
Reload shell without exit
exec$SHELL -l
Close shell keeping all subprocess running
disown -a &&exit
Exit without saving shell history
kill -9 $$
unset HISTFILE &&exit
Perform a branching conditional
true&& { echo success;} || { echo failed; }
Pipe stdout and stderr to separate commands
some_command >>(/bin/cmd_for_stdout)2>>(/bin/cmd_for_stderr)
Redirect stdout and stderr each to separate files and print both to the screen
(some_command 2>&11>&3| tee errorlog ) 3>&11>&2| tee stdoutlog
List of commands you use most often
`$ history | awk '{print $2}' | sort | uniq -c | sort -rn | head`
Quickly rename a file
`$ mv filename.{old,new}`
Simply backup a file adding “.bak” extension
cp filename{,.bak}
Empty a file
>filename
Delete all files in a folder that don’t match a certain file extension
rm !(*.foo|*.bar|*.baz)
Add a multi-line string to a file
cat > filename <<__EOF__
data data data
__EOF__
Edit a file on a remote host using vim
vim scp://user@host//etc/fstab
Create a directory and change into it at the same time
mkd () { mkdir -p "$@"&&cd"$@"; }
Convert uppercase files to lowercase files
rename 'y/A-Z/a-z/'*
Print a row of characters across the terminal
printf"%`tput cols`s"| tr '''#'
Put a console clock in top right corner
`$ while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &`
Show shell history without line numbers
history| cut -c 8-
fc -l -n 1 | sed 's/^\s*//'
Execute a command without saving it in the history
`$ <space>command`
Run command(s) after exit session
Add this code to /etc/profile (for system wide) or ~/.bashrc for local profile:
_after_logout() { username=$(whoami) for _pid in $(ps afx | grep sshd | grep "$username" | awk '{print $1}') ; do kill -9 $_pid done}
trap _after_logout EXIT
Generate a sequence of numbers
Using *seq:*
seq 1 2 10
Without *seq:*
for((i=1; i<=10; i+=2));doecho$i;done
Run the last command
`$ !!`
Run the last command as root
`$ sudo!!`
Create a script of the last executed command
`$ echo"!!"> script.sh`
Reuse all parameter of the previous command line
`$ echo cd.
$ !*`
Run the last command with some argument
`$ echo a b c d e
$ echo!!:2
$ echo!!:3-$`
Insert the last argument of the previous command
`$ cp script.sh /usr/bin/
$ cd <ESC> .`
Run previous command but replacing
`$ echo no tobereaplaced
$ ^tobereaplaced^replaced`
Avoid any command aliases
`$ alias ls="rm -rf /"
$ \ls`