Performed a large refactoring

Performed an extensive refactoring on the entire application for the
sake of code-cleanliness.

- Refactored out of an ad-hoc Imperative paradigm into more of a
  functional/declarative paradigm. IMO, this makes the application
  signifcantly easier to understand.

- Moved away from `argparse` and into `docopt` for argument parsing

- Version bump to 2.0.0

- Performed extensive refactoring on the setup.py script. Script should
  install to the system more cleanly now.

- Made minor formatting changes to the --list flag output

- Updated the README

Squashed commit of the following:

commit e5681bd536aa0220cdeb7884cc248db55be408c9
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 23:30:21 2014 -0400

    Fixed many bugs

    Everything seems to work now, I think.

commit 764ec5950cee958eb1b8333ddfcb6bcd45c28429
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 21:51:31 2014 -0400

    Restructuring for the sake of setup.py

    Seem to finally have a working install script

commit 5a866c23857b77ec65070dd8023cd734f2b7c242
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 18:01:11 2014 -0400

    Nits

commit a79954ba5b33d992fa6a32abffb33b161d624e3d
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 17:53:03 2014 -0400

    Implemented search

commit b570a897e9a12c15affe1a72628deae31836dee2
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 17:11:27 2014 -0400

    Nits

commit 1a8d85b44457f1b2131b3e8475c5270b5d0899e3
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 17:02:22 2014 -0400

    Still refactoring across files

    Trying to make the program structure clearer

commit 34dffd6462e492e81ea558e2009a71051b7663c9
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 16:40:37 2014 -0400

    Breaking app into several files

    This is for the sake of code-cleanliness

commit 4825d678ff5f9817ccbf727ef71e5dea15ff2586
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 15:55:19 2014 -0400

    Got syntax highlighting working

commit c37d7a626d451bfca3d4a072eb9fed604085170f
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 15:29:22 2014 -0400

    Reduced verbosity of function names

commit 8e626045186b37dce2480f5af1994ddfa8db79b5
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 15:24:41 2014 -0400

    Refactored argument passing

    Fewer arguments now need to be passed throughout the app.

commit 807ba814650010b3dd1b59d27400b3fb4fcfede7
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Sat Apr 26 11:40:05 2014 -0400

    Working through the refactor

commit e34e6540d4f8cd727e98aac68289d515a02d5fe6
Author: Chris Lane <chris@chris-allen-lane.com>
Date:   Thu Apr 24 20:00:10 2014 -0400

    Got a basic end-to-end refactor working

    Have re-implemented just the most basic functionality in the "cheat2"
    file.
This commit is contained in:
Chris Lane
2014-04-26 23:31:13 -04:00
parent c03cca9298
commit f46698b656
105 changed files with 337 additions and 388 deletions

320
cheat
View File

