# cheat_sheet.org.sh
# (C) William Hackmore, 2010
# The contents of this file are released under the GNU General Public
# License. Feel free to reuse the contents of this work,
# as long as the resultant works give proper attribution and are made
# publicly available under the GNU General Public License.
# Best viewed in emacs org-mode.
# # https://github.com/WilliamHackmore/linuxgems/blob/master/cheat_sheet.org.sh
# 蔡由世神父翻譯 (2013/03/09)

* 參考︰
** 基本︰
*** 求救︰

# 檢視目標指令的手冊
man 指令

# 取目標指令說明 (很可能跟上面是一樣,但不一定)︰
指令 -h

# 萬一您忘記指令名稱,列印所有可能的指令有關 guess 指令︰
apropos guess

# 檢視說明頁的索引︰
info

*** 指令列工具︰
**** 基本檔案和目錄操作︰
# 列印目前的工作目錄︰
pwd

# 顯示在目前目錄的檔案︰
ls

# 顯示所有檔案,包含隱藏,的全部資訊︰
ls -a

# 遞迴到子目錄,並且也顯示子目錄裡的檔案︰
ls -R

# 移動/更名 檔案或目錄 (小心您沒有把來源移動到同樣名稱的目的檔案或目錄)︰
mv 來源 目的

# 永遠刪除目標 (要特別小),使用 -r 遞迴旗號刪除目錄︰
rm 目標

# 複製檔案或目錄︰
cp 來源 目的

# 掛檔案系統︰
mount /dev/裝置名稱 /media/裝置名稱

# 卸下︰
umount /media/裝置名稱

# 克隆檔案系統和其他對檔案的低級操作。要小心使用這個。破壞的可能性很高:
dd

# 操作檔案系統和磁碟分割。 (比較容易操作,但仍然很危險)︰
fdisk

**** 系統管理︰

# 以管理員身份執行指令。(是破壞性的/不安全。只用於系統管理操作)︰
sudo 指令

# 成為管理員︰
sudo -s

# 退出系統管理︰
exit

***** 安裝 .tgz 軟體 (也被稱為 tarball)︰

# 先解壓 tarball (參考下面有關 tar)
# 然後到解壓的目錄︰
cd 軟體目錄

# 如有提共的話,務必先閱讀 README 檔案,萬一有任何必須修改的地方︰
cat README

# 自動檢查而設置適當的配置,並且在目錄裡生成一個 MAKE 檔案︰
./configure

# 編譯軟體。也許需要 sudo︰
make

# 將檔案移動到適當的位置。可能也需要 sudo︰
make install

# 清理目錄裡的檔案萬一 make 指令失敗或者刪除不需要的檔案︰
make clean

***** Ubuntu/Debian 軟體資源庫︰

# 檢查發行版的軟體更新庫︰
sudo apt-get update

# 下載而安裝更新︰
sudo apt-get upgrade

# 在儲存庫中搜尋封裝軟體︰
apt-cache search 關鍵詞

# 檢視一個特定的包更多的細節︰
apt-cache show 封裝名稱

# 下載並安裝一個封裝︰
sudo apt-get install 封裝名稱


***** Redhat/Fedora 軟體資源庫︰
***** 新增: 2013/03/09: 蔡由世神父

# 檢查發行版的軟體更新庫︰
yum check-update

# 下載而安裝更新︰
yum update

# 在儲存庫中搜尋封裝軟體︰
yum search 封裝名稱

# 檢視一個特定的包更多的細節︰
yum info 封裝名稱

# 下載並安裝一個封裝︰
yum install 封裝名稱




# 使用更方便的格式檢視一個指令的輸出︰
指令 | less

**** 檔案操作︰

# 在終端機顯示檔案之內榮︰
cat 檔案

# 搜尋匹配檔案名稱的檔案︰
locate 檔案名稱

# 搜索檔案匹配的子句︰
grep 子句 檔案名稱

# 在一個指令的輸出中搜索字句︰
指令 | grep 子句

