diff --git a/.gitignore b/.gitignore index 27ffc2f..52c5521 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ *.pyc +MANIFEST build +cheat.egg-info +dist diff --git a/README.md b/README.md index de8f961..04ffb5c 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ remember. `cheat` depends only on `python` and `pip`. +PyPI status: + +[![Latest Version](https://pypip.in/version/cheat/badge.png)](https://pypi.python.org/pypi/cheat/) +[![Downloads](https://pypip.in/download/cheat/badge.png)](https://pypi.python.org/pypi/cheat/) Example ------- @@ -45,6 +49,17 @@ to store notes on your favorite cookie recipes, feel free. Installing ---------- + +### Using pip ### + + sudo pip install cheat + +### Using homebrew ### + + brew install cheat + +### Manually ### + First install the required python dependencies with: sudo pip install docopt pygments @@ -126,6 +141,8 @@ Related Projects - [`cheat` RubyGem][3]: A clever gem from 2006 that clearly had similar motivations. It is unclear whether or not it is currently maintained. +- [`tldr`][tldr]: "Simplified and community-driven man pages". + [dotfiles]: http://dotfiles.github.io/ [jahendrie]: https://github.com/jahendrie @@ -133,3 +150,4 @@ Related Projects [2]: https://github.com/jahendrie/cheat [3]: http://errtheblog.com/posts/21-cheat [4]: https://github.com/chrisallenlane/cheat/pull/77 +[tldr]: https://github.com/tldr-pages/tldr diff --git a/bin/cheat b/bin/cheat index a995dac..88bd3c5 100755 --- a/bin/cheat +++ b/bin/cheat @@ -38,7 +38,7 @@ from docopt import docopt if __name__ == '__main__': # parse the command-line options - options = docopt(__doc__, version='cheat 2.0.7') + options = docopt(__doc__, version='cheat 2.1.19') # list directories if options['--directories']: diff --git a/cheat/cheatsheets/apt b/cheat/cheatsheets/apt new file mode 100644 index 0000000..07ae3f4 --- /dev/null +++ b/cheat/cheatsheets/apt @@ -0,0 +1,23 @@ +# To search a package: +apt search package + +# To show package informations: +apt show package + +# To fetch package list: +apt update + +# To download and install updates without installing new package: +apt upgrade + +# To download and install the updates AND install new necessary packages: +apt dist-upgrade + +# Full command: +apt update && apt dist-upgrade + +# To install a new package(s): +apt install package(s) + +# To uninstall package(s) +apt remove package(s) diff --git a/cheat/cheatsheets/apt-get b/cheat/cheatsheets/apt-get index c7bc7f3..b0347ce 100644 --- a/cheat/cheatsheets/apt-get +++ b/cheat/cheatsheets/apt-get @@ -4,7 +4,7 @@ apt-get update # To download and install updates without installing new package. -apt-get update +apt-get upgrade # To download and install the updates AND install new necessary packages apt-get dist-upgrade @@ -23,3 +23,6 @@ apt-get -o Dir::Cache="/path/to/destination/dir/" -o Dir::Cache::archives="./" i # Show apt-get installed packages. grep 'install ' /var/log/dpkg.log + +# Silently keep old configuration during batch updates +apt-get update -o DPkg::Options::='--force-confold' ... diff --git a/cheat/cheatsheets/awk b/cheat/cheatsheets/awk index bf554bc..14d07de 100644 --- a/cheat/cheatsheets/awk +++ b/cheat/cheatsheets/awk @@ -1,2 +1,11 @@ # sum integers from a file or stdin, one integer per line: printf '1\n2\n3\n' | awk '{ sum += $1} END {print sum}' + +# using specific character as separator to sum integers from a file or stdin +printf '1:2:3' | awk -F ":" '{print $1+$2+$3}' + +# print a multiplication table +seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' + +# Specify output separator character +printf '1 2 3' | awk 'BEGIN {OFS=":"}; {print $1,$2,$3}' diff --git a/cheat/cheatsheets/bash b/cheat/cheatsheets/bash index 3b601d3..571b3ca 100644 --- a/cheat/cheatsheets/bash +++ b/cheat/cheatsheets/bash @@ -1,5 +1,5 @@ # To implement a for loop: -for file in `ls .`; +for file in *; do echo $file found; done @@ -12,3 +12,16 @@ in 2) echo "two found";; 3*) echo "something beginning with 3 found";; esac + +# Turn on debugging: +set -x + +# Turn off debugging: +set +x + +# Retrieve N-th piped command exit status +printf 'foo' | fgrep 'foo' | sed 's/foo/bar/' +echo ${PIPESTATUS[0]} # replace 0 with N + +# Lock file: +( set -o noclobber; echo > my.lock ) || echo 'Failed to create lock file' diff --git a/cheat/cheatsheets/bower b/cheat/cheatsheets/bower new file mode 100644 index 0000000..da29ebd --- /dev/null +++ b/cheat/cheatsheets/bower @@ -0,0 +1,26 @@ +# Install a package locally +bower install + +# Install a package locally directly from github +bower install / + +# Install a specific package locally +bower install # + +# Install a package locally and save installed package into bower.json +bower install --save + +# Retrieve info of a particular package +bower info + +# List local packages +bower list + +# Search for a package by name +bower search + +# Update a package to their newest version +bower update + +# Remove a local package +bower uninstall diff --git a/cheat/cheatsheets/csplit b/cheat/cheatsheets/csplit new file mode 100644 index 0000000..6d7d8ef --- /dev/null +++ b/cheat/cheatsheets/csplit @@ -0,0 +1,5 @@ +# Split a file based on pattern +csplit input.file '/PATTERN/' + +# Use prefix/suffix to improve resulting file names +csplit -f 'prefix-' -b '%d.extension' input.file '/PATTERN/' '{*}' diff --git a/cheat/cheatsheets/cups b/cheat/cheatsheets/cups new file mode 100644 index 0000000..b1b7924 --- /dev/null +++ b/cheat/cheatsheets/cups @@ -0,0 +1,22 @@ +# Manage printers through CUPS: +http://localhost:631 (in web browser) + +# Print file from command line +lp myfile.txt + +# Display print queue +lpq + +# Remove print job from queue +lprm 545 +or +lprm - + +# Print log location +/var/log/cups + +# Reject new jobs +cupsreject printername + +# Accept new jobs +cupsaccept printername diff --git a/cheat/cheatsheets/date b/cheat/cheatsheets/date index aa3a767..05cebbf 100644 --- a/cheat/cheatsheets/date +++ b/cheat/cheatsheets/date @@ -1,2 +1,5 @@ -# Printout date in format suitable for affixing to file names +# Print date in format suitable for affixing to file names date +"%Y%m%d_%H%M%S" + +# Convert Unix timestamp to Date +date -d @1440359821 diff --git a/cheat/cheatsheets/dnf b/cheat/cheatsheets/dnf new file mode 100644 index 0000000..10c3766 --- /dev/null +++ b/cheat/cheatsheets/dnf @@ -0,0 +1,16 @@ +# To install the latest version of a package: +dnf install + +# To search package details for the given string +dnf search + +# To find which package provides a binary +dnf provides + +# The following are available after installing "dnf-plugins-core" + +# Download a package +dnf download + +# install the build dependencies for a SRPM or from a .spec file +dnf builddep diff --git a/cheat/cheatsheets/docker b/cheat/cheatsheets/docker new file mode 100644 index 0000000..6224d7b --- /dev/null +++ b/cheat/cheatsheets/docker @@ -0,0 +1,32 @@ +# Start docker daemon +docker -d + +# start a container with an interactive shell +docker run -ti /bin/bash + +# "shell" into a running container (docker-1.3+) +docker exec -ti bash + +# inspect a running container +docker inspect (or ) + +# Get the process ID for a container +# Source: https://github.com/jpetazzo/nsenter +docker inspect --format {{.State.Pid}} + +# List the current mounted volumes for a container (and pretty print) +# Source: +# http://nathanleclaire.com/blog/2014/07/12/10-docker-tips-and-tricks-that-will-make-you-sing-a-whale-song-of-joy/ +docker inspect --format='{{json .Volumes}}' | python -mjson.tool + +# Copy files/folders between a container and your host +docker cp foo.txt mycontainer:/foo.txt + +# list currently running containers +docker ps + +# list all containers +docker ps -a + +# list all images +docker images diff --git a/cheat/cheatsheets/dpkg b/cheat/cheatsheets/dpkg new file mode 100644 index 0000000..76eca1b --- /dev/null +++ b/cheat/cheatsheets/dpkg @@ -0,0 +1,11 @@ +# Install the package or upgrade it +dpkg -i test.deb + +# Remove a package including configuration files +dpkg -P test.deb + +# List all installed packages with versions and details +dpkg -I + +# Find out if a Debian package is installed or not +dpkg -s test.deb | grep Status diff --git a/cheat/cheatsheets/du b/cheat/cheatsheets/du new file mode 100644 index 0000000..57b6ac3 --- /dev/null +++ b/cheat/cheatsheets/du @@ -0,0 +1,5 @@ +# To sort directories/files by size +du -sk *| sort -rn + +# To show cumulative humanreadable size +du -sh diff --git a/cheat/cheatsheets/ffmpeg b/cheat/cheatsheets/ffmpeg new file mode 100644 index 0000000..952c45b --- /dev/null +++ b/cheat/cheatsheets/ffmpeg @@ -0,0 +1,12 @@ +# Print file metadata etc. +ffmpeg -i path/to/file.ext + +# Convert all m4a files to mp3 +for f in *.m4a; do ffmpeg -i "$f" -acodec libmp3lame -ab 320k "${f%.m4a}.mp3"; done + +# Listen to 10 seconds of audio from a video file +# +# -ss : start time +# -t : seconds to cut +# -autoexit : closes ffplay as soon as the audio finishes +ffmpeg -ss 00:34:24.85 -t 10 -i path/to/file.mp4 -f mp3 pipe:play | ffplay -i pipe:play -autoexit diff --git a/cheat/cheatsheets/find b/cheat/cheatsheets/find index 5cd262f..f97ce77 100644 --- a/cheat/cheatsheets/find +++ b/cheat/cheatsheets/find @@ -20,10 +20,10 @@ find ./path/ -name '*.txt' -exec rm '{}' \; 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 +find . -size +5M -type f -print0 | xargs -0 ls -Ssh | sort -z # To find files bigger thank 2 MB and list them: -find / -type f -size +20000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }' +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 @@ -41,4 +41,4 @@ find . -maxdepth 2 -name build -type d 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 +find . -type f -samefile MY_FILE_HERE 2>/dev/null diff --git a/cheat/cheatsheets/git b/cheat/cheatsheets/git index a31f4de..b5c142b 100644 --- a/cheat/cheatsheets/git +++ b/cheat/cheatsheets/git @@ -1,4 +1,4 @@ -# To set your identify: +# To set your identity: git config --global user.name "John Doe" git config --global user.email johndoe@example.com @@ -17,9 +17,25 @@ git commit -m "Your commit message" # To edit previous commit message git commit --amend +# Git commit in the past +git commit --date="`date --date='2 day ago'`" +git commit --date="Jun 13 18:30:25 IST 2015" +# more recent versions of Git also support --date="2 days ago" directly + +# To change the date of an existing commit +git filter-branch --env-filter \ + 'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ] + then + export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800" + export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700" + fi' + # To removed staged and working directory changes git reset --hard +# To go 2 commits back +git reset --hard HEAD~2 + # To remove untracked files git clean -f -d @@ -35,6 +51,9 @@ git push git@github.com:username/project.git # To delete the branch "branch_name" git branch -D branch_name +# To make an exisiting branch track a remote branch +git branch -u upstream/foo + # To see who commited which line in a file git blame filename @@ -51,3 +70,37 @@ git show 83fb499:path/fo/file.ext # Shows the file as it a git diff branch_1 branch_2 # Check difference between branches git log # Show all the commits git status # Show the changes from last commit + +# Commit history of a set of files +git log --pretty=email --patch-with-stat --reverse --full-index -- Admin\*.py > Sripts.patch + +# Import commits from another repo +git --git-dir=../some_other_repo/.git format-patch -k -1 --stdout | git am -3 -k + +# View commits that will be pushed +git log @{u}.. + +# View changes that are new on a feature branch +git log -p feature --not master +git diff master...feature + +# Interactive rebase for the last 7 commits +git rebase -i @~7 + +# Diff files WITHOUT considering them a part of git +# This can be used to diff files that are not in a git repo! +git diff --no-index path/to/file/A path/to/file/B + +# To pull changes while overwriting any local commits +git fetch --all +git reset --hard origin/master + +# Update all your submodules +git submodule update --init --recursive + +# Perform a shallow clone to only get latest commits +# (helps save data when cloning large repos) +git clone --depth 1 + +# To unshallow a clone +git pull --unshallow diff --git a/cheat/cheatsheets/grep b/cheat/cheatsheets/grep index fced336..8c41057 100644 --- a/cheat/cheatsheets/grep +++ b/cheat/cheatsheets/grep @@ -1,13 +1,13 @@ -# Basic: +# Search a file for a pattern grep pattern file -# case nonsensitive research: -grep -i pattern file +# Case insensitive search (with line numbers) +grep -in pattern file # Recursively grep for string in folder: grep -R pattern folder -# Getting pattern from file (one by line): +# Read search patterns from a file (one per line) grep -f pattern_file file # Find lines NOT containing pattern @@ -17,10 +17,13 @@ grep -v pattern file 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}. +# Find all files which match {pattern} in {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' + +# Colour in red {bash} and keep all other lines +ps aux | grep -E --color 'bash|$' diff --git a/cheat/cheatsheets/gzip b/cheat/cheatsheets/gzip new file mode 100644 index 0000000..30dee79 --- /dev/null +++ b/cheat/cheatsheets/gzip @@ -0,0 +1,17 @@ +# To create a *.gz compressed file +gzip test.txt + +# To create a *.gz compressed file to a specific location using -c option (standard out) +gzip -c test.txt > test_custom.txt.gz + +# To uncompress a *.gz file +gzip -d test.txt.gz + +# Display compression ratio of the compressed file using gzip -l +gzip -l *.gz + +# Recursively compress all the files under a specified directory +gzip -r documents_directory + +# To create a *.gz compressed file and keep the original +gzip < test.txt > test.txt.gz diff --git a/cheat/cheatsheets/hardware-info b/cheat/cheatsheets/hardware-info new file mode 100644 index 0000000..0bf4e57 --- /dev/null +++ b/cheat/cheatsheets/hardware-info @@ -0,0 +1,32 @@ +# Display all hardware details +sudo lshw + +# List currently loaded kernel modules +lsmod + +# List all modules available to the system +find /lib/modules/$(uname -r) -type f -iname "*.ko" + +# Load a module into kernel +modprobe modulename + +# Remove a module from kernel +modprobe -r modulename + +# List devices connected via pci bus +lspci + +# Debug output for pci devices (hex) +lspci -vvxxx + +# Display cpu hardware stats +cat /proc/cpuinfo + +# Display memory hardware stats +cat /proc/meminfo + +# Output the kernel ring buffer +dmesg + +# Ouput kernel messages +dmesg --kernel diff --git a/cheat/cheatsheets/hub b/cheat/cheatsheets/hub new file mode 100644 index 0000000..22cfeab --- /dev/null +++ b/cheat/cheatsheets/hub @@ -0,0 +1,74 @@ +As a contributor to open-source +------------------------------- + +# clone your own project +$ git clone dotfiles +→ git clone git://github.com/YOUR_USER/dotfiles.git + +# clone another project +$ git clone github/hub +→ git clone git://github.com/github/hub.git + +# see the current project's issues +$ git browse -- issues +→ open https://github.com/github/hub/issues + +# open another project's wiki +$ git browse mojombo/jekyll wiki +→ open https://github.com/mojombo/jekyll/wiki + +## Example workflow for contributing to a project: +$ git clone github/hub +$ cd hub +# create a topic branch +$ git checkout -b feature +→ ( making changes ... ) +$ git commit -m "done with feature" +# It's time to fork the repo! +$ git fork +→ (forking repo on GitHub...) +→ git remote add YOUR_USER git://github.com/YOUR_USER/hub.git +# push the changes to your new remote +$ git push YOUR_USER feature +# open a pull request for the topic branch you've just pushed +$ git pull-request +→ (opens a text editor for your pull request message) + + +As an open-source maintainer +---------------------------- + +# fetch from multiple trusted forks, even if they don't yet exist as remotes +$ git fetch mislav,cehoffman +→ git remote add mislav git://github.com/mislav/hub.git +→ git remote add cehoffman git://github.com/cehoffman/hub.git +→ git fetch --multiple mislav cehoffman + +# check out a pull request for review +$ git checkout https://github.com/github/hub/pull/134 +→ (creates a new branch with the contents of the pull request) + +# directly apply all commits from a pull request to the current branch +$ git am -3 https://github.com/github/hub/pull/134 + +# cherry-pick a GitHub URL +$ git cherry-pick https://github.com/xoebus/hub/commit/177eeb8 +→ git remote add xoebus git://github.com/xoebus/hub.git +→ git fetch xoebus +→ git cherry-pick 177eeb8 + +# `am` can be better than cherry-pick since it doesn't create a remote +$ git am https://github.com/xoebus/hub/commit/177eeb8 + +# open the GitHub compare view between two releases +$ git compare v0.9..v1.0 + +# put compare URL for a topic branch to clipboard +$ git compare -u feature | pbcopy + +# create a repo for a new project +$ git init +$ git add . && git commit -m "It begins." +$ git create -d "My new thing" +→ (creates a new project on GitHub with the name of current directory) +$ git push origin master diff --git a/cheat/cheatsheets/ip b/cheat/cheatsheets/ip new file mode 100644 index 0000000..a0f20cd --- /dev/null +++ b/cheat/cheatsheets/ip @@ -0,0 +1,32 @@ +# Display all interfaces with addresses +ip addr + +# Take down / up the wireless adapter +ip link set dev wlan0 {up|down} + +# Set a static IP and netmask +ip addr add 192.168.1.100/32 dev eth0 + +# Remove a IP from an interface +ip addr del 192.168.1.100/32 dev eth0 + +# Remove all IPs from an interface +ip address flush dev eth0 + +# Display all routes +ip route + +# Display all routes for IPv6 +ip -6 route + +# Add default route via gateway IP +ip route add default via 192.168.1.1 + +# Add route via interface +ip route add 192.168.0.0/24 dev eth0 + +# Change your mac address +ip link set dev eth0 address aa:bb:cc:dd:ee:ff + +# View neighbors (using ARP and NDP) +ip neighbor show diff --git a/cheat/cheatsheets/journalctl b/cheat/cheatsheets/journalctl index 6c00e7f..0a28bc4 100644 --- a/cheat/cheatsheets/journalctl +++ b/cheat/cheatsheets/journalctl @@ -19,3 +19,14 @@ journalctl /usr/bin/dbus-daemon # Filter by PID journalctl _PID=123 +# Filter by Command, e.g., sshd +journalctl _COMM=sshd + +# Filter by Command and time period +journalctl _COMM=crond --since '10:00' --until '11:00' + +# List all available boots +journalctl --list-boots + +# Filter by specific User ID e.g., user id 1000 +journalctl _UID=1000 diff --git a/cheat/cheatsheets/jq b/cheat/cheatsheets/jq new file mode 100644 index 0000000..d57cc13 --- /dev/null +++ b/cheat/cheatsheets/jq @@ -0,0 +1,13 @@ +# Pretty print the json +jq "." < filename.json + +# Access the value at key "foo" +jq '.foo' + +# Access first list item +jq '.[0]' + +# Slice & Dice +jq '.[2:4]' +jq '.[:3]' +jq '.[-2:]' diff --git a/cheat/cheatsheets/jrnl b/cheat/cheatsheets/jrnl new file mode 100644 index 0000000..c3540e2 --- /dev/null +++ b/cheat/cheatsheets/jrnl @@ -0,0 +1,25 @@ +# Add entry to default jrnl (from your configured text editor) +jrnl + +# Add entry to default jrnl +jrnl Write entry here. + +# List of tags +jrnl --tags + +# Entries per tag +jrnl @tag + +# Export jrnl as json +jrnl --export json + +# Entries in a timeframe +jrnl -from 2009 -until may + +# Add Sublime text to .jrnl_config + +# Windows +"editor": "F:\\Powerpack\\Sublime\\sublime_text.exe -w" + +# Linux +"editor": "/usr/bin/sublime -w" diff --git a/cheat/cheatsheets/lib b/cheat/cheatsheets/lib new file mode 100644 index 0000000..6854482 --- /dev/null +++ b/cheat/cheatsheets/lib @@ -0,0 +1,23 @@ +# Display available libraries +ldconfig -p + +# Update library resources +ldconfig + +# Display libraries and file location +ldd + +# Libraries available to apps in real-time +"Dynamic Libraries" (.so.) + +# Libraries only available to apps when installed (imported) +"Static Libraries" (.a.) + +# Standard (usual) library file location +/lib + +# Sofware-accessible source for library info +/etc/ld.so.cache # (binary) + +# Human-readable source for library info +/etc/ld.so.conf # (points to /etc/ld.so.conf.d) diff --git a/cheat/cheatsheets/ln b/cheat/cheatsheets/ln index 441c3a9..5a02f76 100644 --- a/cheat/cheatsheets/ln +++ b/cheat/cheatsheets/ln @@ -1,2 +1,5 @@ # To create a symlink: ln -s path/to/the/target/directory name-of-symlink + +# Symlink, while overwriting existing destination files +ln -sf /some/dir/exec /usr/bin/exec diff --git a/cheat/cheatsheets/ls b/cheat/cheatsheets/ls index 9d85600..41a116a 100644 --- a/cheat/cheatsheets/ls +++ b/cheat/cheatsheets/ls @@ -9,3 +9,9 @@ ls -lh # Display files, sorted by size ls -S + +# Display directories only +ls -d */ + +# Display directories only, include hidden +ls -d .*/ */ diff --git a/cheat/cheatsheets/lvm b/cheat/cheatsheets/lvm new file mode 100644 index 0000000..492be2e --- /dev/null +++ b/cheat/cheatsheets/lvm @@ -0,0 +1,7 @@ +#Exclusive Activation of a Volume Group in a Cluster +#Link --> https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Administration/s1-exclusiveactive-HAAA.html +1> vgs --noheadings -o vg_name +2> volume_list = [ "rhel_root", "rhel_home" ] +3> dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r) +4> Reboot the node +5> uname -r to verify the correct initrd image diff --git a/cheat/cheatsheets/man b/cheat/cheatsheets/man new file mode 100644 index 0000000..6d95d0b --- /dev/null +++ b/cheat/cheatsheets/man @@ -0,0 +1,5 @@ +# Convert a man page to pdf +man -t bash | ps2pdf - bash.pdf + +# View the ascii chart +man 7 ascii diff --git a/cheat/cheatsheets/markdown b/cheat/cheatsheets/markdown index 8b551a6..917fcf1 100644 --- a/cheat/cheatsheets/markdown +++ b/cheat/cheatsheets/markdown @@ -35,6 +35,9 @@ ___ # links This is [an example](http://example.com "Title") inline link. +# image +![Alt Text](/path/to/file.png) + # emphasis *em* _em_ diff --git a/cheat/cheatsheets/more b/cheat/cheatsheets/more new file mode 100644 index 0000000..c1ee9d9 --- /dev/null +++ b/cheat/cheatsheets/more @@ -0,0 +1,3 @@ +# To show the file start at line number 5 +more +5 file + diff --git a/cheat/cheatsheets/mount b/cheat/cheatsheets/mount index 7b81d93..233c0e3 100644 --- a/cheat/cheatsheets/mount +++ b/cheat/cheatsheets/mount @@ -1,6 +1,9 @@ # To mount / partition as read-write in repair mode: mount -o remount,rw / +# Bind mount path to a second location +mount --bind /origin/path /destination/path + # To mount Usb disk as user writable: mount -o uid=username,gid=usergroup /dev/sdx /mnt/xxx diff --git a/cheat/cheatsheets/mysql b/cheat/cheatsheets/mysql index 610d395..83b5add 100644 --- a/cheat/cheatsheets/mysql +++ b/cheat/cheatsheets/mysql @@ -12,3 +12,8 @@ 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; + +# To list the privileges granted to the account that you are using to connect to the server. Any of the 3 statements will work. +SHOW GRANTS FOR CURRENT_USER(); +SHOW GRANTS; +SHOW GRANTS FOR CURRENT_USER; diff --git a/cheat/cheatsheets/mysqldump b/cheat/cheatsheets/mysqldump index f9f34a3..61c809c 100644 --- a/cheat/cheatsheets/mysqldump +++ b/cheat/cheatsheets/mysqldump @@ -1,16 +1,16 @@ - # To dump a database to a file (Note that your password will appear in your command history!): +# 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!): +# 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!): +# 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: diff --git a/cheat/cheatsheets/nc b/cheat/cheatsheets/nc new file mode 100644 index 0000000..8dc9b53 --- /dev/null +++ b/cheat/cheatsheets/nc @@ -0,0 +1,20 @@ +# To open a TCP connection to port 42 of host.example.com, using port 31337 as the source port, with a timeout of 5 seconds: +nc -p 31337 -w 5 host.example.com 42 + +# To open a UDP connection to port 53 of host.example.com: +nc -u host.example.com 53 + +# To open a TCP connection to port 42 of host.example.com using 10.1.2.3 as the IP for the local end of the connection: +nc -s 10.1.2.3 host.example.com 42 + +# To create and listen on a UNIX-domain stream socket: +nc -lU /var/tmp/dsocket + +# To connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4, port 8080. This example could also be used by ssh(1); see the ProxyCommand directive in ssh_config(5) for more information. +nc -x10.2.3.4:8080 -Xconnect host.example.com 42 + +# The same example again, this time enabling proxy authentication with username "ruser" if the proxy requires it: +nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42 + +# To choose the source IP for the testing using the -s option +nc -zv -s source_IP target_IP Port diff --git a/cheat/cheatsheets/nmap b/cheat/cheatsheets/nmap index 81c54a8..90efccb 100644 --- a/cheat/cheatsheets/nmap +++ b/cheat/cheatsheets/nmap @@ -23,13 +23,15 @@ nmap -source-port [port] [target] nmap -A [target] # Speedup your scan: -nmap -T5 --min-parallelism=50 [target] +# -n => disable ReverseDNS +# --min-rate=X => min X packets / sec +nmap -T5 --min-parallelism=50 -n --min-rate=300 [target] # Traceroute: nmap -traceroute [target] # Ping scan only: -sP -# Don't ping: -PN +# Don't ping: -PN <- Use full if a host don't reply to a ping. # TCP SYN ping: -PS # TCP ACK ping: -PA # UDP ping: -PU @@ -38,6 +40,9 @@ nmap -traceroute [target] # Example: Ping scan all machines on a class C network nmap -sP 192.168.0.0/24 +# Force TCP scan: -sT +# Force UDP scan: -sU + # Use some script: nmap --script default,safe @@ -55,3 +60,10 @@ 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-*" + +# Scan for the heartbleed +# -pT:443 => Scan only port 443 with TCP (T:) +nmap -T5 --min-parallelism=50 -n --script "ssl-heartbleed" -pT:443 127.0.0.1 + +# Show all informations (debug mode) +nmap -d ... diff --git a/cheat/cheatsheets/nova b/cheat/cheatsheets/nova new file mode 100644 index 0000000..94720d8 --- /dev/null +++ b/cheat/cheatsheets/nova @@ -0,0 +1,20 @@ +# To list VMs on current tenant: +nova list + +# To list VMs of all tenants (admin user only): +nova list --all-tenants + +# To boot a VM on a specific host: +nova boot --nic net-id= \ + --image \ + --flavor \ + --availability-zone nova: + +# To stop a server +nova stop + +# To start a server +nova start + +# To attach a network interface to a specific VM: +nova interface-attach --net-id diff --git a/cheat/cheatsheets/ntp b/cheat/cheatsheets/ntp new file mode 100644 index 0000000..f578c54 --- /dev/null +++ b/cheat/cheatsheets/ntp @@ -0,0 +1,33 @@ +# Verify ntpd running: +service ntp status + +# Start ntpd if not running: +service ntp start + +# Display current hardware clock value: +sudo hwclock -r + +# Apply system time to hardware time: +sudo hwclock --systohc + +# Apply hardware time to system time: +sudo hwclock --hctosys + +# Set hwclock to local time: +sudo hwclock --localtime + +# Set hwclock to UTC: +sudo hwclock --utc + +# Set hwclock manually: +sudo hwclock --set --date="8/10/15 13:10:05" + +# Query surrounding stratum time servers +ntpq -pn + +# Config file: +/etc/ntp.conf + +# Driftfile: +location of "drift" of your system clock compared to ntp servers +/var/lib/ntp/ntp.drift diff --git a/cheat/cheatsheets/numfmt b/cheat/cheatsheets/numfmt new file mode 100644 index 0000000..0b9bbc4 --- /dev/null +++ b/cheat/cheatsheets/numfmt @@ -0,0 +1,2 @@ +# Convert bytes to Human readable format +numfmt --to=iec --suffix=B --padding=7 1048576 diff --git a/cheat/cheatsheets/openssl b/cheat/cheatsheets/openssl index 74a2511..9254c1c 100644 --- a/cheat/cheatsheets/openssl +++ b/cheat/cheatsheets/openssl @@ -19,3 +19,6 @@ openssl x509 -text -noout -in server.crt echo | openssl s_client -connect :443 2> /dev/null | \ awk '/-----BEGIN/,/END CERTIFICATE-----/' | \ openssl x509 -noout -enddate + +# Generate Diffie-Hellman parameters: +openssl dhparam -outform PEM -out dhparams.pem 2048 diff --git a/cheat/cheatsheets/p4 b/cheat/cheatsheets/p4 new file mode 100644 index 0000000..dc4c2eb --- /dev/null +++ b/cheat/cheatsheets/p4 @@ -0,0 +1,5 @@ +# Print details related to Client and server configuration +p4 info + +# Open a file and add it to depot +p4 add diff --git a/cheat/cheatsheets/paste b/cheat/cheatsheets/paste new file mode 100644 index 0000000..065f3f2 --- /dev/null +++ b/cheat/cheatsheets/paste @@ -0,0 +1,15 @@ +# Concat columns from files +paste file1 file2 ... + +# List the files in the current directory in three columns: +ls | paste - - - + +# Combine pairs of lines from a file into single lines: +paste -s -d '\t\n' myfile + +# Number the lines in a file, similar to nl(1): +sed = myfile | paste -s -d '\t\n' - - + +# Create a colon-separated list of directories named bin, +# suitable for use in the PATH environment variable: +find / -name bin -type d | paste -s -d : - \ No newline at end of file diff --git a/cheat/cheatsheets/ping b/cheat/cheatsheets/ping new file mode 100644 index 0000000..a50198b --- /dev/null +++ b/cheat/cheatsheets/ping @@ -0,0 +1,8 @@ +# ping a host with a total count of 15 packets overall. +ping -c 15 www.example.com + +# ping a host with a total count of 15 packets overall, one every .5 seconds (faster ping). +ping -c 15 -i .5 www.example.com + +# test if a packet size of 1500 bytes is supported (to check the MTU for example) +ping -s 1500 -c 10 -M do www.example.com diff --git a/cheat/cheatsheets/ping6 b/cheat/cheatsheets/ping6 new file mode 100644 index 0000000..39e121e --- /dev/null +++ b/cheat/cheatsheets/ping6 @@ -0,0 +1,2 @@ +# get all ipv6 neighbors via broadcast ping +ping6 -I eth0 ff02::1 diff --git a/cheat/cheatsheets/pip b/cheat/cheatsheets/pip new file mode 100644 index 0000000..edc122c --- /dev/null +++ b/cheat/cheatsheets/pip @@ -0,0 +1,21 @@ +# Search for packages +pip search SomePackage + +# Install some packages +pip install SomePackage + +# Output and install packages in a requirement file +pip freeze > requirements.txt +pip install -r requirements.txt + +# Show details of a package +pip show SomePackage + +# List outdated packages +pip list --outdated + +# Upgrade all outdated packages, thanks to http://stackoverflow.com/a/3452888 +pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U + +# Install specific version of a package +pip install -I SomePackage1==1.1.0 'SomePackage2>=1.0.4' diff --git a/cheat/cheatsheets/readline b/cheat/cheatsheets/readline new file mode 100644 index 0000000..ef82e1a --- /dev/null +++ b/cheat/cheatsheets/readline @@ -0,0 +1,49 @@ + Moving around +Ctrl-b Move the cursor one character ⇦ to the left +Ctrl-f Move the cursor one character ⇨ to the right +Alt-b Move the cursor one word ⇦ to the left +Alt-f Move the cursor one word ⇨ to the right +Ctrl-a Move the cursor ⇤ to the start of the line +Ctrl-e Move the cursor ⇥ to the end of the line +Ctrl-x-x Move the cursor ⇤⇥ to the start, and to the end again + + Cut, copy and paste +Backspace Delete the character ⇦ to the left of the cursor +DEL +Ctrl-d Delete the character underneath the cursor +Ctrl-u Delete everything ⇤ from the cursor back to the line start +Ctrl-k Delete everything ⇥ from the cursor to the end of the line +Alt-d Delete word ⇨ until before the next word boundary +Ctrl-w Delete word ⇦ until after the previous word boundary +Ctrl-y Yank/Paste prev. killed text at the cursor position +Alt-y Yank/Paste prev. prev. killed text at the cursor position + + History +Ctrl-p Move in history one line ⇧ before this line +Ctrl-n Move in history one line ⇩ after this line +Alt-> Move in history all the lines ⇩ to the line currently being entered +Ctrl-r Incrementally search the line history ⇧ backwardly +Ctrl-s Incrementally search the line history ⇩ forwardly +Ctrl-J End an incremental search +Ctrl-G Abort an incremental search and restore the original line +Alt-Ctrl-y Yank/Paste arg. 1 of prev. cmnd at the cursor position +Alt-. +Alt-_ Yank/Paste last arg of prev. cmnd at the cursor position + + Undo +Ctrl-_ +Ctrl-x +Ctrl-u Undo the last editing command; you can undo all the way back to an empty line +Alt-r Undo all changes made to this line +Ctrl-l Clear the screen, reprinting the current line at the top +Ctrl-l Clear the screen, reprinting the current line at the top + + Completion +TAB Auto-complete a name +Alt-/ Auto-complete a name (without smart completion) +Alt-? List the possible completions of the preceeding text +Alt-* Insert all possible completions of the preceeding text + + Transpose +Ctrl-t Transpose/drag char. before the cursor ↷ over the character at the cursor +Alt-t Transpose/drag word before the cursor ↷ over the word at/after the cursor diff --git a/cheat/cheatsheets/rm b/cheat/cheatsheets/rm index d119df2..2a8fc02 100644 --- a/cheat/cheatsheets/rm +++ b/cheat/cheatsheets/rm @@ -1,5 +1,8 @@ # Remove files and subdirs rm -rf path/to/the/target/ -# Ignore non existent files +# Ignore non existent files rm -f path/to/the/target + +# Remove a file with his inode +find /tmp/ -inum 6666 -exec rm -i '{}' \; diff --git a/cheat/cheatsheets/route b/cheat/cheatsheets/route new file mode 100644 index 0000000..5997ebd --- /dev/null +++ b/cheat/cheatsheets/route @@ -0,0 +1,29 @@ +# To display routing table IP addresses instead of host names: +route -n + +# To add a default gateway: +route add default gateway 192.168.0.1 + +# To add the normal loopback entry, using netmask 255.0.0.0 and associated with the "lo" device (assuming this device was previously set up correctly with ifconfig(8)). +route add -net 127.0.0.0 netmask 255.0.0.0 dev lo + +# To add a route to the local network 192.56.76.x via "eth0". The word "dev" can be omitted here. +route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0 + +# To delete the current default route, which is labeled "default" or 0.0.0.0 in the destination field of the current routing table. +route del default + +# To add a default route (which will be used if no other route matches). All packets using this route will be gatewayed through "mango-gw". The device which will actually be used for that route depends on how we can reach "mango-gw" - the static route to "mango-gw" will have to be set up before. +route add default gw mango-gw + +# To add the route to the "ipx4" host via the SLIP interface (assuming that "ipx4" is the SLIP host). +route add ipx4 sl0 + +# To add the net "192.57.66.x" to be gateway through the former route to the SLIP interface. +route add -net 192.57.66.0 netmask 255.255.255.0 gw ipx4 + +# To install a rejecting route for the private network "10.x.x.x." +route add -net 10.0.0.0 netmask 255.0.0.0 reject + +# This is an obscure one documented so people know how to do it. This sets all of the class D (multicast) IP routes to go via "eth0". This is the correct normal configuration line with a multicasting kernel +route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 diff --git a/cheat/cheatsheets/rpm b/cheat/cheatsheets/rpm new file mode 100644 index 0000000..63227bc --- /dev/null +++ b/cheat/cheatsheets/rpm @@ -0,0 +1,31 @@ +# To install a package: +rpm -ivh + +# To remove a package: +rpm -e + +# To remove a package, but not its dependencies +rpm -e --nodeps + +# To find what package installs a file: +rpm -qf + +# To find what files are installed by a package: +rpm -ql +rpm -qpl + +# To find what packages require a package or file: +rpm -q --whatrequires +rpm -q --whatrequires + +# To list all installed packages: +rpm -qa + +# To find a pkg's dependencies +rpm -i --test + +# Display checksum against source +rpm -K + +# Verify a package +rpm -V diff --git a/cheat/cheatsheets/rss2email b/cheat/cheatsheets/rss2email new file mode 100644 index 0000000..5d5cc77 --- /dev/null +++ b/cheat/cheatsheets/rss2email @@ -0,0 +1,21 @@ +'rss2email -- converts rss feeds and emails them to your inbox' + +# List all feeds +r2e list + +# Convert RSS entries to email +r2e run + +# Add a new feed +r2e add + +# Add a new feed with new email address +r2e add [newemail address] + +# Delete a feed +r2e delete <# of feed in list/> + +# Help +r2e -h + + diff --git a/cheat/cheatsheets/rsync b/cheat/cheatsheets/rsync index 617bf74..43343b6 100644 --- a/cheat/cheatsheets/rsync +++ b/cheat/cheatsheets/rsync @@ -1,6 +1,14 @@ -# copy files from remote to local, maintaining file propertires and sym-links (-a), zipping for faster transfer (-z), verbose (-v). +# To copy files from remote to local, maintaining file properties 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). +# Copy files using checksum (-c) rather than time to detect if the file has changed. (Useful for validating backups). rsync -avc /source/ /dest/ + +# Copy contents of /src/foo to destination: + +# This command will create /dest/foo if it does not already exist +rsync -auv /src/foo /dest + +# Explicitly copy /src/foo to /dest/foo +rsync -auv /src/foo/ /dest/foo diff --git a/cheat/cheatsheets/sed b/cheat/cheatsheets/sed index f60b269..e22c97a 100644 --- a/cheat/cheatsheets/sed +++ b/cheat/cheatsheets/sed @@ -10,5 +10,8 @@ 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: +# To remove empty lines and print results to stdout: sed '/^$/d' file.txt + +# To replace newlines in multiple lines +sed ':a;N;$!ba;s/\n//g' file.txt diff --git a/cheat/cheatsheets/smbclient b/cheat/cheatsheets/smbclient new file mode 100644 index 0000000..4231fd8 --- /dev/null +++ b/cheat/cheatsheets/smbclient @@ -0,0 +1,5 @@ +# To display public shares on the server: +smbclient -L -U% + +# To connect to a share: +smbclient /// -U% diff --git a/cheat/cheatsheets/snmpwalk b/cheat/cheatsheets/snmpwalk new file mode 100644 index 0000000..90c86ea --- /dev/null +++ b/cheat/cheatsheets/snmpwalk @@ -0,0 +1,5 @@ +# To retrieve all of the variables under system for host zeus +snmpwalk -Os -c public -v 1 zeus system + +# To retrieve the scalar values, but omit the sysORTable for host zeus +snmpwalk -Os -c public -v 1 -CE sysORTable zeus system diff --git a/cheat/cheatsheets/ss b/cheat/cheatsheets/ss new file mode 100644 index 0000000..8925108 --- /dev/null +++ b/cheat/cheatsheets/ss @@ -0,0 +1,18 @@ +ss +Utility to investigate sockets + +Args +-4/-6 list ipv4/ipv6 sockets +-n numeric addresses instead of hostnames +-l list listing sockets +-u/-t/-x list udp/tcp/unix sockets +-p Show process(es) that using socket + +# show all listing tcp sockets including the corresponding process +ss -tlp + +# show all sockets connecting to 192.168.2.1 on port 80 +ss -t dst 192.168.2.1:80 + +# show all ssh related connection +ss -t state established '( dport = :ssh or sport = :ssh )' diff --git a/cheat/cheatsheets/ssh b/cheat/cheatsheets/ssh index ce11b52..e83bcce 100644 --- a/cheat/cheatsheets/ssh +++ b/cheat/cheatsheets/ssh @@ -4,12 +4,19 @@ ssh -i /path/to/file.pem user@example.com # To connect on an non-standard port: ssh -p 2222 user@example.com +# To connect and forward the authentication agent +ssh -A 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 +# Redirect traffic with a tunnel between local host (port 8080) and a remote +# host (remote.example.com:5000) through a proxy (personal.server.com): +ssh -f -L 8080:remote.example.com:5000 user@personal.server.com -N + # To launch a specific x application over SSH: ssh -X -t user@example.com 'chromium-browser' @@ -21,3 +28,7 @@ ssh user@example.com -C -c blowfish -X # For more information, see: # http://unix.stackexchange.com/q/12755/44856 + +# Copy files and folders through ssh from remote host to pwd with tar.gz compression +# when there is no rsync command available +ssh user@example.com "cd /var/www/Shared/; tar zcf - asset1 asset2" | tar zxf - diff --git a/cheat/cheatsheets/systemd b/cheat/cheatsheets/systemd new file mode 100644 index 0000000..ff56eb5 --- /dev/null +++ b/cheat/cheatsheets/systemd @@ -0,0 +1,18 @@ +# Display process startup time +systemd-analyze + +# Display process startup time at service level +systemd-analyze blame + +# List running units +systemctl list-units + +# Load a unit at startup +systemctl enable foo.service + +# Start or Stop a unit +systemctl foo.service + +# Unit file locations +/etc/systemd/system +/usr/lib/systemd/system diff --git a/cheat/cheatsheets/tar b/cheat/cheatsheets/tar index efa615f..088137a 100644 --- a/cheat/cheatsheets/tar +++ b/cheat/cheatsheets/tar @@ -24,3 +24,8 @@ 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/ + +# To use parallel (multi-threaded) implementation of compression algorithms: +tar -z ... -> tar -Ipigz ... +tar -j ... -> tar -Ipbzip2 ... +tar -J ... -> tar -Ipixz ... diff --git a/cheat/cheatsheets/tee b/cheat/cheatsheets/tee new file mode 100644 index 0000000..301d4df --- /dev/null +++ b/cheat/cheatsheets/tee @@ -0,0 +1,5 @@ +# To tee stdout to a file: +ls | tee outfile.txt + +# To tee stdout and append to a file: +ls | tee -a outfile.txt diff --git a/cheat/cheatsheets/tr b/cheat/cheatsheets/tr new file mode 100644 index 0000000..09849e4 --- /dev/null +++ b/cheat/cheatsheets/tr @@ -0,0 +1,22 @@ +#replace : with new line +echo $PATH|tr ":" "\n" #equivalent with: +echo $PATH|tr -t ":" \n + +#remove all occurance of "ab" +echo aabbcc |tr -d "ab" +#ouput: cc + +#complement "aa" +echo aabbccd |tr -c "aa" 1 +#output: aa11111 without new line +#tip: Complement meaning keep aa,all others are replaced with 1 + +#complement "ab\n" +echo aabbccd |tr -c "ab\n" 1 +#output: aabb111 with new line + +#Preserve all alpha(-c). ":-[:digit:] etc" will be translated to "\n". sequeeze mode. +echo $PATH|tr -cs "[:alpha:]" "\n" + +#ordered list to unordered list +echo "1. /usr/bin\n2. /bin" |tr -cs " /[:alpha:]\n" "+" diff --git a/cheat/cheatsheets/udisksctl b/cheat/cheatsheets/udisksctl new file mode 100644 index 0000000..2cd929b --- /dev/null +++ b/cheat/cheatsheets/udisksctl @@ -0,0 +1,11 @@ +# Get info about block device +udisksctl info -b + +# Mounting device +udisksctl mount --block-device + +# Unmounting device +udisksctl unmount --block-device + +# Get help +udisksctl help diff --git a/cheat/cheatsheets/uniq b/cheat/cheatsheets/uniq new file mode 100644 index 0000000..b9abd3d --- /dev/null +++ b/cheat/cheatsheets/uniq @@ -0,0 +1,18 @@ +# show all lines without duplication +# `sort -u` and `uniq` is the same effect. +sort file | uniq + +# show not duplicated lines +sort file | uniq -u + +# show duplicated lines only +sort file | uniq -d + +# count all lines +sort file | uniq -c + +# count not duplicated lines +sort file | uniq -uc + +# count only duplicated lines +sort file | uniq -dc diff --git a/cheat/cheatsheets/unzip b/cheat/cheatsheets/unzip new file mode 100644 index 0000000..6d8a792 --- /dev/null +++ b/cheat/cheatsheets/unzip @@ -0,0 +1,8 @@ +# Extract archive +unzip archive.zip + +# Test integrity of archive +unzip -tq archive.zip + +# List files and directories in a file +unzip -l archive.zip diff --git a/cheat/cheatsheets/vagrant b/cheat/cheatsheets/vagrant new file mode 100644 index 0000000..92f22d2 --- /dev/null +++ b/cheat/cheatsheets/vagrant @@ -0,0 +1,33 @@ +# Initate Vagrant +mkdir vag-vm; cd vag-vm +vagrant init + +# Add a box to vagrant repo +vagrant box add hashicorp/precise32 + +# Add a box Vagrant file +config.vm.box = "hashicorp/precise32" + +# Add vm to public network as host +config.vm.network "public_network" + +# Add provision script to vagrant file +config.vm.provision :shell, path: "provision.sh" + +# Start vm +vagrant up + +# Connect to started instance +vagrant ssh + +# Shutdown vm +vagrant halt + +# Hibernate vm +vagrant suspend + +# Set vm to initial state by cleaning all data +vagrant destroy + +# Restart vm with new provision script +vagran reload --provision diff --git a/cheat/cheatsheets/weechat b/cheat/cheatsheets/weechat new file mode 100644 index 0000000..f001b4c --- /dev/null +++ b/cheat/cheatsheets/weechat @@ -0,0 +1,16 @@ +# Set unread marker on all windows +Ctrl-s Ctrl-u + +# Switch buffer left +Ctrl-p, Alt-left +# Switch buffer right +Ctrl-n, Alt-right +# Next buffer with activity +Alt-a +# Switch buffers +Alt-0...9 + +# Scroll buffer title +F9/F10 +# Scroll nick list +F11/F12 diff --git a/cheat/cheatsheets/wget b/cheat/cheatsheets/wget index fb9a45a..db754a0 100644 --- a/cheat/cheatsheets/wget +++ b/cheat/cheatsheets/wget @@ -2,7 +2,7 @@ wget http://path.to.the/file # To download a file and change its name -wget http://path.to.the/file -o newname +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 @@ -30,3 +30,6 @@ 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 + +# Change the User-Agent to 'User-Agent: toto' +wget -U 'toto' http://google.com diff --git a/cheat/cheatsheets/yum b/cheat/cheatsheets/yum index 8cc52f7..c5eb136 100644 --- a/cheat/cheatsheets/yum +++ b/cheat/cheatsheets/yum @@ -22,6 +22,9 @@ yum info # List currently enabled repositories: yum repolist +# List packages containing a certain keyword: +yum list + # To download the source RPM for a package: yumdownloader --source diff --git a/cheat/cheatsheets/zip b/cheat/cheatsheets/zip new file mode 100644 index 0000000..ad22773 --- /dev/null +++ b/cheat/cheatsheets/zip @@ -0,0 +1,5 @@ +# Create zip file +zip archive.zip file1 directory/ + +# To list, test and extract zip archives, see unzip +cheat unzip diff --git a/cheat/cheatsheets/zoneadm b/cheat/cheatsheets/zoneadm new file mode 100644 index 0000000..0dee119 --- /dev/null +++ b/cheat/cheatsheets/zoneadm @@ -0,0 +1,21 @@ +# Halt zone +zoneadm -z halt + +# Delete Zone +zoneadm -z halt +zoneadm -z uninstall + +# Verify Zone +zoneadm -z verify + +# Installing Zone +zoneadm -z install + +# Boot Zone +zoneadm -z boot + +# Reboot Zone +zoneadm -z reboot + +# List Zones +zoneadm list -cv diff --git a/cheat/sheet.py b/cheat/sheet.py index 1038aef..f2f4e6d 100644 --- a/cheat/sheet.py +++ b/cheat/sheet.py @@ -25,28 +25,16 @@ def create_or_edit(sheet): # 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): + + # if the cheatsheet exists but not in the default_path, copy it to the + # default path before editing + elif exists(sheet) and not exists_in_default_path(sheet): + copy(path(sheet), os.path.join(sheets.default_path(), 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.') + # if it exists and is in the default path, then just open it + else: + edit(sheet) def create(sheet): @@ -75,6 +63,12 @@ def exists(sheet): return sheet in sheets.get() and os.access(path(sheet), os.R_OK) +def exists_in_default_path(sheet): + """ Predicate that returns true if the sheet exists in default_path""" + default_path_sheet = os.path.join(sheets.default_path(), sheet) + return sheet in sheets.get() and os.access(default_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) diff --git a/cheat/sheets.py b/cheat/sheets.py index 8517deb..0192be4 100644 --- a/cheat/sheets.py +++ b/cheat/sheets.py @@ -2,24 +2,11 @@ from cheat import cheatsheets from cheat.utils import * import os -# @kludge: it breaks the functional paradigm to a degree, but declaring this -# var here (versus within get()) gives us a "poor man's" memoization on the -# call to get(). This, in turn, spares us from having to call out to the -# filesystem more than once. -cheats = {} - - def default_path(): """ Returns the full path to the default cheatsheet directory """ - # 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.name != 'nt' and os.geteuid() == 0: - die('Please do not run this application as root.') - # determine the default cheatsheet dir - default_sheets_dir = get_default_data_dir() + default_sheets_dir = os.environ.get('DEFAULT_CHEAT_DIR') or os.path.join(os.path.expanduser('~'), '.cheat') # create the DEFAULT_CHEAT_DIR if it does not exist if not os.path.isdir(default_sheets_dir): @@ -43,11 +30,7 @@ def default_path(): def get(): """ Assembles a dictionary of cheatsheets as name => file-path """ - - # if we've already reached out to the filesystem, just return the result - # from memory - if cheats: - return cheats + cheats = {} # otherwise, scan the filesystem for cheat_dir in reversed(paths()): diff --git a/cheat/utils.py b/cheat/utils.py index f573483..61b421a 100644 --- a/cheat/utils.py +++ b/cheat/utils.py @@ -1,8 +1,7 @@ +from __future__ import print_function import os import sys -from xdg.BaseDirectory import save_data_path - def colorize(sheet_content): """ Colorizes cheatsheet content if so configured """ @@ -49,42 +48,18 @@ def editor(): def prompt_yes_or_no(question): """ Prompts the user with a yes-or-no question """ + # Support Python 2 and 3 input + # Default to Python 2's input() + get_input = raw_input + + # If this is Python 3, use input() + if sys.version_info[:2] >= (3, 0): + get_input = input + print(question) - return raw_input('[y/n] ') == 'y' + return get_input('[y/n] ') == 'y' def warn(message): """ Prints a message to stderr """ - print >> sys.stderr, (message) - - -def get_default_data_dir(): - """ - Returns the full path to the directory containing the users data. - - Which directory is used, is determined the following way: - - 1. If the `DEFAULT_CHEAT_DIR` environment variable is set, use it. - - 2. If a `.cheat` directory exists in the home directory, use it. - - 3. Use a `cheat` directory in the systems default directory for user data. - - """ - user_dir = os.environ.get("DEFAULT_CHEAT_DIR") - if not user_dir: - user_dir = os.path.expanduser(os.path.join("~", ".cheat")) - if not os.path.exists(user_dir): - user_dir = get_userdata_dir() - return user_dir - - -def get_userdata_dir(): - """ - Returns the full path to a `cheat` directory in the platform specific - default data directory for the current user. - - .. note:: The directory is created, if it's not already present. - - """ - return save_data_path('cheat') + print((message), file=sys.stderr) diff --git a/requirements.txt b/requirements.txt index 296f54a..01f42b9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,2 @@ docopt>=0.6.2 Pygments>=1.6 -pyxdg>=0.25 diff --git a/setup.py b/setup.py index 037cd87..727c671 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ import os setup( name = 'cheat', - version = '2.0.7', + version = '2.1.19', author = 'Chris Lane', author_email = 'chris@chris-allen-lane.com', license = 'GPL3', @@ -24,6 +24,5 @@ setup( install_requires = [ 'docopt >= 0.6.1', 'pygments >= 1.6.0', - 'pyxdg >= 0.25' ] )