2011年7月19日 星期二

25個SSH Commands的使用技巧

在StumbleUpob上閒晃,發現了一個有趣的網站,他介紹了25個使用ssh的技巧,真的很令我驚訝,沒想到ssh居然可以這麼用?!



1) 複製ssh keys到user@host來啟用免密碼的認証

ssh-copy-id user@host

要產生keys請用ssh-keygen

2) 利用ssh的通訊協定來開啟網頁

ssh -N -L2001:localhost:80 somemachine

如果該網站的22 port有開,且你有帳密,你可以透過ssh加密的方式瀏覽該網站,透過http://localhost:2001/的方式來連接

3) 讓麥克風輸出到遠端的喇叭上

dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

這個方法是用ssh的方式把聲音傳遞過去,不過音質很差

4) 比較遠端跟本地的檔案

ssh user@host cat /path/to/remotefile | diff /path/to/localfile -

可以用來比對檔案有何不同

5) 透過SSH來Mount資料夾/檔案系統

sshfs name@server:/path/to/folder /path/to/mount/point

先到這裡安裝SSHFS,就可以透過加密的網路來遠端mount資料夾了

6) 透過SSH來連線到無法到達的網段

ssh -t reachable_host ssh unreachable_host

通常內網是無法直接連線的,不過要是有一台對外的機器可以當跳板機,就可以透過這個方法來連線到內網的機器了

7) 透過本機電腦上從host1複製檔案到host2

ssh root@host1 "cd /somedir/tocopy/ && tar -cf - ." | ssh root@host2 "cd /samedir/tocopyto/ && tar -xf -"

如果你可以連線到host1和host2,但是host1和host2卻彼此不通,那你就可以用這個方法,讓自己的電腦當成跳板,來讓這兩台電腦來互相傳遞檔案

8) 將遠端的GUI程式在本地執行

ssh -fX <user>@<host> <program>

可以透過這個指令,讓遠端電腦的GUI程式在本地端執行

9) 建立一個持續連接的ssh

ssh -MNf <user>@<host>

建立一個在背景連接的ssh,個人的ssh設定(~/.ssh/config)也需要做以下的設定:

Host host

ControlPath ~/.ssh/master-%r@%h:%p

ControlMaster no

所有到目的主機的連線都會走這條SSH的連線,如果有用 rsync/sftp/cvs/svn這將會很有幫助,因為這樣就不會在每次要連接時都要重新產生一個新的socket

10) 直接開ssh而不再開一個bash

ssh -t remote_host screen -r

原本開ssh會再開一個bash,而這個指令會把他關掉,而直接開啟ssh連接

11)查port是否開啟

knock <host> 3000 4000 5000 && ssh -p <port> user@host && knock <host> 5000 4000 3000

利用knock和ssh來查看該port是否有開啟,你必須安裝knock才能使用,相關的配置如下

[options]

logfile = /var/log/knockd.log

[openSSH]

sequence = 3000,4000,5000

seq_timeout = 5

command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT

tcpflags = syn

[closeSSH]

sequence = 5000,4000,3000

seq_timeout = 5

command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT

tcpflags = syn

12) 刪除某一行ssh key

ssh-keygen -R <the_offending_host>

有時候可能因為某些狀況(SERVER 重灌)導致ssh key有改變,可以用這個方式把key給刪掉重建

13) 透過ssh執行複雜的指令

ssh host -l user $(<cmt.txt)

上述的方法與下面的方法是一樣的,只是上面的方法較為簡潔

ssh host -l user "`cat cmd.txt`"

14) 透過SSH把MySQL的Database複製到新的Server上
mysqldump --add-drop-table --extended-insert --force --log-error=error.log -uUSER -pPASS OLD_DB_NAME | ssh -C user@newhost "mysql -uUSER -pPASS NEW_DB_NAME"

把MySQL的Database Dump到新的Server上,並且使用SSH的加密通道

15) 刪除known_hosts的內文
sed -i 8d ~/.ssh/known_hosts

16) 如果沒有ssh-copy-id指令,複製ssh public key到server的方法
cat ~/.ssh/id_rsa.pub | ssh user@machine "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

如果你用Mac OS X或者其他*nix沒有ssh-copy-id這個指令,可以用上面這個指令來新增authorized_keys到servers

17) 測試ssh的實際連線速率

yes | pv | ssh $host "cat > /dev/null"

請先安裝pv
Debian: 'apt-get install pv'
Fedora: 'yum install pv'
透過ssh連線到主機,並將data導到null,可用來測試連線的速率

18) 建立一個可以重新連接的遠端Gnu scree

ssh -t user@some.domain.com /usr/bin/screen -xRR

這是個有點有趣的小技巧,你可以透過"ctrl-a c"來開啟一個新的SSH連線視窗,然後透過"ctrl-a a"來切換前後兩個不同的ssh連線,然後透過"ctrl-a d"來斷開目前這個SSH的連線,這應該是在你用console連線ssh的時候比較用得到的技巧,畢竟6個console如果都拿來連不同的ssh,那如果要用到第七個怎麼辦?只好利用這個技巧來讓在一個console裡可以再開多個ssh,並且可以利用熱鍵來進行切換,關於screen的使用可以參考這個網址http://aperiodic.net/screen/quick_reference

19) 續傳SCP傳遞大檔案
rsync --partial --progress --rsh=ssh $file_source $user@$host:$destination_file

這個指令可以透過rsync續傳,你必須在兩邊的主機上都裝上rsync

rsync --partial --progress --rsh=ssh $file_source $user@$host:$destination_file local -> remote
or
rsync --partial --progress --rsh=ssh $user@$host:$remote_file $destination_file remote -> local

20) 透過ssh w/ wireshark來分析封包
ssh root@server.com 'tshark -f "port !22" -w -' | wireshark -k -i -
利用tshark或者tcpdump來捕捉遠端SERVER上的封包
ssh root@example.com tcpdump -w -- 'port !22' | wireshark -k -i -

21) 保持ssh session永遠開啟
autossh -M50000 -t server.example.com 'screen -raAd mysession'

如果你的notebook在移動中可能會在不同的熱點中切換,可以使用這個指令,讓session不會中斷

22) 更穩更快的更強的SSH clients

ssh -4 -C -c blowfish-cbc

強制使用IPv4、封包壓縮、以及使用blowfish加密

23) 使用cstream控制頻寬
tar -cj /backup | cstream -t 777k | ssh host 'tar -xj -C /backup'

使用bzip壓縮格式,並用777k bit/s的速度傳輸,關於cstream的用法可以參考這裡 http://www.cons.org/cracauer/cstream.html#usage

24) 一個步驟傳送SSH public key 到其他伺服器
ssh-keygen; ssh-copy-id user@host; ssh user@host

這個指令會蓋掉你本地端原本已經產生的key,並在遠端產生新的key

25) 複製 stdin 到你的X11 buffer
ssh user@host cat /path/to/some/file | xclip
把遠端的檔案cat出來,然後直接進到記憶體中,接下來你只要按下滑鼠的中鍵貼上就OK了!



參考來源: 25 Best SSH Commands / Tricks - StumbleUpon