@ -1,320 +0,0 @@
#!/usr/bin/env python
"""
cheat.py -- cheat allows you to create and view interactive cheatsheets on the
command-line. It was designed to help remind *nix system
administrators of options for commands that they use frequently,
but not frequently enough to remember.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
import os
import sys
import argparse
import subprocess
from textwrap import dedent
DEFAULT_CHEAT_DIR = (os.environ.get('DEFAULT_CHEAT_DIR') or
os.path.join(os.path.expanduser('~'), '.cheat'))
USE_PYGMENTS = False
# NOTE remove this check if it is confirmed to work on windows
if os.name == 'posix' and 'CHEATCOLORS' in os.environ:
try:
from pygments import highlight
from pygments.util import ClassNotFound
from pygments.lexers import get_lexer_for_filename, TextLexer
from pygments.formatters import TerminalFormatter
USE_PYGMENTS = True
except ImportError:
pass
def pretty_print(filename):
"""Applies syntax highlighting to a cheatsheet and writes it to stdout"""
try:
if os.path.splitext(filename)[1]:
lexer = get_lexer_for_filename(filename)
else:
# shell is a sensible default when there is no extension
lexer = get_lexer_for_filename(filename + '.sh')
except ClassNotFound:
lexer = TextLexer()
with open(filename) as istream:
code = istream.read()
fmt = TerminalFormatter()
highlight(code, lexer, fmt, sys.stdout)
class CheatSheets(object):
"""Cheatsheets database class."""
dirs = None
sheets = None
def __init__(self):
self.dirs = self.__cheat_directories()
# verify that we have at least one cheat directory
if not self.dirs:
error_msg = ('The {default} dir does not exist'
' or the CHEATPATH var is not set.')
print >> sys.stderr, error_msg.format(default=DEFAULT_CHEAT_DIR)
exit(1)
self.sheets = self.__cheat_files()
def __cheat_directories(self):
"""Assembles a list of directories containing cheatsheets."""
default_directories = [DEFAULT_CHEAT_DIR]
try:
import cheatsheets
default_directories.append(cheatsheets.cheat_dir)
except ImportError:
pass
default = [default_dir for default_dir in default_directories
if os.path.isdir(default_dir)]
if 'CHEATPATH' in os.environ and os.environ['CHEATPATH']:
return [path for path in os.environ['CHEATPATH'].split(os.pathsep)
if os.path.isdir(path)] + default
else:
return default
def __cheat_files(self):
"""
Assembles a dictionary of cheatsheets found in the above directories.
"""
cheats = {}
for cheat_dir in reversed(self.dirs):
cheats.update(dict([(cheat, cheat_dir)
for cheat in os.listdir(cheat_dir)
if not cheat.startswith('.')
and not cheat.startswith('__')]))
return cheats
def edit(self, cheat):
"""Creates or edits a cheatsheet"""
# Assert that the EDITOR environment variable is set and that at least
# 3 arguments have been given
if 'EDITOR' not in os.environ:
print >> sys.stderr, ('In order to create/edit a cheatsheet you '
'must set your EDITOR environment variable '
'to your favorite editor\'s path.')
exit(1)
elif os.environ['EDITOR'] == "":
print >> sys.stderr, ('Your EDITOR environment variable is set '
'to nothing, in order to create/edit a '
'cheatsheet your must set it to a valid '
'editor\'s path.')
exit(1)
else:
editor = os.environ['EDITOR'].split()
# if the cheatsheet already exists, open it for editing
try:
if cheat in self.sheets:
sheet_path = os.path.join(self.sheets[cheat], cheat)
if os.access(sheet_path, os.W_OK):
subprocess.call(editor + [sheet_path])
else:
print >> sys.stderr, ("Sheet '%s' [%s] is not editable."
% (cheat, sheet_path))
print ('Do you want to '
'copy it to your user cheatsheets directory [%s] '
'before editing?\nKeep in mind that your sheet '
'will always be used before system-wide one.'
% DEFAULT_CHEAT_DIR)
awn = raw_input('[y/n] ')
if awn != 'y':
print ('Ok, if you want to edit system-wide sheet, '
'please try `cheat -e <cheatsheet>` '
'again with sudo.')
exit(1)
import shutil
# attempt to copy the cheatsheet to DEFAULT_CHEAT_DIR
try:
new_sheet = os.path.join(DEFAULT_CHEAT_DIR, cheat)
shutil.copy(sheet_path, new_sheet)
subprocess.call(editor + [new_sheet])
# fail gracefully if the cheatsheet cannot be copied. This
# can happen if DEFAULT_CHEAT_DIR does not exist
except IOError:
print ('Could not copy cheatsheet for editing.')
exit(1)
# otherwise, create it
else:
import cheatsheets as cs
# Attempt to write the new cheatsheet to the user's ~/.cheat
# dir if it exists. If it does not exist, attempt to create it.
if os.access(DEFAULT_CHEAT_DIR, os.W_OK) or os.makedirs(DEFAULT_CHEAT_DIR):
subprocess.call(editor
+ [os.path.join(DEFAULT_CHEAT_DIR, cheat)])
# If the directory cannot be created, write to the python
# package directory, though that will likely require the use
# of sudo
else:
if os.access(sheet_path, os.W_OK):
subprocess.call(editor
+ [os.path.join(cs.cheat_dir, cheat)])
else:
error_msg = ("Couldn't create '%s' cheatsheet.\n"
"Please retry usig sudo." % cheat)
print >> sys.stderr, error_msg
exit(1)
except OSError as errno:
print >> sys.stderr, ("Could not launch `%s` as your editor : %s"
% (editor[0], errno.strerror))
exit(1)
def list(self):
"""Lists the cheatsheets that are currently available"""
max_command = max([len(x) for x in self.sheets.keys()]) + 3
return ('\n'.join(sorted(['%s [%s]' % (key.ljust(max_command), value)
for key, value in self.sheets.items()])))
def __parse_cheat_command_block(self, cheat):
"""Parse text blocks inside specified sheet file"""
block = ""
path = os.path.join(self.sheets[cheat], cheat)
with open(path) as cheat_fp:
for line in cheat_fp.readlines():
if line == '\n':
if block:
yield block
block = ""
else:
block += line
if block:
yield block
def search(self, term):
"""Search for a term in sheetcheats"""
for cheat in self.sheets.keys():
output = ''
for block in self.__parse_cheat_command_block(cheat):
if term in block:
if not output:
output = cheat + ":\n"
output += ''.join([" " + line + '\n' for line
in block.split('\n')])
if output:
sys.stdout.write(output);
# Custom action for argparse
class ListDirectories(argparse.Action):
"""List cheat directories and exit"""
def __call__(self, parser, namespace, values, option_string=None):
print("\n".join(sheets.dirs))
parser.exit()
class ListCheatsheets(argparse.Action):
"""List cheatsheets and exit"""
def __call__(self, parser, namespace, values, option_string=None):
print(sheets.list());
parser.exit()
class EditSheet(argparse.Action):
"""If the user wants to edit a cheatsheet"""
def __call__(self, parser, namespace, values, option_string=None):
sheets.edit(values[0])
parser.exit()
class SearchSheet(argparse.Action):
"""If the user wants to search a term inside all cheatsheets"""
def __call__(self, parser, namespace, values, option_string=None):
sheets.search(values[0])
parser.exit()
def main():
"""Main execution function"""
global sheets
sheets = CheatSheets()
desc = dedent('''
cheat allows you to create and view interactive cheatsheets on the
command-line. It was designed to help remind *nix system
administrators of options for commands that they use frequently,
but not frequently enough to remember.''').strip()
epi = dedent('''
Examples:
To look up 'tar':
cheat tar
To create or edit the cheatsheet for 'foo':
cheat -e foo
To list the directories on the CHEATPATH
cheat -d
To list the available cheatsheets:
cheat -l
''').strip()
parser = argparse.ArgumentParser(prog='cheat',
description=desc, epilog=epi,
formatter_class=argparse.
RawDescriptionHelpFormatter)
parser_group = parser.add_mutually_exclusive_group()
parser_group.add_argument('sheet', metavar='cheatsheet',
action='store', type=str, nargs='?',
help='Look at <cheatseet>')
parser_group.add_argument('-e', '--edit', metavar='cheatsheet',
action=EditSheet, type=str, nargs=1,
help='Edit <cheatsheet>')
parser_group.add_argument('-s', '--search', metavar='term',
action=SearchSheet, type=str, nargs=1,
help='Search <term> inside all cheatsheets')
parser_group.add_argument('-l', '--list',
action=ListCheatsheets, nargs=0,
help='List all available cheatsheets')
parser_group.add_argument('-d', '--cheat-directories',
action=ListDirectories, nargs=0,
help='List all current cheat dirs')
args = parser.parse_args()
sheet = args.sheet
# Print the cheatsheet if it exists
if not sheet or sheet in ['help', 'cheat']:
parser.print_help()
elif sheet in sheets.sheets:
filename = os.path.join(sheets.sheets[sheet], sheet)
if USE_PYGMENTS:
pretty_print(filename)
else:
with open(filename) as istream:
for line in istream:
sys.stdout.write(line)
# if it does not, say so
else:
print >> sys.stderr, ('No cheatsheet found for %s.' % sheet)
exit(1)
exit()
if __name__ == '__main__':
main()

3
cheat/__init__.py Normal file
View File

@ -0,0 +1,3 @@
import sheet
import sheets
import utils

View File

@ -0,0 +1,5 @@
#compdef cheat
declare -a cheats
cheats=$(cheat -l | cut -d' ' -f1)
_arguments "1:cheats:(${cheats})" && return 0

View File

@ -0,0 +1,9 @@
function _cheat_autocomplete {
sheets=$(cheat -l | cut -d' ' -f1)
COMPREPLY=()
if [ $COMP_CWORD = 1 ]; then
COMPREPLY=(`compgen -W "$sheets" -- $2`)
fi
}
complete -F _cheat_autocomplete cheat

View File

@ -0,0 +1,12 @@
#completion for cheat
complete -c cheat -s h -l help -f -x --description "Display help and exit"
complete -c cheat -l edit -f -x --description "Edit <cheatsheet>"
complete -c cheat -s e -f -x --description "Edit <cheatsheet>"
complete -c cheat -s l -l list -f -x --description "List all available cheatsheets"
complete -c cheat -s d -l cheat-directories -f -x --description "List all current cheat dirs"
complete -c cheat --authoritative -f
for cheatsheet in (cheat -l | cut -d' ' -f1)
complete -c cheat -a "$cheatsheet"
complete -c cheat -o e -a "$cheatsheet"
complete -c cheat -o '-edit' -a "$cheatsheet"
end

29
cheat/cheatsheets/7z Normal file
View File

@ -0,0 +1,29 @@
7z
A file archiver with highest compression ratio
Args:
a add
d delete
e extract
l list
t test
u update
x extract with full paths
Example:
7z a -t7z -m0-lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1
-t7z 7z archive
-m0=lzma lzma method
-mx=9 level of compression = 9 (ultra)
-mfb=64 number of fast bytes for lzma = 64
-md=32m dictionary size = 32 Mb
-ms=on solid archive = on
7z exit codes:
0 normal (no errors or warnings)
1 warning (non-fatal errors)
2 fatal error
7 bad cli arguments
8 not enough memory for operation
255 process was interrupted

View File

@ -0,0 +1,4 @@
import os
def sheets_dir():
return os.path.split(__file__)

5
cheat/cheatsheets/ab Normal file
View File

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

14
cheat/cheatsheets/apk Normal file
View File

@ -0,0 +1,14 @@
# Install a package
apk add $package
# Remove a package
apk del $package
# Update repos
apk update
# Upgrade all packages
apk upgrade
# Find a package
apk search $package

View File

@ -0,0 +1,18 @@
# Desc: Apparmor will protect the system by confining programs to a limited set of resources.
# To activate a profile:
sudo aa-enforce usr.bin.firefox
# OR
export _PROFILE_='usr.bin.firefox' sudo $(rm /etc/apparmor.d/disable/$_PROFILE_ ; cat /etc/apparmor.d/$_PROFILE_ | apparmor_parser -a )
# TO disable a profile:
sudo aa-disable usr.bin.firefox
# OR
export _PROFILE_='usr.bin.firefox' sudo $(ln -s /etc/apparmor.d/$_PROFILE_ /etc/apparmor.d/disable/ && apparmor_parser -R /etc/apparmor.d/$_PROFILE_)
# To list profiles loaded:
sudo aa-status
# OR
sudo apparmor_status
# List of profiles aviables: /etc/apparmor.d/

View File

@ -0,0 +1,12 @@
# To search for apt packages:
apt-cache search "whatever"
# To display package records for the named package(s):
apt-cache show pkg(s)
# To display reverse dependencies of a package
apt-cache rdepends package_name
# To display package versions, reverse dependencies and forward dependencies
# of a package
apt-cache showpkg package_name

25
cheat/cheatsheets/apt-get Normal file
View File

@ -0,0 +1,25 @@
# Desc: Allows to update the operating system
# To fetch package list
apt-get update
# To download and install updates without installing new package.
apt-get update
# To download and install the updates AND install new necessary packages
apt-get dist-upgrade
# Full command:
apt-get update && apt-get dist-upgrade
# To install a new package(s)
apt-get install package(s)
# Download a package without installing it. (The package will be downloaded in your current working dir)
apt-get download modsecurity-crs
# Change Cache dir and archive dir (where .deb are stored).
apt-get -o Dir::Cache="/path/to/destination/dir/" -o Dir::Cache::archives="./" install ...
# Show apt-get installed packages.
grep 'install ' /var/log/dpkg.log

View File

@ -0,0 +1,15 @@
# To search for packages:
aptitude search "whatever"
# To display package records for the named package(s):
aptitude show pkg(s)
# To install a package:
aptitude install package
# To remove a package:
aptitude remove package
# To remove unnecessary package:
aptitude autoclean

View File

@ -0,0 +1,22 @@
# To show some text in ASCII Art:
figlet Cheat
# ____ _ _
# / ___| |__ ___ __ _| |_
#| | | '_ \ / _ \/ _` | __|
#| |___| | | | __/ (_| | |_
# \____|_| |_|\___|\__,_|\__|
#
# To have some text with color and other options:
# Show with a border
toilet -F border Cheat
# Basic show (filled)
toilet Cheat
# mmm # m
# m" " # mm mmm mmm mm#mm
# # #" # #" # " # #
# # # # #"""" m"""# #
# "mmm" # # "#mm" "mm"# "mm
#

View File

@ -0,0 +1,17 @@
# To connect to a running Asterisk session:
asterisk -rvvv
# To issue a command to Asterisk from the shell:
asterisk -rx "<command>"
# To originate an echo call from a SIP trunk on an Asterisk server, to a specified number:
asterisk -rx "channel originate SIP/<trunk>/<number> application echo"
# To print out the details of SIP accounts:
asterisk -rx "sip show peers"
# To print out the passwords of SIP accounts:
asterisk -rx "sip show users"
# To print out the current active channels:
asterisk -rx "core show channels"

17
cheat/cheatsheets/at Normal file
View File

@ -0,0 +1,17 @@
# To schedule a one time task
at {time}
{command 0}
{command 1}
Ctrl-d
# {time} can be either
now | midnight | noon | teatime (4pm)
HH:MM
now + N {minutes | hours | days | weeks}
MM/DD/YY
# To list pending jobs
atq
# To remove a job (use id from atq)
atrm {id}

2
cheat/cheatsheets/awk Normal file
View File

@ -0,0 +1,2 @@
# sum integers from a file or stdin, one integer per line:
printf '1\n2\n3\n' | awk '{ sum += $1} END {print sum}'

14
cheat/cheatsheets/bash Normal file
View File

@ -0,0 +1,14 @@
# To implement a for loop:
for file in `ls .`;
do
echo $file found;
done
# To implement a case command:
case "$1"
in
0) echo "zero found";;
1) echo "one found";;
2) echo "two found";;
3*) echo "something beginning with 3 found";;
esac

36
cheat/cheatsheets/chmod Normal file
View File