**** 程序操作︰

# 顯示所有正在執行的程序:
ps -e

# 標準系統監視器顯示所有程序和系統資源:
top

# 跟 top 一樣,但有一個更好,更乾淨的界面:
htop

# 停止使用所有系統資源而使電腦反應遲鈍的程序︰
renice 程序名稱

# 殺掉有異常的程序(不得已時才使用,先使用 'renice' 指令):
pkill 程序名稱

# 在背景執行一個程式
指令 &

# 在背景執行一個程式但你登出之後程式仍然繼續執行
nohup 指令 &

**** 壓縮和加密:

# 簡單的備份檔案或目錄︰
tar -cvzf 備份檔案名稱.tgz 目標檔案或目錄名稱

# 解壓一個 .tgz 或 .tar.gz 檔案︰
tar -xvf 檔案名稱.tgz

# 加密一個檔案︰
gpg -o 加密的檔案名稱.gpg -c 要加密的檔案

# 解密一個檔案︰
gpg -o 解密檔案名稱 -d 要解密的檔案.gpg

# 同時壓縮和加密目錄:
gpg-zip -o 加密的檔案名稱.tgz.gpg -c -s 要加密的檔案

*** The Bash shell:
**** 檔案名稱擴展:
# 目前使用者家目錄︰
~/

# 目前目錄︰
./

# 父目錄︰
../

# 甚至 (祖父,父目錄︰
../../

# 在目錄裡所有檔案。(要特別小心。)︰
/*

**** 輸出導向︰

# 一個指令的輸出使用管道導向到另一個指令為輸入︰
指令一 | 指令二

# 甚至︰

指令一 | 指令二 | 指令三

# 導向輸出到檔案︰
指令 > 檔案

# 或者︰

檔案 > 檔案

# 甚至導向到不同的方向︰:
檔案 < 檔案

# 將輸出附加到,而不是覆蓋,目標檔案:

檔案或指令 >> 檔案

# 與 | 像似但輸出是寫到目標檔案和終端機︰
tee 目標

# 導向標準輸出和錯誤訊息到 /dev/null,就等於刪除。
指令 > /dev/null 2>&1

**** 控制執行指令之順序︰
# 等指令一執行完畢後,才執行指令二
指令一 ; 指令二

# 甚至︰
指令一 ; 指令二 ; 指令三

# && 只執行指令二當指令一執行成功。
指令一 && 指令二

# || 之動作像似 && 但是只執行指令二當指令一執行失敗。
指令一 || 指令二

**** Bash 萬用字元︰
# 零個或多個字元︰
*

# 匹配 "字句" 和所有尾隨字元:
字句*

# 匹配 "字句" 和任何尾隨或前導字元::
*字句*

# 匹配任何一個字元︰
?

# 匹配任何中括號內列出的字元:
[多個字元]

# 匹配字元範圍在 a-z 之間的字元:
[a-z]

** 進階︰
*** 指令列工具(續):
**** 網路︰

# 設定網路界面︰
ifconfig

# 設定無線網路界面︰:
iwconfig

# 連接到遠程伺服器。
ssh 帳號名稱@ip地址

# 將 X 從目標機器轉到目前的機器(獲取遠程桌面。很多人不知道的,但非常有用的):
ssh -X 帳號名稱@ip地址

# 通過網路複製檔案︰
scp 來源檔案:帳號名稱@ip地址 目的檔案:目的帳號名稱@目的ip地址

# 僅複製兩個檔案或目錄之間的更改 (超級有效的方法來同步目錄,可以局部使用或
# 跟遠程伺服器使用。這與 ssh 像似,使用 帳號名稱@ip地址:可選連接埠):
rsync 來源 目的

# 檢查是否目標有連線和有反應
ping ip地址

# 檢視網路路經到目的︰
traceroute6 ip地址
# 新增: 2013/03/16: 蔡由世神父 : 為 IPv4
traceroute ip地址

# 網路監視器
netstat

# 管理表準 Linux 防火牆 (為進階使用者使用)
iptables

# 掃描本機,檢查開啟的連接埠:
nmap 127.0.0.1

***** netcat:

# 從網路接收連結埠監聽輸入,轉儲到一個檔案(不安全,但很方便):
netcat -l 接收連結埠 > 檔案

# 將一個指令之輸出導管,通過網路,到一個目的 ip 和連結埠︰
指令 | netcat -w 超時秒數 目的ip 目的連接埠

# 使用 tar 壓縮檔案然後當輸出流,通過網路,導管到目的 ip 和連接埠:
sudo tar -czf - 檔案名稱 | netcat -w 超時秒數 目的ip 目的連結埠

**** 使用者和群組︰
# 更改一個檔案或目錄的所有者:
chown 使用者名稱:群組名稱 目錄名稱

# 更改檔案或目錄的權限(請參閱 man。)
chmod

# 建新使用者︰
adduser

# 更改使用者權限(這個必須非常小心):
usermod

# 刪除使用者
deluser

# 顯示群組︰
groups

# 建新的群組︰
groupadd

# 更改群組權限︰
groupmod

# 刪除群組︰
delgroup

# 暫時成為一個不同的使用者:
su 使用者名稱

# 顯示登入的使用者︰
users

# 從終端機寫一列信息到另一個使用者:
talk

# 互動談話程式。使用終端機與其它使用者談話 (必須從軟體資源庫安裝。)︰):
ytalk

**** 操作檔案,續︰
# 檢視哪一些程序在使用哪一些檔案︰
lsof

# 檢視兩個檔案之間的差異︰
diff 檔案一 檔案二

# 顯示檔案內容從最上面幾列︰
head -n 列數 檔案

# 像 head,但顯示檔案內容最下面幾列︰
tail -n 列數 檔案

# 校驗和檔案:
md5sum 檔案

# 校驗和每一個目錄中的檔案(從資源厙安裝。):
md5deep 目錄

# 校驗和一個檔案(更好的演算法而沒有雜湊碰撞):
sha1sum

# 與 md5deep 一樣的運算,但使用 SHA1:
sha1deep

# 每隔幾秒調用指令,並顯示輸出:
watch -n 秒數 指令

# 執行指令後,顯示指令花多少時間完成:
time 指令

# 檢視目錄中的檔案從最大到最小:
du -a 目錄 | sort -n -r | less

# 在目前目錄裡的檔案名稱刪除空格:
rename -n 's/[\s]/''/g' *

# 在目前目錄裡的檔案名稱將大寫改為小寫:
rename 'y/A-Z/a-z/' *

***** 環境和硬體:
# 顯示完整的日期和時間:
date

# 顯示本機的主機名稱:
echo $HOSTNAME

# 顯示目前的 Linux 發行版的信息:
lsb_release -a

# 顯示 Linux 核心版本:
uname -a

# 顯示核心模組的信息:
lsmod

# 配置核心模組(從來沒有這樣做過):
modprobe

# 檢視已安裝的封包︰
dpkg --get-selections

# 檢視已安裝的封包︰(Red Hat/Fedora):
# 新增︰ 2013/03/15︰蔡由世神父
rpm -qa

# 顯示環境變數值:
printenv

# 列出連接到 PCI 埠的硬體:
lspci

# 列出連接到 USB 埠的硬體:
lsusb

# 顯示存儲在 BIOS 的硬件信息:
sudo dmidecode

# 顯示從無線網卡所捕獲的資料:
dumpcap

# 顯示鍵盤驅動程式的信息:
dumpkeys

***** Ubuntu 系統管理,進階(續):

# 從 Ubuntu 的 Launchpad 添加個人軟體包存檔:
add-apt-repository

# 使用指令列安裝一個 .deb 檔案:
sudo dpkg -i 檔案.deb

# 使用指令列安裝一個 .rpm 檔案︰
# 新增︰2013/03/09︰ 蔡由世神父
yum install 檔案.rpm

**** Python:

# 更新 pip (Python 套件管理程式)︰
pip install -U pip

# 在 pip 軟體資源庫搜尋一個程式庫:
pip search 程式庫名稱

# 建一個虛擬 python 環境,允許同一個 Python 模組,但不同反本,可以同時安裝:
virtualenv 目錄名稱 --no-site-packages

# 連接到一個 python 虛擬環境
source dirname/bin/activate

# 離開 python 虛擬環境:
deactivate

# 從外部虛擬 python 環境安裝包:
pip install 包名稱==版本號碼 -E 目錄名稱

# 匯出 Python 虛擬環境到一個可共享的格式:
pip freeze -E 目路名稱 > requirements.txt

# 從 requirements.txt 檔案匯入 Python 虛擬環境:
pip install -E 目錄名稱 -r requirements.txt

**** git (所有的指令必須執行在同一的目錄 .git 的檔案夾裡):

# 開始一個新的 git 專案:
git init

git config user.name "user_name"

git config user.email "email"

# 克隆 git (目標可以在局部或遠程通過任何協議):
git clone target

# 將更改提交到 git:
git commit -m "message"

# 從目前的軟體資源庫獲取信息:
git status

# 顯示目前軟體資源庫更改的日誌:
git log

# 從另一個軟體資源庫更新 git 目錄:
git pull [目標]

# 將分支推到其它資源庫:
git push [目標]

# 建一個新的分支:
git branch [分支名稱]

# 切換到目的分支:
git checkout [分支名稱]

# 刪除一個分支︰
git branch -d [分支名稱]

# 合併兩個分支:
git merge [分支名稱] [分支名稱]

# 顯示專案的所有分支︰
git show-branch

*** 虛擬化︰

# 克隆虛擬機(這沒有問題,我已測試):
vboxmanage clonehd virtual_machine_name.vdi --format VDI ~/target_virtual_machine_name.vdi

# 掛一個共享的虛擬檔案夾︰
# 你需要確保你有正確的核心模組。您可以使用 modprobe,但這個包運作在 Ubuntu 特定的方式。
sudo apt-get install virtualbox-ose-guest-utils

sudo mount -t vboxsf name_of_shared_folder_specified_in_Virtualbox path_of_mountpoint

*** mysql:

# 得到幫助:
help

# 顯示資料庫︰
show databases;

# 選擇使用一個資料庫︰
use 資料庫名稱;

# 顯示資料庫模式:
show tables;

# 刪除資料庫︰
DROP DATABASE 資料庫名稱;

# 建新的資料庫︰
CREATE DATABASE 資料庫名稱;

# 建新的使用者︰
CREATE USER 使用者名稱@localhost IDENTIFIED BY '密碼';

# 顯示使用者︰
select * from mysql.user;

# 刪除使用者︰
delete from mysql.user WHERE User='使用者名稱';

# 給使用者權限存取所有表(使他變成超級使用者)。“%” 指,他們可以從遠程, 從任何一台機器,不只是局部主機登錄。:
grant all privileges on *.* to 使用者名稱@"%" identified by '密碼';

# 給一個使用者對一個資料庫一些權限︰
grant select,insert,update,delete,create,drop on 資料庫名稱.* to 使用者名稱@"%" identified by '密碼';

# 告訴 mysql 使用新的使用者權限政策::
flush privileges;

# 更改使用者密碼︰
use mysql;

update user set password='密碼'('新密碼') where User='使用者名稱';

# mysql 指令列參數︰
# 匯出資料庫到傾倒檔案︰
mysqldump 資料庫名稱 > 傾倒檔案名稱.txt

# 從傾倒檔案復原︰
mysql -u 使用者名稱 -p < 傾倒檔案名稱.txt

# 傾倒全部資料庫︰
mysqldump -u 使用者名稱 -p --opt 資料庫名稱 > 傾倒檔案名稱.sql

# 從傾倒檔案恢復全部資料庫︰
mysql -u 使用者名稱 -p --database=資料庫名稱 < 傾倒檔案名稱.sql