@ -0,0 +1,36 @@
# Add execute for all (myscript.sh)
chmod a+x myscript.sh
# Set user to read/write/execute, group/global to read only (myscript.sh), symbolic mode
chmod u=rwx, go=r myscript.sh
# Remove write from user/group/global (myscript.sh), symbolic mode
chmod a-w myscript.sh
# Remove read/write/execute from user/group/global (myscript.sh), symbolic mode
chmod = myscript.sh
# Set user to read/write and group/global read (myscript.sh), octal notation
chmod 644 myscript.sh
# Set user to read/write/execute and group/global read/execute (myscript.sh), octal notation
chmod 755 myscript.sh
# Set user/group/global to read/write (myscript.sh), octal notation
chmod 666 myscript.sh
# Roles
u - user (owner of the file)
g - group (members of file's group)
o - global (all users who are not owner and not part of group)
a - all (all 3 roles above)
# Numeric representations
7 - full (rwx)
6 - read and write (rw-)
5 - read and execute (r-x)
4 - read only (r--)
3 - write and execute (-wx)
2 - write only (-w-)
1 - execute only (--x)
0 - none (---)

11
cheat/cheatsheets/chown Normal file
View File

@ -0,0 +1,11 @@
# Change file owner
chown user file
# Change file owner and group
chown user:group file
# Change owner recursively
chown -R user directory
# Change ownership to match another file
chown --reference=/path/to/ref_file file

19
cheat/cheatsheets/convert Normal file
View File

@ -0,0 +1,19 @@
# To resize an image to a fixed width and proportional height:
convert original-image.jpg -resize 100x converted-image.jpg
# To resize an image to a fixed height and proportional width:
convert original-image.jpg -resize x100 converted-image.jpg
# To resize an image to a fixed width and height:
convert original-image.jpg -resize 100x100 converted-image.jpg
# To resize an image and simultaneously change its file type:
convert original-image.jpg -resize 100x converted-image.png
# To resize all of the images within a directory:
# To implement a for loop:
for file in `ls original/image/path/`;
do new_path=${file%.*};
new_file=`basename $new_path`;
convert $file -resize 150 conerted/image/path/$new_file.png;
done

20
cheat/cheatsheets/crontab Normal file
View File

@ -0,0 +1,20 @@
# set a shell
SHELL=/bin/bash
# crontab format
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +- day of week (0 - 7) (where sunday is 0 and 7)
| | | +--- month (1 - 12)
| | +----- day (1 - 31)
| +------- hour (0 - 23)
+--------- minute (0 - 59)
# example entries
# every 15 min
*/15 * * * * /home/user/command.sh
# every midnight
0 * * * * /home/user/command.sh
# every Saturday at 8:05 AM
5 8 * * 6 /home/user/command.sh

35
cheat/cheatsheets/curl Normal file
View File

@ -0,0 +1,35 @@
# Download a single file
curl http://path.to.the/file
# Download a file and specify a new filename
curl http://example.com/file.zip -o new_file.zip
# Download multiple files
curl -O URLOfFirstFile -O URLOfSecondFile
# Download all sequentially numbered files (1-24)
curl http://example.com/pic[1-24].jpg
# Download a file and pass HTTP Authentication
curl -u username:password URL
# Download a file with a Proxy
curl -x proxysever.server.com:PORT http://addressiwantto.access
# Download a file from FTP
curl -u username:password -O ftp://example.com/pub/file.zip
# Get an FTP directory listing
curl ftp://username:password@example.com
# Resume a previously failed download
curl -C - -o partial_file.zip http://example.com/file.zip
# Fetch only the HTTP headers from a response
curl -I http://example.com
# Fetch your external IP and network info as JSON
curl http://ifconfig.me/all/json
# Limit the rate of a download
curl --limit-rate 1000B -O http://path.to.the/file

2
cheat/cheatsheets/cut Normal file
View File

@ -0,0 +1,2 @@
# To cut out the third field of text or stdoutput that is delimited by a #:
cut -d# -f3

2
cheat/cheatsheets/date Normal file
View File

@ -0,0 +1,2 @@
# Printout date in format suitable for affixing to file names
date +"%Y%m%d_%H%M%S"

17
cheat/cheatsheets/dd Normal file
View File

@ -0,0 +1,17 @@
# Read from {/dev/urandom} 2*512 Bytes and put it into {/tmp/test.txt}
# Note: At the first iteration, we read 512 Bytes.
# Note: At the second iteration, we read 512 Bytes.
dd if=/dev/urandom of=/tmp/test.txt count=512 bs=2
# Watch the progress of 'dd'
dd if=/dev/zero of=/dev/null bs=4KB &; export dd_pid=`pgrep '^dd'`; while [[ -d /proc/$dd_pid ]]; do kill -USR1 $dd_pid && sleep 1 && clear; done
# Watch the progress of 'dd' with `pv` and `dialog` (apt-get install pv dialog)
(pv -n /dev/zero | dd of=/dev/null bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0
# Watch the progress of 'dd' with `pv` and `zenity` (apt-get install pv zenity)
(pv -n /dev/zero | dd of=/dev/null bs=128M conv=notrunc,noerror) 2>&1 | zenity --title 'Running dd command (cloning), please wait...' --progress
# DD with "graphical" return
dcfldd if=/dev/zero of=/dev/null bs=500K

2
cheat/cheatsheets/df Normal file
View File

@ -0,0 +1,2 @@
# Printout disk free space in a human readable format
df -h

View File

@ -0,0 +1,10 @@
# To release the current IP address:
sudo dhclient -r
# To obtain a new IP address:
sudo dhclient
# Running the above in sequence is a common way of refreshing an IP.
# To obtain a new IP address for a specific interface:
sudo dhclient eth0

23
cheat/cheatsheets/diff Normal file
View File

@ -0,0 +1,23 @@
# To view the differences between two files:
diff -u version1 version2
# To view the differences between two directories:
diff -ur folder1/ folder2/
# To ignore the white spaces:
diff -ub version1 version2
# To ignore the blank lines:
diff -uB version1 version2
# To ignore the differences between uppercase and lowercase:
diff -ui version1 version2
# To report whether the files differ:
diff -q version1 version2
# To report whether the files are identical:
diff -s version1 version2
# To diff the output of two commands or scripts:
diff <(command1) <(command2)

29
cheat/cheatsheets/distcc Normal file
View File

@ -0,0 +1,29 @@
# INSTALL
# ==============================================================================
# Edit /etc/default/distcc and set theses vars
# STARTDISTCC="true"
# ALLOWEDNETS="127.0.0.1 192.168.1.0/24"# Your computer and local computers
# #LISTENER="127.0.0.1"# Comment it
# ZEROCONF="true"# Auto configuration
# REMEMBER 1:
# Start/Restart your distccd servers before using one of these commands.
# service distccd start
# REMEMBER 2:
# Do not forget to install on each machine DISTCC.
# No need to install libs ! Only main host need libs !
# USAGE
# ==============================================================================
# Run make with 4 thread (a cross network) in auto configuration.
# Note: for gcc, Replace CXX by CC and g++ by gcc
ZEROCONF='+zeroconf' make -j4 CXX='distcc g++'
# Run make with 4 thread (a cross network) in static configuration (2 ip)
# Note: for gcc, Replace CXX by CC and g++ by gcc
DISTCC_HOSTS='127.0.0.1 192.168.1.69' make -j4 CXX='distcc g++'
# Show hosts aviables
ZEROCONF='+zeroconf' distcc --show-hosts

70
cheat/cheatsheets/emacs Normal file
View File

@ -0,0 +1,70 @@
# Basic usage
Indent Select text then press TAB
Cut CTRL-w
Copy ALT-w
Paste CTRL-y
Search/Find CTRL-s
Replace ALT-% (ALT-SHIFT-5)
Save CTRL-x CTRL-s
Load/Open CTRL-x CTRL-f
Undo CTRL-x u
Highlight all text CTRL-x h
Directory listing CTRL-x d
Cancel a command ESC ESC ESC
Font size bigger CTRL-x CTRL-+
Font size smaller CTRL-x CTRL--
# Buffers
Split screen vertically CTRL-x 2
Split screen vertically with 5 row height CTRL-u 5 CTRL-x 2
Split screen horizontally CTRL-x 3
Split screen horizontally with 24 column width CTRL-u 24 CTRL-x 3
Revert to single screen CTRL-x 1
Hide the current screen CTRL-x 0
Kill the current screen CTRL-x k
Move to the next buffer CTRL-x O
Select a buffer CTRL-x b
Run command in the scratch buffer CTRL-x CTRL-e
# Other stuff
Open a shell ALT-x eshell
Goto a line number ALT-x goto-line
Word wrap ALT-x toggle-word-wrap
Spell checking ALT-x flyspell-mode
Line numbers ALT-x linum-mode
Toggle line wrap ALT-x visual-line-mode
Compile some code ALT-x compile
List packages ALT-x package-list-packages
# Sudoing within eshell
By default when using the sudo command within eshell you'll just
get "permission denied" messages. To overcome that type:
alias sudo '*sudo $*'
# Line numbers
To add line numbers and enable moving to a line with CTRL-l:
(global-set-key "\C-l" 'goto-line)
(add-hook 'find-file-hook (lambda () (linum-mode 1)))
# Org-mode
To begin org-mode ALT-x org-mode
Table column separator Vertical/pipe character
Reorganize table TAB
Section heading *
Open/collapse section TAB
Open/collapse All CTRL-TAB
Export in other file formats (eg HTML,PDF) CTRL-c CTRL-e
To make org-mode automatically wrap lines:
(add-hook 'org-mode-hook
'(lambda ()
(visual-line-mode 1)))

44
cheat/cheatsheets/find Normal file
View File

@ -0,0 +1,44 @@
# To find files by case-insensitive extension (ex: .jpg, .JPG, .jpG):
find . -iname "*.jpg"
# To find directories:
find . -type d
# To find files:
find . -type f
# To find files by octal permission:
find . -type f -perm 777
# To find files with setuid bit set:
find . -xdev \( -perm -4000 \) -type f -print0 | xargs -0 ls -l
# To find files with extension '.txt' and remove them:
find ./path/ -name '*.txt' -exec rm '{}' \;
# To find files with extension '.txt' and look for a string into them:
find ./path/ -name '*.txt' | xargs grep 'string'
# To find files with size bigger than 5 Mb and sort them by size:
find ./ -size +5M -type f -print0 | xargs -0 ls -Ssh
# To find files bigger thank 2 MB and list them:
find / -type f -size +20000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
# To find files modified more than 7 days ago and list file information
find . -type f -mtime +7d -ls
# To find symlinks owned by a user and list file information
find . -type l --user=username -ls
# To search for and delete empty directories
find . -type d -empty -exec rmdir {} \;
# To search for directories named build at a max depth of 2 directories
find . -maxdepth 2 -name build -type d
# To search all files who are not in .git directory
find . ! -iwholename '*.git*' -type f
# Find all files that have the same node (hard link) as MY_FILE_HERE
find / -type f -samefile MY_FILE_HERE 2>/dev/null

21
cheat/cheatsheets/gcc Normal file
View File

@ -0,0 +1,21 @@
# Compile a file
gcc file.c
# Compile a file with a custom output
gcc -o file file.c
# Debug symbols
gcc -g
# Debug with all symbols.
gcc -ggdb3
# Build for 64 bytes
gcc -m64
# Include the directory {/usr/include/myPersonnal/lib/} to the list of path for #include <....>
# With this option, no warning / error will be reported for the files in {/usr/include/myPersonnal/lib/}
gcc -isystem /usr/include/myPersonnal/lib/
# Build a GUI for windows (Mingw) (Will disable the term/console)
gcc -mwindows

26
cheat/cheatsheets/gdb Normal file
View File

@ -0,0 +1,26 @@
# start the debugger
gdb your-executable
# set a breakpoint
b some-method, break some-method
# run the program
r, run
# when a breakpoint was reached:
# run the current line, stepping over any invocations
n, next
# run the current line, stepping into any invocations
s, step
# print a stacktrace
bt, backtrace
# evaluate an expression and print the result
p length=strlen(string)
# list surrounding source code
l, list
# continue execution
c, continue
# exit gdb (after program terminated)
q, quit

53
cheat/cheatsheets/git Normal file
View File

@ -0,0 +1,53 @@
# To set your identify:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
# To set your editor:
git config --global core.editor emacs
# To enable color:
git config --global color.ui true
# To stage all changes for commit:
git add --all
# To commit staged changes
git commit -m "Your commit message"
# To edit previous commit message
git commit --amend
# To removed staged and working directory changes
git reset --hard
# To remove untracked files
git clean -f -d
# To remove untracked and ignored files
git clean -f -d -x
# To push to the tracked master branch:
git push origin master
# To push to a specified repository:
git push git@github.com:username/project.git
# To delete the branch "branch_name"
git branch -D branch_name
# To see who commited which line in a file
git blame filename
# To sync a fork with the master repo:
git remote add upstream git@github.com:name/repo.git # Set a new repo
git remote -v # Confirm new remote repo
git fetch upstream # Get branches
git branch -va # List local - remote branches
git checkout master # Checkout local master branch
git checkout -b new_branch # Create and checkout a new branch
git merge upstream/master # Merge remote into local repo
git show 83fb499 # Show what a commit did.
git show 83fb499:path/fo/file.ext # Shows the file as it appeared at 83fb499.
git diff branch_1 branch_2 # Check difference between branches
git log # Show all the commits
git status # Show the changes from last commit

173
cheat/cheatsheets/gpg Normal file
View File

@ -0,0 +1,173 @@
# Create a key
gpg --gen-key
# Show keys
To list a summary of all keys
gpg --list-keys
To show your public key
gpg --armor --export
To show the fingerprint for a key
gpg --fingerprint KEY_ID
# Search for keys
gpg --search-keys 'user@emailaddress.com'
# To Encrypt a File
gpg --encrypt --recipient 'user@emailaddress.com' example.txt
# To Decrypt a File
gpg --output example.txt --decrypt example.txt.gpg
# Export keys
gpg --output ~/public_key.txt --armor --export KEY_ID
gpg --output ~/private_key.txt --armor --export-secret-key KEY_ID
Where KEY_ID is the 8 character GPG key ID.
Store these files to a safe location, such as a USB drive, then
remove the private key file.
shred -zu ~/private_key.txt
# Import keys
Retrieve the key files which you previously exported.
gpg --import ~/public_key.txt
gpg --allow-secret-key-import --import ~/private_key.txt
Then delete the private key file.
shred -zu ~/private_key.txt
# Revoke a key
Create a revocation certificate.
gpg --output ~/revoke.asc --gen-revoke KEY_ID
Where KEY_ID is the 8 character GPG key ID.
After creating the certificate import it.
gpg --import ~/revoke.asc
Then ensure that key servers know about the revokation.
gpg --send-keys KEY_ID
# Signing and Verifying files
If you're uploading files to launchpad you may also want to include
a GPG signature file.
gpg -ba filename
or if you need to specify a particular key:
gpg --default-key <key ID> -ba filename
This then produces a file with a .asc extension which can be uploaded.
If you need to set the default key more permanently then edit the
file ~/.gnupg/gpg.conf and set the default-key parameter.
To verify a downloaded file using its signature file.
gpg --verify filename.asc
# Signing Public Keys
Import the public key or retrieve it from a server.
gpg --keyserver <keyserver> --recv-keys <Key_ID>
Check its fingerprint against any previously stated value.
gpg --fingerprint <Key_ID>
Sign the key.
gpg --sign-key <Key_ID>
Upload the signed key to a server.
gpg --keyserver <keyserver> --send-key <Key_ID>
# Change the email address associated with a GPG key
gpg --edit-key <key ID>
adduid
Enter the new name and email address. You can then list the addresses with:
list
If you want to delete a previous email address first select it:
uid <list number>
Then delete it with:
deluid
To finish type:
save
Publish the key to a server:
gpg --send-keys <key ID>
# Creating Subkeys
Subkeys can be useful if you don't wish to have your main GPG key
installed on multiple machines. In this way you can keep your
master key safe and have subkeys with expiry periods or which may be
separately revoked installed on various machines. This avoids
generating entirely separate keys and so breaking any web of trust
which has been established.
gpg --edit-key <key ID>
At the prompt type:
addkey
Choose RSA (sign only), 4096 bits and select an expiry period.
Entropy will be gathered.
At the prompt type:
save
You can also repeat the procedure, but selecting RSA (encrypt only).
To remove the master key, leaving only the subkey/s in place:
gpg --export-secret-subkeys <subkey ID> > subkeys
gpg --export <key ID> > pubkeys
gpg --delete-secret-key <key ID>
Import the keys back.
gpg --import pubkeys subkeys
Verify the import.
gpg -K
Should show sec# instead of just sec.

26
cheat/cheatsheets/grep Normal file
View File

@ -0,0 +1,26 @@
# Basic:
grep pattern file
# case nonsensitive research:
grep -i pattern file
# Recursively grep for string <pattern> in folder:
grep -R pattern folder
# Getting pattern from file (one by line):
grep -f pattern_file file
# Find lines NOT containing pattern
grep -v pattern file
# You can grep with regular expressions
grep "^00" file #Match lines starting with 00
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" file #Find IP add
# Find all files who contain {pattern} in the directory {directory}.
# This will show: "file:line my research"
grep -rnw 'directory' -e "pattern"
# Exclude grep from your grepped output of ps.
# Add [] to the first letter. Ex: sshd -> [s]shd
ps aux | grep '[h]ttpd'

3
cheat/cheatsheets/gs Normal file
View File

@ -0,0 +1,3 @@
# To reduce the size of a pdf file:
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=output.pdf input.pdf

8
cheat/cheatsheets/head Normal file
View File

@ -0,0 +1,8 @@
# To show the first 10 lines of file
head file
# To show the first N lines of file
head -n N file
# To show the first N bytes of file
head -c N file

View File

@ -0,0 +1,3 @@
# To see most used top 10 commands:
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10

View File

@ -0,0 +1,14 @@
# Display network settings of the first ethernet adapter
ifconfig wlan0
# Display all interfaces, even if down
ifconfig -a
# Take down / up the wireless adapter
ifconfig wlan0 {up|down}
# Set a static IP and netmask
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
# You may also need to add a gateway IP
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1

2
cheat/cheatsheets/indent Normal file
View File

@ -0,0 +1,2 @@
# format C/C++ source according to the style of Kernighan and Ritchie (K&R), no tabs, 3 spaces per indent, wrap lines at 120 characters.
indent -i3 -kr -nut -l120

View File

@ -0,0 +1,40 @@
# Show hit for rules with auto refresh
watch --interval 0 'iptables -nvL | grep -v "0 0"'
# Show hit for rule with auto refresh and highlight any changes since the last refresh
watch -d -n 2 iptables -nvL
# Block the port 902 and we hide this port from nmap.
iptables -A INPUT -i eth0 -p tcp --dport 902 -j REJECT --reject-with icmp-port-unreachable
# Note, --reject-with accept:
# icmp-net-unreachable
# icmp-host-unreachable
# icmp-port-unreachable <- Hide a port to nmap
# icmp-proto-unreachable
# icmp-net-prohibited
# icmp-host-prohibited or
# icmp-admin-prohibited
# tcp-reset
# Add a comment to a rule:
iptables ... -m comment --comment "This rule is here for this reason"
# To remove or insert a rule:
# 1) Show all rules
iptables -L INPUT --line-numbers
# OR iptables -nL --line-numbers
# Chain INPUT (policy ACCEPT)
# num target prot opt source destination
# 1 ACCEPT udp -- anywhere anywhere udp dpt:domain
# 2 ACCEPT tcp -- anywhere anywhere tcp dpt:domain
# 3 ACCEPT udp -- anywhere anywhere udp dpt:bootps
# 4 ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
# 2.a) REMOVE (-D) a rule. (here an INPUT rule)
iptables -D INPUT 2
# 2.b) OR INSERT a rule.
iptables -I INPUT {LINE_NUMBER} -i eth1 -p tcp --dport 21 -s 123.123.123.123 -j ACCEPT -m comment --comment "This rule is here for this reason"

26
cheat/cheatsheets/irssi Normal file
View File

@ -0,0 +1,26 @@
# To connect to an IRC server
/connect <server domain name>
# To join a channel
/join #<channel name>
# To set a nickname
/nick <my nickname>
# To send a private message to a user
/msg <nickname>
# To close the current channel window
/wc
# To switch between channel windows
ALT+<number>, eg. ALT+1, ALT+2
# To list the nicknames within a channel
/names
# To change the topic
/topic <description>
# To quit irssi
/exit

View File

@ -0,0 +1,8 @@
# Display wireless settings of the first wireless adapter
iwconfig wlan0
# Take down / up the wireless adapter
iwconfig wlan0 txpower {on|auto|off}
# Change the mode of the wireless adapter
iwconfig wlan0 mode {managed|ad-hoc|monitor}

View File

@ -0,0 +1,21 @@
# Actively follow log (like tail -f)
journalctl -f
# Display all errors since last boot
journalctl -b -p err
# Filter by time period
journalctl --since=2012-10-15 --until="2011-10-16 23:59:59"
# Show list of systemd units logged in journal
journalctl -F _SYSTEMD_UNIT
# Filter by specific unit
journalctl -u dbus
# Filter by executable name
journalctl /usr/bin/dbus-daemon
# Filter by PID
journalctl _PID=123

2
cheat/cheatsheets/less Normal file
View File

@ -0,0 +1,2 @@
# To disable the terminal refresh when exiting
less -X

2
cheat/cheatsheets/ln Normal file
View File

@ -0,0 +1,2 @@
# To create a symlink:
ln -s path/to/the/target/directory name-of-symlink

11
cheat/cheatsheets/ls Normal file
View File

@ -0,0 +1,11 @@
# Displays everything in the target directory
ls path/to/the/target/directory
# Displays everything including hidden files
ls -a
# Displays all files, along with the size (with unit suffixes) and timestamp
ls -lh
# Display files, sorted by size
ls -S

23
cheat/cheatsheets/lsof Normal file
View File

@ -0,0 +1,23 @@
# List all IPv4 network files
sudo lsof -i4
# List all IPv6 network files
sudo lsof -i6
# To find listening ports:
lsof -Pnl +M -i4
# To find which program is using the port 80:
lsof -i TCP:80
# List all processes accessing a particular file/directory
lsof </path/to/file>
# List all files open for a particular user
lsof -u <username>
# List all files/network connections a given process is using
lsof -c <command-name>
# See this primer: http://www.danielmiessler.com/study/lsof/
# for a number of other useful lsof tips

View File

@ -0,0 +1,41 @@
# headers
h1 header
=========
h2 header
---------
# blockquotes
> first level and paragraph
>> second level and first paragraph
>
> first level and second paragraph
# lists
## unordered - use *, +, or -
* Red
* Green
* Blue
## ordered
1. First
2. Second
3. Third
# code - use 4 spaces/1 tab
regular text
code code code
or:
Use the `printf()` function
# hr's - three or more of the following
***
---
___
# links
This is [an example](http://example.com "Title") inline link.
# emphasis
*em* _em_
**strong** __strong__

9
cheat/cheatsheets/mkdir Normal file
View File

@ -0,0 +1,9 @@
# Create a directory and all its parents
mkdir -p foo/bar/baz
# Create foo/bar and foo/baz directories
mkdir -p foo/{bar,baz}
# Create the foo/bar, foo/baz, foo/baz/zip and foo/baz/zap directories
mkdir -p foo/{bar,baz/{zip,zap}}

8
cheat/cheatsheets/mount Normal file
View File

@ -0,0 +1,8 @@
# To mount / partition as read-write in repair mode:
mount -o remount,rw /
# To mount Usb disk as user writable:
mount -o uid=username,gid=usergroup /dev/sdx /mnt/xxx
# To mount a remote NFS directory
mount -t nfs example.com:/remote/example/dir /local/example/dir

14
cheat/cheatsheets/mysql Normal file
View File

@ -0,0 +1,14 @@
# To connect to a database
mysql -h localhost -u root -p
# To backup all databases
mysqldump --all-databases --all-routines -u root -p > ~/fulldump.sql
# To restore all databases
mysql -u root -p < ~/fulldump.sql
# To create a database in utf8 charset
CREATE DATABASE owa CHARACTER SET utf8 COLLATE utf8_general_ci;
# To add a user and give rights on the given database
GRANT ALL PRIVILEGES ON database.* TO 'user'@'localhost'IDENTIFIED BY 'password' WITH GRANT OPTION;

View File

@ -0,0 +1,23 @@
# To dump a database to a file (Note that your password will appear in your command history!):
mysqldump -uusername -ppassword the-database > db.sql
# To dump a database to a file:
mysqldump -uusername -p the-database > db.sql
# To dump a database to a .tgz file (Note that your password will appear in your command history!):
mysqldump -uusername -ppassword the-database | gzip -9 > db.sql
# To dump a database to a .tgz file:
mysqldump -uusername -p the-database | gzip -9 > db.sql
# To dump all databases to a file (Note that your password will appear in your command history!):
mysqldump -uusername -ppassword --all-databases > all-databases.sql
# To dump all databases to a file:
mysqldump -uusername -p --all-databases > all-databases.sql
# To export the database structure only:
mysqldump --no-data -uusername -p the-database > dump_file
# To export the database data only:
mysqldump --no-create-info -uusername -p the-database > dump_file

30
cheat/cheatsheets/ncat Normal file
View File

@ -0,0 +1,30 @@
# Connect mode (ncat is client) | default port is 31337
ncat <host> [<port>]
# Listen mode (ncat is server) | default port is 31337
ncat -l [<host>] [<port>]
# Transfer file (closes after one transfer)
ncat -l [<host>] [<port>] < file
# Transfer file (stays open for multiple transfers)
ncat -l --keep-open [<host>] [<port>] < file
# Receive file
ncat [<host>] [<port>] > file
# Brokering | allows for multiple clients to connect
ncat -l --broker [<host>] [<port>]
# Listen with SSL | many options, use ncat --help for full list
ncat -l --ssl [<host>] [<port>]
# Access control
ncat -l --allow <ip>
ncat -l --deny <ip>
# Proxying
ncat --proxy <proxyhost>[:<proxyport>] --proxy-type {http | socks4} <host>[<port>]
# Chat server | can use brokering for multi-user chat
ncat -l --chat [<host>] [<port>]

28
cheat/cheatsheets/netstat Normal file
View File

@ -0,0 +1,28 @@
# WARNING ! netstat is deprecated. Look below.
# To view which users/processes are listening to which ports:
sudo netstat -lnptu
# To view routing table (use -n flag to disable DNS lookups):
netstat -r
# Which process is listening to port <port>
netstat -pln | grep <port> | awk '{print $NF}'
Example output: 1507/python
# Fast display of ipv4 tcp listening programs
sudo netstat -vtlnp --listening -4
# WARNING ! netstat is deprecated.
# Replace it by:
ss
# For netstat-r
ip route
# For netstat -i
ip -s link
# For netstat-g
ip maddr

57
cheat/cheatsheets/nmap Normal file
View File

@ -0,0 +1,57 @@
# Single target scan:
nmap [target]
# Scan from a list of targets:
nmap -iL [list.txt]
# iPv6:
nmap -6 [target]
# OS detection:
nmap -O --osscan_guess [target]
# Save output to text file:
nmap -oN [output.txt] [target]
# Save output to xml file:
nmap -oX [output.xml] [target]
# Scan a specific port:
nmap -source-port [port] [target]
# Do an aggressive scan:
nmap -A [target]
# Speedup your scan:
nmap -T5 --min-parallelism=50 [target]
# Traceroute:
nmap -traceroute [target]
# Ping scan only: -sP
# Don't ping: -PN
# TCP SYN ping: -PS
# TCP ACK ping: -PA
# UDP ping: -PU
# ARP ping: -PR
# Example: Ping scan all machines on a class C network
nmap -sP 192.168.0.0/24
# Use some script:
nmap --script default,safe
# Loads the script in the default category, the banner script, and all .nse files in the directory /home/user/customscripts.
nmap --script default,banner,/home/user/customscripts
# Loads all scripts whose name starts with http-, such as http-auth and http-open-proxy.
nmap --script 'http-*'
# Loads every script except for those in the intrusive category.
nmap --script "not intrusive"
# Loads those scripts that are in both the default and safe categories.
nmap --script "default and safe"
# Loads scripts in the default, safe, or intrusive categories, except for those whose names start with http-.
nmap --script "(default or safe or intrusive) and not http-*"

View File

@ -0,0 +1,4 @@
# To send a desktop notification via dbus:
notify-send -i 'icon-file/name' -a 'application_name' 'summary' 'body of message'
# The -i and -a flags can be omitted if unneeded.

11
cheat/cheatsheets/od Normal file
View File

@ -0,0 +1,11 @@
# Dump file in octal format
od /path/to/binaryfile
od -o /path/to/binaryfile
od -t o2 /path/to/binaryfile
# Dump file in hexadecimal format
od -x /path/to/binaryfile
od -t x2 /path/to/binaryfile
# Dump file in hexadecimal format, with hexadecimal offsets and a space between each byte
od -A x -t x1 /path/to/binaryfile

21
cheat/cheatsheets/openssl Normal file
View File

@ -0,0 +1,21 @@
# To create a 2048-bit private key:
openssl genrsa -out server.key 2048
# To create the Certificate Signing Request (CSR):
openssl req -new -key server.key -out server.csr
# To sign a certificate using a private key and CSR:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# (The above commands may be run in sequence to generate a self-signed SSL certificate.)
# To show certificate information for a certificate signing request
openssl req -text -noout -in server.csr
# To show certificate information for generated certificate
openssl x509 -text -noout -in server.crt
# To view certificate expiration:
echo | openssl s_client -connect <hostname>:443 2> /dev/null | \
awk '/-----BEGIN/,/END CERTIFICATE-----/' | \
openssl x509 -noout -enddate

48
cheat/cheatsheets/pacman Normal file
View File

@ -0,0 +1,48 @@
# All the following command work as well with multiple package names
# To search for a package
pacman -Ss <package name>
# To update the local package base and upgrade all out of date packages
pacman -Suy
# To install a package
pacman -S <package name>
# To uninstall a package
pacman -R <package name>
# To uninstall a package and his depedencies, removing all new orphans
pacman -Rcs <package name>
# To get informations about a package
pacman -Si <package name>
# To install a package from builded package file (.tar.xz)
pacman -U <file name/file url>
# To list the commands provided by an installed package
pacman -Ql <package name> | sed -n -e 's/.*\/bin\///p' | tail -n +2
# To list explicitly installed packages
pacman -Qe
# To list orphan packages (installed as dependencies and not required anymore)
pacman -Qdt
# You can't directly install packages from the Arch User Database (AUR) with pacman.
# You need yaourt to perform that. But considering yaourt itself is in the AUR, here is how to build a package from its tarball.
# Installing a package from AUR is a relatively simple process:
# - Retrieve the archive corresponding to your package from AUR website
# - Extract the archive (preferably in a folder for this purpose)
# - Run makepkg in the extracted directory. (makepkg-s allows you to install any dependencies automatically from deposits.)
# - Install the package created using pacman
# Assuming $pkgname contains the package name.
wget "https://aur.archlinux.org/packages/${pkgname::2}/$pkgname/$pkgname.tar.gz"
tar zxvf "$pkgname.tar.gz"
cd "$pkgname"
# Build the package
makepkg -s
# Install
sudo pacman -U <package file (.pkg.tar.xz)>

9
cheat/cheatsheets/pdftk Normal file
View File

@ -0,0 +1,9 @@
# Concatenate all pdf files into one:
pdftk *.pdf cat output all.pdf
# Concatenate specific pdf files into one:
pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf
# Concatenate pages 1 to 5 of first.pdf with page 3 of second.pdf
pdftk A=fist.pdf B=second.pdf cat A1-5 B3 output new.pdf

23
cheat/cheatsheets/php Normal file
View File

@ -0,0 +1,23 @@
# To view the php version:
php -v
# To view the installed php modules:
php -m
# To view phpinfo() information:
php -i
# To lint a php file:
php -l file.php
# To lint all php files within the cwd:
find . -name "*.php" -print0 | xargs -0 -n1 -P8 php -l
# To enter an interactive shell:
php -a
# To locate the system's php.ini files:
php -i | grep "php.ini"
# To start a local webserver for the cwd on port 3000 (requires php >= 5.4):
php -S localhost:3000

15
cheat/cheatsheets/ps Normal file
View File

@ -0,0 +1,15 @@
# To list every process on the system:
ps aux
# To list a process tree
ps axjf
# To list every process owned by foouser:
ps -aufoouser
# To list every process with a user-defined format:
ps -eo pid,user,command
# Exclude grep from your grepped output of ps.
# Add [] to the first letter. Ex: sshd -> [s]shd
ps aux | grep '[h]ttpd'

16
cheat/cheatsheets/python Normal file
View File

@ -0,0 +1,16 @@
# Desc: Python is a high-level programming language.
# Basic example of server with python
# Will start a Web Server in the current directory on port 8000
# go to http://127.0.0.1:8000
# Python v2.7
python -m SimpleHTTPServer
# Python 3
python -m http.server 8000
# SMTP-Server for debugging, messages will be discarded, and printed on stdout.
python -m smtpd -n -c DebuggingServer localhost:1025
# Pretty print a json
python -mjson.tool

5
cheat/cheatsheets/rm Normal file
View File

@ -0,0 +1,5 @@
# Remove files and subdirs
rm -rf path/to/the/target/
# Ignore non existent files
rm -f path/to/the/target

6
cheat/cheatsheets/rsync Normal file
View File

@ -0,0 +1,6 @@
# copy files from remote to local, maintaining file propertires and sym-links (-a), zipping for faster transfer (-z), verbose (-v).
rsync -avz host:file1 :file1 /dest/
rsync -avz /source host:/dest
# Copy files using checksum (-c), rather than time, to detect if the file has changed. (Useful for validating backups).
rsync -avc /source/ /dest/

2
cheat/cheatsheets/sam2p Normal file
View File

@ -0,0 +1,2 @@
# Concatenate all pdf files into one:
sam2p *.pdf out.pdf

5
cheat/cheatsheets/scp Normal file
View File

@ -0,0 +1,5 @@
# To copy a file from your local machine to a remote server:
scp foo.txt user@example.com:remote/dir
# To copy a file from a remote server to your local machine:
scp user@example.com:remote/dir/foo.txt local/dir

11
cheat/cheatsheets/screen Normal file
View File

@ -0,0 +1,11 @@
# Start a new named screen session:
screen -S session_name
# Detach from the current session:
Press Ctrl+A then press d
# Re-attach a detached session:
screen -r session_name
# List all screen sessions:
screen -ls

14
cheat/cheatsheets/sed Normal file
View File

@ -0,0 +1,14 @@
# To replace all occurrences of "day" with "night" and write to stdout:
sed 's/day/night/g' file.txt
# To replace all occurrences of "day" with "night" within file.txt:
sed -i 's/day/night/g' file.txt
# To replace all occurrences of "day" with "night" on stdin:
echo 'It is daytime' | sed 's/day/night/g'
# To remove leading spaces
sed -i -r 's/^\s+//g' file.txt
# Remove empty lines and print results to stdout:
sed '/^$/d' file.txt

13
cheat/cheatsheets/shred Normal file
View File

@ -0,0 +1,13 @@
# To shred a file (5 passes) and verbose output:
shred -n 5 -v file.txt
# To shred a file (5 passes) and a final overwrite of zeroes:
shred -n 5 -vz file.txt
# To do the above, and then truncate and rm the file:
shred -n 5 -vzu file.txt
# To shred a partition:
shred -n 5 -vz /dev/sda
# Remember that shred may not behave as expected on journaled file systems if file data is being journaled.

View File

@ -0,0 +1,2 @@
# To view which users/processes are listening to which ports:
sudo sockstat -l

11
cheat/cheatsheets/sort Normal file
View File

@ -0,0 +1,11 @@
# To sort a file:
sort file
# To sort a file by keeping only unique:
sort -u file
# To sort a file and reverse the result:
sort -r file
# To sort a file randomly:
sort -R file

8
cheat/cheatsheets/split Normal file
View File

@ -0,0 +1,8 @@
# To split a large text file into smaller files of 1000 lines each:
split file.txt -l 1000
# To split a large binary file into smaller files of 10M each:
split file.txt -b 10M
# To consolidate split files into a single file:
cat x* > file.txt

45
cheat/cheatsheets/sqlmap Normal file
View File

@ -0,0 +1,45 @@
# Test URL and POST data and return database banner (if possible)
./sqlmap.py --url="<url>" --data="<post-data>" --banner
# Parse request data and test | request data can be obtained with burp
./sqlmap.py -r <request-file> <options>
# Fingerprint | much more information than banner
./sqlmap.py -r <request-file> --fingerprint
# Get database username, name, and hostname
./sqlmap.py -r <request-file> --current-user --current-db --hostname
# Check if user is a database admin
./sqlmap.py -r <request-file> --is-dba
# Get database users and password hashes
./sqlmap.py -r <request-file> --users --passwords
# Enumerate databases
./sqlmap.py -r <request-file> --dbs
# List tables for one database
./sqlmap.py -r <request-file> -D <db-name> --tables
# Other database commands
./sqlmap.py -r <request-file> -D <db-name> --columns
--schema
--count
# Enumeration flags
./sqlmap.py -r <request-file> -D <db-name>
-T <tbl-name>
-C <col-name>
-U <user-name>
# Extract data
./sqlmap.py -r <request-file> -D <db-name> -T <tbl-name> -C <col-name> --dump
# Execute SQL Query
./sqlmap.py -r <request-file> --sql-query="<sql-query>"
# Append/Prepend SQL Queries
./sqlmap.py -r <request-file> --prefix="<sql-query>" --suffix="<sql-query>"
# Get backdoor access to sql server | can give shell access
./sqlmap.py -r <request-file> --os-shell

23
cheat/cheatsheets/ssh Normal file
View File

@ -0,0 +1,23 @@
# To ssh via pem file (which normally needs 0600 permissions):
ssh -i /path/to/file.pem user@example.com
# To connect on an non-standard port:
ssh -p 2222 user@example.com
# To execute a command on a remote server:
ssh -t user@example.com 'the-remote-command'
# To tunnel an x session over SSH:
ssh -X user@example.com
# To launch a specific x application over SSH:
ssh -X -t user@example.com 'chromium-browser'
# To create a SOCKS proxy on localhost and port 9999
ssh -D 9999 user@example.com
# -X use an xsession, -C compress data, "-c blowfish" use the encryption blowfish
ssh user@example.com -C -c blowfish -X
# For more information, see:
# http://unix.stackexchange.com/q/12755/44856

View File

@ -0,0 +1,8 @@
# To copy a key to a remote host:
ssh-copy-id username@host
# To copy a key to a remote host on a non-standard port:
ssh-copy-id username@host -p 2222
# To copy a key to a remote host on a non-standard port with non-standard ssh key:
ssh-copy-id ~/.ssh/otherkey "username@host -p 2222"

View File

@ -0,0 +1,14 @@
# To generate an SSH key:
ssh-keygen -t rsa
# To generate a 4096-bit SSH key:
ssh-keygen -t rsa -b 4096
# To update a passphrase on a key
ssh-keygen -p -P old_passphrase -N new_passphrase -f /path/to/keyfile
# To remove a passphrase on a key
ssh-keygen -p -P old_passphrase -N '' -f /path/to/keyfile
# To generate a 4096 bit RSA key with a passphase and comment containing the user and hostname
ssh-keygen -t rsa -b 4096 -C "$USER@$HOSTNAME" -P passphrase

5
cheat/cheatsheets/stdout Normal file
View File

@ -0,0 +1,5 @@
# To redirect stderr to stdout:
some-command 2>&1
# To redirect stderr to a file
some-command 2> errors.txt

24
cheat/cheatsheets/strace Normal file
View File

@ -0,0 +1,24 @@
# Basic stracing
strace <command>
# save the trace to a file
strace -o strace.out <other switches> <command>
# follow only the open() system call
strace -e trace=open <command>
# follow all the system calls which open a file
strace -e trace=file <command>
# follow all the system calls associated with process
# management
strace -e trace=process <command>
# follow child processes as they are created
strace -f <command>
# count time, calls and errors for each system call
strace -c <command>
# trace a running process (multiple PIDs can be specified)
strace -p <pid>

View File

@ -0,0 +1,36 @@
# List all loaded/active units
systemctl list-units
# Check the status of a service
systemctl status foo.service
# Start a service
systemctl start foo.service
# Restart a service
systemctl restart foo.service
# Stop a service
systemctl stop foo.service
# Reload a service's configuration
systemctl reload foo.service
# Enable a service to startup on boot
systemctl enable foo.service
# Disable a service to startup on boot
systemctl disable foo.service
# List the dependencies of a service
# when no service name is specified, lists the dependencies of default.target
systemctl list-dependencies foo.service
# List currently loaded targets
systemctl list-units --type=target
# Change current target
systemctl isolate foo.target
# Change default target
systemctl enable foo.target

14
cheat/cheatsheets/tail Normal file
View File

@ -0,0 +1,14 @@
# To show the last 10 lines of file
tail file
# To show the last N lines of file
tail -n N file
# To show the last lines of file starting with the Nth
tail -n +N file
# To show the last N bytes of file
tail -c N file
# To show the last 10 lines of file and to wait for file to grow
tail -f file

26
cheat/cheatsheets/tar Normal file
View File

@ -0,0 +1,26 @@
# To extract an uncompressed archive:
tar -xvf /path/to/foo.tar
# To create an uncompressed archive:
tar -cvf /path/to/foo.tar /path/to/foo/
# To extract a .gz archive:
tar -xzvf /path/to/foo.tgz
# To create a .gz archive:
tar -czvf /path/to/foo.tgz /path/to/foo/
# To list the content of an .gz archive:
tar -ztvf /path/to/foo.tgz
# To extract a .bz2 archive:
tar -xjvf /path/to/foo.tgz
# To create a .bz2 archive:
tar -cjvf /path/to/foo.tgz /path/to/foo/
# To list the content of an .bz2 archive:
tar -jtvf /path/to/foo.tgz
# To create a .gz archive and exclude all jpg,gif,... from the tgz
tar czvf /path/to/foo.tgz --exclude=\*.{jpg,gif,png,wmv,flv,tar.gz,zip} /path/to/foo/

63
cheat/cheatsheets/tcpdump Normal file
View File

@ -0,0 +1,63 @@
# TCPDump is a packet analyzer. It allows the user to intercept and display TCP/IP
# and other packets being transmitted or received over a network. (cf Wikipedia).
# Note: 173.194.40.120 => google.com
# Intercepts all packets on eth0
tcpdump -i eth0
# Intercepts all packets from/to 173.194.40.120
tcpdump host 173.194.40.120
# Intercepts all packets on all interfaces from / to 173.194.40.120 port 80
# -nn => Disables name resolution for IP addresses and port numbers.
tcpdump -nn -i any host 173.194.40.120 and port 80
# Make a grep on tcpdump (ASCII)
# -A => Show only ASCII in packets.
# -s0 => By default, tcpdump only captures 68 bytes.
tcpdump -i -A any host 173.194.40.120 and port 80 | grep 'User-Agent'
# With ngrep
# -d eth0 => To force eth0 (else ngrep work on all interfaces)
# -s0 => force ngrep to look at the entire packet. (Default snaplen: 65536 bytes)
ngrep 'User-Agent' host 173.194.40.120 and port 80
# Intercepts all packets on all interfaces from / to 8.8.8.8 or 173.194.40.127 on port 80
tcpdump 'host ( 8.8.8.8 or 173.194.40.127 ) and port 80' -i any
# Intercepts all packets SYN and FIN of each TCP session.
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
# To display SYN and FIN packets of each TCP session to a host that is not on our network
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net local_addr'
# To display all IPv4 HTTP packets that come or arrive on port 80 and that contain only data (no SYN, FIN no, no packet containing an ACK)
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# Saving captured data
tcpdump -w file.cap
# Reading from capture file
tcpdump -r file.cap
# Show content in hexa
# Change -x to -xx => show extra header (ethernet).
tcpdump -x
# Show content in hexa and ASCII
# Change -X to -XX => show extra header (ethernet).
tcpdump -X
# Note on packet maching:
# Port matching:
# - portrange 22-23
# - not port 22
# - port ssh
# - dst port 22
# - src port 22
#
# Host matching:
# - dst host 8.8.8.8
# - not dst host 8.8.8.8
# - src net 67.207.148.0 mask 255.255.255.0
# - src net 67.207.148.0/24

47
cheat/cheatsheets/tmux Normal file
View File

@ -0,0 +1,47 @@
# Start tmux:
tmux
# Detach from tmux:
Ctrl-b d
# Restore tmux session:
tmux attach
# Detach an already attached session (great if you are moving devices with different screen resolutions)
tmux attach -d
# Display session:
tmux ls
# Start a shared session:
tmux -S /tmp/your_shared_session
chmod 777 /tmp/your_shared_session
# Help screen (Q to quit):
Ctrl-b ?
# Scroll in window:
Ctrl-b PageUp/PageDown
# Reload configuation file
Ctrl-b : source-file /path/to/file
# Window management
# =================
# Create window:
Ctrl-b c
# Destroy window:
Ctrl-b x
# Switch between windows:
Ctrl-b [0-9]
or
Ctrl-b Arrows
# Split windows horizontally:
Ctrl-b %
# Split windows vertically:
Ctrl-b "

26
cheat/cheatsheets/top Normal file
View File

@ -0,0 +1,26 @@
# Update every <interval> samples:
top -i <interval>
# Set the delay between updates to <delay> seconds:
top -s <delay>
# Set event counting to accumulative mode:
top -a
# Set event counting to delta mode:
top -d
# Set event counting to absolute mode:
top -e
# Do not calculate statistics on shared libraries, also known as frameworks:
top -F
# Calculate statistics on shared libraries, also known as frameworks (default):
top -f
# Print command line usage information and exit:
top -h
# Order the display by sorting on <key> in descending order
top -o <key>

View File

@ -0,0 +1,10 @@
# To clear the contents from a file:
truncate -s 0 file.txt
# To truncate a file to 100 bytes:
truncate -s 100 file.txt
# To truncate a file to 100 KB:
truncate -s 100K file.txt
# (M, G, T, P, E, Z, and Y may be used in place of "K" as required.)

27
cheat/cheatsheets/uname Normal file
View File

@ -0,0 +1,27 @@
# Print all system information
uname -a
# Linux system-hostname 3.2.0-4-amd64 #1 SMP Debian 3.2.32-1 x86_64 GNU/Linux
# Print the hostname
uname -n
# system-hostname
# Print the kernel release
uname -r
# 3.2.0-4-amd64
# Print the kernel version, with more specific information
uname -v
# #1 SMP Debian 3.2.32-1
# Print the hardware instruction set
uname -m
# x86_64
# Print the kernel name
uname -s
# Linux
# Print the operating system
uname -o
# GNU/Linux

58
cheat/cheatsheets/vim Normal file
View File

@ -0,0 +1,58 @@
# File management
:e reload file
:q quit
:q! quit without saving changes
:w write file
:w {file} write new file
:x write file and exit
# Movement
k
h l basic motion
j
w next start of word
W next start of whitespace-delimited word
e next end of word
E next end of whitespace-delimited word
b previous start of word
B previous start of whitespace-delimited word
0 start of line
$ end of line
gg go to first line in file
G go to end of file
# Insertion
# To exit from insert mode use Esc or Ctrl-C
# Enter insertion mode and:
a append after the cursor
A append at the end of the line
i insert before the cursor
I insert at the beginning of the line
o create a new line under the cursor
O create a new line above the cursor
R enter insert mode but replace instead of inserting chars
:r {file} insert from file
# Editing
u undo
yy yank (copy) a line
y{motion} yank text that {motion} moves over
p paste after cursor
P paste before cursor
<Del> or x delete a character
dd delete a line
d{motion} delete text that {motion} moves over
# Preceding a motion or edition with a number repeats it n times
# Examples:
50k moves 50 lines up
2dw deletes 2 words
5yy copies 5 lines
42G go to line 42

32
cheat/cheatsheets/wget Normal file
View File

@ -0,0 +1,32 @@
# To download a single file
wget http://path.to.the/file
# To download a file and change its name
wget http://path.to.the/file -o newname
# To download a file into a directory
wget -P path/to/directory http://path.to.the/file
# To continue an aborted downloaded
wget -c http://path.to.the/file
# To download multiples files with multiple URLs
wget URL1 URL2
# To parse a file that contains a list of URLs to fetch each one
wget -i url_list.txt
# To mirror a whole page locally
wget -pk http://path.to.the/page.html
# To mirror a whole site locally
wget -mk http://site.tl/
# To download files according to a pattern
wget http://www.myserver.com/files-{1..15}.tar.bz2
# To download all the files in a directory with a specific extension if directory indexing is enabled
wget -r -l1 -A.extension http://myserver.com/directory
# Allows you to download just the headers of responses (-S --spider) and display them on Stdout (-O -).
wget -S --spider -O - http://google.com

12
cheat/cheatsheets/xargs Normal file
View File

@ -0,0 +1,12 @@
# find all file name ending with .pdf and remove them
find -name *.pdf | xargs rm -rf
# if file name contains spaces you should use this instead
find -name *.pdf | xargs -I{} rm -rf '{}'
# Will show every .pdf like:
# &toto.pdf=
# &titi.pdf=
# -n1 => One file by one file. ( -n2 => 2 files by 2 files )
find -name *.pdf | xargs -I{} -n1 echo '&{}='

23
cheat/cheatsheets/yaourt Normal file
View File

@ -0,0 +1,23 @@
# All pacman commands are working the same way with yaourt.
# Just check the pacman cheatsheet.
# For instance, to install a package :
pacman -S <package name>
yaourt -S <package name>
# The difference is that yaourt will also query the Arch User Repository,
# and if appropriate, donwload the source and build the package requested.
# Here are the commands yaourt provides while pacman doesn't :
# To search for a package and install it
yaourt <package name>
# To update the local package base and upgrade all out of date package, including the ones from
AUR and the packages based on development repos (git, svn, hg...)
yaourt -Suya --devel
# For all of the above commands, if you want yaourt to stop asking constantly for confirmations,
use the option --noconfirm
# To build a package from source
yaourt -Sb <package name>

View File

@ -0,0 +1,20 @@
# To download a video in 720p MP4:
youtube-dl -f 22 example.com/watch?v=id
# To download a video in 720p MP4 or WebM or FLV:
youtube-dl -f 22/45/120
# To list all available formats of a video:
youtube-dl -F example.com/watch?v=id
# To download a video to /$uploader/$date/$title.$ext:
youtube-dl -o '%(uploader)s/%(date)s/%(title)s.%(ext)s' example.com/watch?v=id
# To download a video playlist starting from a certain video:
youtube-dl --playlist-start 5 example.com/watch?v=id&list=listid
# To simulate a download with youtube-dl:
youtube-dl -s example.com/watch?v=id
# For all video formats see
# http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs

28
cheat/cheatsheets/yum Normal file
View File

@ -0,0 +1,28 @@
# To install the latest version of a package:
yum install <package name>
# To perform a local install:
yum localinstall <package name>
# To remove a package:
yum remove <package name>
# To search for a package:
yum search <package name>
# To find what package installs a program:
yum whatprovides </path/to/program>
# To find the dependencies of a package:
yum deplist <package name>
# To find information about a package:
yum info <package name>
# List currently enabled repositories:
yum repolist
# To download the source RPM for a package:
yumdownloader --source <package name>
# (You have to install yumdownloader first, which is installed by the yum-utils package)

94
cheat/sheet.py Normal file
View File

@ -0,0 +1,94 @@
from cheat import sheets
from cheat import utils
from cheat.utils import *
import os
import shutil
import subprocess
def copy(current_sheet_path, new_sheet_path):
""" Copies a sheet to a new path """
# attempt to copy the sheet to DEFAULT_CHEAT_DIR
try:
shutil.copy(current_sheet_path, new_sheet_path)
# fail gracefully if the cheatsheet cannot be copied. This can happen if
# DEFAULT_CHEAT_DIR does not exist
except IOError:
die ('Could not copy cheatsheet for editing.')
def create_or_edit(sheet):
""" Creates or edits a cheatsheet """
# if the cheatsheet does not exist
if not exists(sheet):
create(sheet)
# if the cheatsheet exists and is writeable...
elif exists(sheet) and is_writable(sheet):
edit(sheet)
# if the cheatsheet exists but is not writable...
elif exists(sheet) and not is_writable(sheet):
# ... ask the user if we should copy the cheatsheet to her home directory for editing
yes = prompt_yes_or_no(
'The ' + sheet + ' sheet is not editable. Do you want to copy it to '
'your user cheatsheets directory before editing? Keep in mind that '
'your sheet will always be used before system-wide one.'
)
# if yes, copy the cheatsheet to the home directory before editing
if yes:
copy(path(sheet), os.path.join(sheets.default_path(), sheet))
edit(sheet)
# if no, just abort
else:
die('Aborting.')
def create(sheet):
""" Creates a cheatsheet """
new_sheet_path = os.path.join(sheets.default_path(), sheet)
try:
subprocess.call([editor(), new_sheet_path])
except OSError:
die('Could not launch ' + editor())
def edit(sheet):
""" Opens a cheatsheet for editing """
try:
subprocess.call([editor(), path(sheet)])
except OSError:
die('Could not launch ' + editor())
def exists(sheet):
""" Predicate that returns true if the sheet exists """
return sheet in sheets.get() and os.access(path(sheet), os.R_OK)
def is_writable(sheet):
""" Predicate that returns true if the sheet is writeable """
return sheet in sheets.get() and os.access(path(sheet), os.W_OK)
def path(sheet):
""" Returns a sheet's filesystem path """
return sheets.get()[sheet]
def read(sheet):
""" Returns the contents of the cheatsheet as a String """
if not exists(sheet):
die('No cheatsheet found for ' + sheet)
with open (path(sheet)) as cheatfile:
return cheatfile.read()

76
cheat/sheets.py Normal file
View File

@ -0,0 +1,76 @@
from cheat import cheatsheets
from cheat.utils import *
import os
def default_path():
""" Returns the default cheatsheet path """
# the default path becomes confused when cheat is run as root, so fail
# under those circumstances. (There is no good reason to need to run cheat
# as root.)
if os.geteuid() == 0:
die('Please do not run this application as root.');
return os.environ.get('DEFAULT_CHEAT_DIR') or os.path.join(os.path.expanduser('~'), '.cheat')
# @todo: memoize result
def get():
""" Assembles a dictionary of cheatsheets as name => file-path """
cheats = {}
for cheat_dir in reversed(paths()):
cheats.update(
dict([
(cheat, os.path.join(cheat_dir, cheat))
for cheat in os.listdir(cheat_dir)
if not cheat.startswith('.')
and not cheat.startswith('__')
])
)
return cheats
def paths():
""" Assembles a list of directories containing cheatsheets """
sheet_paths = [
default_path(),
cheatsheets.sheets_dir()[0],
]
# merge the CHEATPATH paths into the sheet_paths
if 'CHEATPATH' in os.environ and os.environ['CHEATPATH']:
for path in os.environ['CHEATPATH'].split(os.pathsep):
if os.path.isdir(path):
sheet_paths.append(path)
if not sheet_paths:
die('The DEFAULT_CHEAT_DIR dir does not exist or the CHEATPATH is not set.')
return sheet_paths
def list():
""" Lists the available cheatsheets """
sheet_list = ''
pad_length = max([len(x) for x in get().keys()]) + 4
for sheet in sorted(get().items()):
sheet_list += sheet[0].ljust(pad_length) + sheet[1] + "\n"
return sheet_list
def search(term):
""" Searches all cheatsheets for the specified term """
result = ''
for cheatsheet in sorted(get().items()):
match = ''
for line in open(cheatsheet[1]):
if term in line:
match += ' ' + line
if not match == '':
result += cheatsheet[0] + ":\n" + match + "\n"
return result

0
cheat/test/__init__.py Normal file
View File

56
cheat/utils.py Normal file
View File

@ -0,0 +1,56 @@
import os
import sys
def colorize(sheet_content):
""" Colorizes cheatsheet content if so configured """
# only colorize if so configured
if not 'CHEATCOLORS' in os.environ:
return sheet_content
try:
from pygments import highlight
from pygments.lexers import BashLexer
from pygments.formatters import TerminalFormatter
# if pygments can't load, just return the uncolorized text
except ImportError:
return sheet_content
return highlight(sheet_content, BashLexer(), TerminalFormatter())
def die(message):
""" Prints a message to stderr and then terminates """
warn (message)
exit(1)
def editor():
""" Determines the user's preferred editor """
if 'EDITOR' not in os.environ:
die(
'In order to create/edit a cheatsheet you must set your EDITOR '
'environment variable to your editor\'s path.'
)
elif os.environ['EDITOR'] == "":
die(
'Your EDITOR environment variable is set to an empty string. It must '
'be set to your editor\'s path.'
)
else:
return os.environ['EDITOR']
def prompt_yes_or_no(question):
""" Prompts the user with a yes-or-no question """
print(question)
return raw_input('[y/n] ') == 'y'
def warn(message):
""" Prints a message to stderr """
print >> sys.stderr, (message)