Java世界

          學習筆記

          常用鏈接

          統計

          積分與排名

          天籟村

          新華網

          雅虎

          最新評論

          PuTTY 中文教程(轉載)

          PuTTY 中文教程

          作者:柴鋒?? 2006年11月
          Web:http://www.chaifeng.com
          email: putty-tutorial [0x40] chaifeng [0x2E] com
          Links:
          http://docs.google.com/View?docid=ajbgz6fp3pjh_2dwwwwt

          更新記錄

          • 2006-11-29
            初步完成想寫的這些東西
          • 2007-06-11
            PuTTY 的最新版本到了0.6;修改了一下 SSH 隧道;添加了 SSH 反向隧道;添加了用 SSH 做代理服務器;

          版權聲明

          This document is licensed under a Creative Commons License.


          Creative Commons Deed 署名 2.5
          Creative Commons Attribution 2.5


          您可自由:

          • 復制、發行、展覽、表演、放映、廣播或通過信息網絡傳播本作品
          • 創作演繹作品
          • 對本作品進行商業性使用


          惟須遵守下列條件:
          署名. 您必須按照作者或者許可人指定的方式對作品進行署名。

          • 對任何再使用或者發行,您都必須向他人清楚地展示本作品使用的許可協議條款。
          • 如果得到著作權人的許可,您可以不受任何這些條件的限制。

          您的合理使用以及其他權利不受上述規定的影響。

          這是一份普通人可以理解的法律文本(許可協議全文) 的概要。
          免責聲明


          序言

          懶,是一個優點,有些時候還是要學一學才能會了的。

          ?????????????????????????????????????????????????? —— 柴鋒(1979-?????? )??

          我的這些文字是從這幾年來的 PuTTY 使用經驗中慢慢得來的,也不僅僅是介紹 PuTTY,還包括了一些相關的軟件,比如:優秀的 FTP 工具 FileZilla、功能強大的 SFTP 客戶端 WinSCP。

          雜七雜八的亂說了一些,這里把大致內容羅列如下:

          • 最簡單的使用,登錄 SSH 主機
          • 中文亂碼的處理
          • PuTTY 常用配置的說明
            • 復制、粘貼
            • 保存會話
            • 注銷
            • 自動登錄用戶名
            • 自動設置環境變量
            • 設置代理服務器
            • 自動執行命令
            • 備份、刪除 PuTTY 的設置
          • PuTTY 的 X11 轉發
          • 如何用 PuTTY 建立 SSH 隧道
          • 如何用 PuTTY 建立反向的 SSH 隧道,像個特洛伊木馬一樣突破防火墻
          • 把 PuTTY 作為一個安全的代理服務器
            • 安全的上網不被嗅探
            • 避免 MSN 等聊天工具被監聽
          • 怎樣用 PSCP、PSFTP 安全的傳輸文件
            • 功能強大的 SFTP 客戶端 WinSCP
          • 用 PuTTYgen 生成密鑰,登錄 SSH 主機不再需要口令
          • Pagent 代理密鑰,每次開機只需要輸入一次密鑰口令
          • Plink 簡單而又迅速的執行 SSH 主機上的程序
          • 常見問題
          除了上面的這些,還夾雜了一些 PuTTY 使用上的技巧、服務器配置的一些安全建議。說起來這是一些有關 PuTTY 的使用教程,其實也就是 SSH 的參考教程,絕大多數的內容在其他系統或軟件上也都是一樣的。不同的是參數、配置、命令行之類的,只要會了一個,其他也就觸類旁通了。

          一些基本知識

          如果你已經知道 SSH、Telnet、Rlogin 這是什么,就跳過這一部分,看下面的吧。

          (以后補充,暫時空下)


          簡介

          PuTTY 的官方網站:http://www.chiark.greenend.org.uk/~sgtatham/putty/,截止到 2006年11月,發布的最高穩定版本是 0.58 2007年6月,發布的最高穩定版本是 0.6。

          PuTTY 是一個跨平臺的遠程登錄工具,包含了一組程序,包括:
          • PuTTY (Telnet 和 SSH 客戶端)
          • PSCP (SCP 客戶端, 命令行下通過 SSH 拷貝文件,類似于 Unix/Linux 下的 scp 命令)
          • PSFTP (SFTP 的命令行客戶端,類似于 FTP 的文件傳輸,只不過使用的是 SSH 的 22 端口,而非 FTP 的 21 端口,類似于 Unix/Linux 下的 sftp 命令)
          • PuTTYtel (僅僅是一個 Telnet 客戶端)
          • Plink (命令行工具,執行遠程服務器上的命令)
          • Pageant (PuTTY、PSCP、Plink 的 SSH 認證代理,用這個可以不用每次都輸入口令了)
          • PuTTYgen (用來生成 RSA 和 DSA 密鑰的工具).
          雖然包含了這么多,但平時經常見到只是用 PuTTY 登錄服務器,完全沒有發揮出 PuTTY 的強大功能。
          PuTTY 作為一個組件也存在于很多的軟件中,比如 FileZilla、WinSCP
          在后面的文字中,如非特別說明,默認的登錄的協議是 SSH。畢竟用 PuTTY 主要就是登錄 SSH 主機,用 Telnet、RLogin 沒法體現出 PuTTY 的強大功能。

          安裝

          下載頁面在這里:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
          PuTTY 需要安裝么?需要么?需要么?真的需要么?不需要。PuTTY 是一個準綠色軟件,說它綠色是因為直接就能使用,完全沒有任何的安裝程序。準綠色是指 PuTTY 的所有配置都保存到了注冊表,如果不記得備份注冊表中的相關內容,下次重裝機器所有配置就沒了,而且配置也不方便用閃存盤隨身攜帶。但是 PuTTY 的配置刪除還是蠻方便的,運行時指定個參數 -cleanup 就可以清除 PuTTY 的所有配置信息。

          第一印象,開始登錄一臺遠程主機

          運行 PuTTY 就可以看到下面這個界面

          在這里輸入服務器的 IP 或主機名,選擇好登錄協議,還有協議的端口,如果希望把這次的輸入保存起來,以后就不需要再重新輸入了,就在第4步輸入好會話保存的名稱,比如:mail-server,或者干脆就是主機的地址,點擊保存就可以了。

          最后點下面的 Open 按鈕,輸入正確的用戶名和口令,就可以登錄服務器了。

          首次登錄一臺主機時

          第一次登錄時,會看到這個對話框

          這是要告訴你登錄的主機密鑰指紋,點 Yes 就保存起來,以后就不會再彈出這個窗口,然后就正常登錄。點 No 不保存,下次還是要提示你,然后也可以正常登錄。如果一臺主機我們只是臨時登錄一下,當然就是點 No 了。Cancel 就是取消,也就是取消了這次登錄。
          如果你曾經登錄過這臺主機,但是又彈出來這個對話框,可能有以下幾種情形:
          • 主機重新安裝了操作系統
          • 這臺主機可能有多個IP,這次用的是另外一個 IP
          • 有其他不懷好意的主機來冒充,誘騙我們登錄,竊取隱秘信息
          前兩個情形很常見,一般點 Yes 就行了。后面這個嘛……唔……唔……,點 No/Cancel,再去詢問相關的主機管理人員。

          又看到了中文亂碼

          成功登錄主機后,輸入命令,這……這……顯示,又是亂碼。唉,中文亂碼是一個老生常談的問題,提起來就頭大。原因嘛,不外乎字符集、終端編碼之類的,還是可以解決的。

          PuTTY 的默認字體和字符集并不適合中文顯示, 在窗口標題上點擊右鍵,選擇 Change Settings...

          在打開的配置窗口左邊選擇 Appearance,在右邊點 Font settings 里面的 Change 按鈕,選擇好中文字體,比如:宋體、新宋體之類的

          字體選擇好了,還要確定字符集。
          選 擇配置窗口左邊的 Translation,在右邊的 Received data assumed to be in which character set 下拉列表中選擇最后一個“Use font encoding”,最后點下面的 Apply 按鈕就生效了。

          重新執行命令 ls -l,就可以正常看到中文了

          怎么還是亂碼?

          如果還是亂碼的話,就執行以下命令,看看系統的字符集
          echo $LANG $LANGUAGE

          哦, 原來系統的字符集是 UTF-8 呀。重新返回上面選擇字符集的那一步, 選擇配置窗口左邊的 Translation,在右邊的 Received data assumed to be in which character set 下拉列表中選擇“UTF-8”

          這下99%的情形下,漢字是不會有亂碼了。最后,總之一下 PuTTY 中亂碼的解決辦法:
          先看看系統的字符集,如果是 UTF-8 的,那就簡單了,選擇好中文字體,然后編碼選擇 UTF-8 就行了。
          如果編碼是 GB2312、GBK、GB18030,當然也包括 BIG5這些,在 PuTTY 的編碼選擇中看不到這些編碼,那就選擇最后一個“Use font encoding”,絕大部分情況下這樣就沒啥問題了,反正我是沒碰到有什么例外的情況。
          現 在的 Linux 如果默認語言選擇為中文,默認的編碼就是 UTF-8 了。以前安裝 Redhat AS 3 時,語言選擇為中文,默認的編碼是 zh_CN.gb2312, zh_CN.gb18030,好像從 AS 3 update 6 開始,包括現在的 AS4、AS5,中文的默認編碼都成了 zh_CN.utf8。至于 Debian、Ubuntu 等等這些上面,好像一直都是 UTF-8。
          至于是使用 UTF-8呢,還是用 GB2312、GBK 或者 GB18030呢?我個人還是傾向于 UTF-8。畢竟我們使用的大多數軟件都是國外的,處理中文編碼多多少少有些問題,PuTTY 自然也不例外。
          下面的這個圖上,我把終端編碼修改為 zh_CN.utf8,然后也按照前面的所說的方法把 PuTTY 的字符集修改為 UTF-8。然后在終端中輸入漢字“柴鋒”,按左方向鍵,可以看到漢字顯示很正常。

          我重新把終端的編碼修改為 zh_CN.gb2312,同樣的,把 PuTTY 的字符集修改為最后一個“Use font encoding”。還是在終端上輸入漢字“柴鋒”,按下左方向鍵以后,會看到漢字亂碼了。

          至 于用哪個編碼,主要還是看領導的決定了,我們的領導就喜歡 GBK,連 GB18030 都不行。以前在用 Debian 的時候,好像默認都不支持 GBK 編碼。這幾年公司的開發在漢字編碼問題上出過幾次麻煩,還不就是在 ISO8859-1, GB2312/GBK/GB18030和UTF-8上折騰來折騰去。
          給大家看一張 emacs 的截圖,看看上面的這么多語言的文字共同顯示,這個會是用 GB2312/GBK/GB18030 的編碼么?

          用 UTF-8 也不是為了要在一個屏幕上顯示好幾種不認識的文字,也不一定非要是跟國際接軌弄個外包給老外開發程序做個其他語言的界面讓老外用,起碼不要在那么多編碼里折騰了,頂多兩個 ISO8859-1 和 UTF-8。發發牢騷,下面繼續……

          在 PuTTY 里面怎樣選中,復制和粘貼?

          在 PuTTY 的窗口里面復制、粘貼可不能用 Windows 里的這些 Ctrl+C, Ctrl+Ins, Ctrl+V 這些快捷鍵,Ctrl+C 在控制臺上可是終止當前的命令執行。
          PuTTY 的選擇、復制、粘貼這些操作都是通過鼠標來完成的。
          在 Window-〉Selection 這里可以設置復制和粘貼的方式。

          默 認的 Action of mouse buttons (鼠標按鍵的功能)的選項是 Compromise,這種方式下選中有兩種方式,一是直接用鼠標左鍵拖拉選中就可以了,二是用鼠標中鍵單擊選中區域的開頭,用滾動條拖拉到期望選中區域 的末尾,再用鼠標中鍵單擊,就可以選中了。
          選中以后,單擊鼠標左鍵就把選中部分復制到剪貼板了。粘貼也很簡單,單擊鼠標右鍵。
          Action of mouse buttons 的第一個選項是 Windows (Windows 方式的),鼠標中鍵的操作跟前面提到的一樣。右鍵不是粘貼了,而是打開了右鍵菜單。

          其實這個右鍵菜單在標題欄上點擊,也都可以看得到。

          第三個選項是 xterm (xterm 方式),這個跟默認的 Compromise 方式相反的,中鍵和右鍵的操作調換了一下,就不多說了。
          下 面那個 Shift overrides application's use of mouse 是和 Shift 鍵有關的。有些 Rogue Like 的程序,比如 mc、links、Lynx、VIM 等等,都支持鼠標操作,想在用鼠標在上面選擇或粘貼就不行了。這個選項默認是選中的,在支持鼠標操作的 Rogue Like 界面下,按住 Shift 鍵,就可以像前面的那樣用鼠標來選擇、復制、粘貼了。
          看下面的這個圖片,用 Links 打開了 Google 的首頁,用鼠標去選中 頂部中間的 Google,我們會發現,彈出了保存的對話框。

          按住 Shift 鍵重新操作一次,哈哈,這次選中了。

          在 Control use of mouse 里面還有個 Default selection mode (默認的選擇模式),默認是 Normal,就像文字處理工具里這樣的選擇

          另外一個是 Rectangular block(塊選擇方式),至于用哪種方式就看自己的選擇了。


          實時保存會話

          這次更改配置參數了,關閉窗口后,下次使用還是要重新選擇的,麻煩。
          還是回到上面修改配置的哪個地方,選擇左邊的 Session,在右邊選擇要覆蓋的會話名稱,或者重新輸入一個新的名稱,點擊 Save 按鈕保存。

          關于注銷登錄的一些事情

          成功登錄主機后,也能正常看到中文了。這樣,我們就可以完成大部分的工作。最后要關閉窗口了,該怎么辦呢?我見過很多人,包括我們公司負責專職維護的同事,都是直接點擊窗口上的關閉按鈕,完全沒有理會彈出警告窗口,直接點擊了 Yes。

          這樣做是不對的,首先這不是正確的注銷方式,應該輸入命令 exit 來正常注銷; 其次直接關閉窗口后,你的登錄其實還在服務器上,如果一連多次的這樣強制關閉窗口,用命令 w 或者 who 命令查看時,可以看到很多的用戶還在系統上登錄,占用了系統的資源。最重要的是,你的這次登錄可能只是為了啟動一下 WebLogic 或者其他什么應用服務器,直接關閉窗口后,可能會導致你的業務在隨后的幾分鐘內也被終止,這應該不是你所希望看到的吧。
          如果上述的理由是每次要輸入 exit 然后回車,比較麻煩。你可以用快捷鍵 Ctrl+d 來注銷登錄,一般情況下,快捷鍵一按窗口都直接關閉了,還省了兩次鼠標點擊。
          在前面說道保存會話時,大家或許也注意到,下面有個 Close window on exit 有三個選項:
          • Always (不管怎樣,窗口總是要關閉的)
          • Never (無論是否有程序還在運行,都不要關閉窗口)
          • Only on clear exit (這個是默認選中的,只有在本次登錄中運行的程序都正常終止或者在后臺運行,窗口才關閉)
          有的程序在執行時,雖然在命令最后面加上 “&”就能放到后臺運行。但是正常注銷登錄后,窗口沒有被自動關閉,還能看到程序的輸出,這時強制關閉窗口還是可以的。為了避免這種情形,可以使用 nohup 命令。
          用法嘛就是: nohup 命令 命令參數,這樣就可以了。

          窗口保存的輸出有點少,前面的都看不到了

          執行了一個命令,輸出了好多東西,但是默認的配置下,PuTTY只保存了最后200行的內容,滿足不了我們的需求。
          還是在標題欄上點右鍵選擇 Change settings...,在配置窗口的左邊選擇 Window,修改右邊的 Lines of scrollback,改大點,比如 20000、80000的

          在上面的 Set the size of the window 里設置的是窗口顯示的行數和列數,默認是 24 行、80 列,根據自己的需要來修改吧。
          When window is resized 這個選項配置的是,當窗口大小發生改變時該采取什么動作。
          • Change the number of rows and columns(這個是默認的,改變窗口大小時,自動修改行數和列數)
          • Change the size of the font(這個是根據窗口的大小來修改字體的大小,窗口最大化的時候,字都是很大的)
          • Change font size only when maximised(只有在窗口最大化的時候才改變字體大小)
          • Forbid resizing completely(完全禁止改變窗口大小,一了百了)
          在現代的 Unix/Linux 主機上,默認選項已經不存在任何問題了。如果是 Solaris 8 這樣的老式 Unix 上最好用第2或第4個選項。
          第3個選項嘛,要求你的屏幕不是寬屏的,選中這個選項以后,大家可以先把窗口往窄的縮一下,然后最大化窗口,哈哈,滿足一下不是寬屏的虛榮心。
          順便說一下,在 PuTTY 中的前后翻頁,與 Linux 終端一樣,用 Shift+PageUp/PageDown 來上下翻頁,而 Ctrl+PageUp/PageDown 則是一行一行的。

          新建一個會話時,還有些東西再啰嗦一下

          前面把如何用 PuTTY 登錄一臺主機到注銷的過程聊了一遍,但是在新建會話時還是有些東西需要再啰嗦一下的。

          保持連接,不要自動斷開

          在 Connection 里面有個 Seconds between keepaliaves,這里就是每間隔指定的秒數,就給服務器發送一個空的數據包,來保持連接。以免登錄的主機那邊在長時間沒接到數據后,會自動斷開 SSH 的連接。
          默認輸入 0 是禁用保持連接,在這里我習慣的設置了 10。
          下面的那兩個復選框都保持默認選中吧。

          自動登錄用戶

          在 Connection-〉Data 里面有個 Auto-login username,可以指定默認的登錄用戶。如果每次登錄主機都是用同一個用戶,不妨在這里設置一下。SSH、Telnet、Rlogin 這三種協議都支持,但不是所有的 Telnet 服務器支持自動登錄用戶

          自動設置環境變量

          還是前面的那個界面,下面有個 Environment variables,在 Variable 輸入環境變量的名稱,Value里設置上環境變量的值,登錄主機后就會自動設置上,但是這個不一定能用,有些主機為了安全,可能會禁用這個特性,一旦登錄 就會收到這樣一個錯誤提示:
          Server refused to set environment variables

          設置代理服務器

          這個經常用到,設置方法大同小異,注意選擇好 Proxy type(代理服務器的類型)就可以了。
          代理服務器的地址填寫到 Proxy hostname 這里,Port 就是代理服務的端口(HTTP代理常用端口有 3128、8080,Socks5代理常用端口有 1080)
          Exclude Hosts/IPs 這里是填寫排除的主機地址和IP,有些地址不需要代理,就在這里填寫。
          有些代理需要認證,用戶名填寫到 Username,密碼則填寫到下面的 Password。

          自動執行一個命令

          在 Connection-〉SSH 里有個 Remote command,在這里面填寫上遠程服務器上的某個命令,比如:df,登錄后就會自動執行。
          我們在 Unix 上用 ssh 登錄主機時用的命令 ssh,在 ssh 的最后面加上遠程主機上的命令,就跟這個一樣。
          但是……,先別著急,一旦設置上這個選項,你會發現在登錄成功后,窗口一下就關閉了,嘿,怎么啦?什么也沒看見。
          因為命令執行完畢的同時,本次 SSH 登錄連接也隨之關閉。

          你可以把遠程自動執行的命令修改成 sleep 10,然后重新登錄,再看看效果。
          登錄成功后,沒有出現命令提示符,10秒鐘后,窗口自動關閉。這也驗證了剛才我說的,命令執行完畢后,SSH 連接自動斷開。
          冰雪聰明的你一定會想到,如果每次登錄主機,都是要重新啟動一下 tomcat,那這里就可以填寫上這樣的命令:
          export CATALINA_HOME="~/apache-tomcat-5.5.17";export JAVA_HOME="~/jdk1.5.0_07";export PATH=$JAVA_HOME/bin;$PATH ; cd $CATALINA_HOME/bin;./shutdown.sh;./startup.sh;tail -f $CATALINA_HOME/logs/catalina.out
          (上面的命令是一行的哦)
          先自動設置一下 環境變量(前面有提到,服務器可能會禁用自動設置環境變量,為了保險起見,在這里設置了一下),然后進入 tomcat 的 bin 目錄,用 shutdown.sh 停止 tomcat,然后再 startup.sh 啟動 tomcat,最后 tail 命令持續觀察 tomcat 的日志輸出,不想看了,就直接 Ctrl+C 就可以終止 SSH 的會話了。
          哈哈,是不是很方便?
          不過前面提到的命令 sleep 10,只是建立了 SSH 連接,然后 10 秒鐘后自動斷開。是不是覺得很無聊沒什么用途啊?其實這個命令配合后面提到的 Tunnels(隧道),可以自動保持隧道一定時間的開放,如果指定時間內(在這里就是 10 秒鐘)隧道沒有被使用,就自動關閉 SSH 連接和隧道。
          如 果選中了 Don't start a shell or command at all 就禁用了自動執行命令這一個特性,這個主要是配合 Tunnels (隧道)來使用的。因為有時候,我們只需要利用隧道建立一個 VPN,而并不需要登錄上去執行命令。用這個方法建立好隧道以后,就一直開放了,除非自己手工關閉。

          嗯,還有個問題哦,如果一次要執行的命令很多,該怎么辦呢?嗯,給 PuTTY 用 -m 選項指定一個包含遠程主機上執行的命令的文本文件。不過以后還會說到 Plink,就是專門做這個用的,慢慢來慢慢來。

          數據自動壓縮傳輸,變相的提高傳輸速率

          還是前面的那個界面,Protocol options 里面有個 Enable compression,這個選項的意思就是傳輸時壓縮數據,在連接速度不變的情況下,變相的提高了傳輸速率。一般的 SSH 服務器都會允許這個選項的,所以還是選中好了。

          無需口令登錄

          在 Connection-〉SSH-〉Auth 這里面有兩個需要了解的,以后在講到 PuTTYGEN 和 Pagent 時會詳細介紹的。
          一個是 Allow agent forwarding,作用是允許私鑰代理的轉發。
          另外一個是最下面的 Private key file for authentication,選擇私鑰認證文件。
          這 兩個可以讓你用 SSH 登錄不用輸入主機口令,但是私鑰的口令還是需要輸入的,如果使用了私鑰代理 Pagent ,私鑰口令也可以省略。再配合前面提到的自動指定用戶名登錄,可以實現自動登錄主機。登錄到主機上以后,用 SSH 登錄另外一個同樣配置了相同的私鑰認證的主機,也可以不用再次輸入口令。
          這些可以大大減輕了我們的重復工作,不用單調枯燥的輸入用戶名和口令,但是這樣使用有個后遺癥就是如果主機密碼沒有在另外一個地方記錄下來的話,這個密碼很快會忘記的,好處嘛,密碼可以設置的很長很變態 XD。

          X11 轉發能夠讓你在 Windows 上使用 Linux 的程序

          這里很簡單,選中 Enable X11 forwarding 后登錄主機,記得在我們本地運行 X 服務端程序(比如:免費好用的 Xming)。

          然后在控制臺直接輸入 X 環境下運行的程序,比如:xlogo,我們就可以看到 Linux 上的GUI界面的程序在Windows桌面上打開了。
          運行個復雜的,比如 gnome-session,這個是 GNOME 的啟動命令,如果想打開 KDE 就是 startkde

          這樣跟在本地使用 X Window 幾乎是一樣的了,而且還是運行在 Windows 的桌面上呢,騙騙小 mm 還是不錯的。或許你會問這樣用跟 vnc 那還不一樣了?答案是,不一樣。如果網絡環境不好,還是用vnc吧,否則遲鈍的圖形響應速度會讓你抓狂的。
          打開了 GNOME 桌面,怎么關閉呢?點菜單的注銷吧。如果你點了關機,這可關不了你的Windows,關的是遠程主機。

          用 SSH Tunnels(SSH 隧道),突破防火墻

          哇哦,突破防火墻!是不是忽然有了做黑客的感覺呢?呀!子彈,我躲——,身子往后仰,繼續閃……,噢,肚皮被子彈蹭了一下。
          簡單的說一下,SSH 協議能夠通過已經建立好的 SSH 加密鏈路來轉發任意的網絡連接,從而避免了網絡中的明文傳輸,也就無法用一些 Sniffer 工具嗅探到我們的隱秘信息了。
          先 說一下大致的使用過程,登錄到主機上以后,就可以建立好一個 SSH 隧道,這時在你的機器本地會開放一個端口,通過本地的這個端口訪問,就相當于在主機上去直接訪問。很像代理服務器吧,如果隧道另一端的端口是動態的, SSH 隧道就是一個代理了,SSH 隧道的意思大致就是這個。通過 SSH 隧道,我們可以保證從我們這一段到主機那一端是安全的,不會被監聽到。
          說了這么多,實際演練演練就知道了。在 PuTTY 的 Connection-〉SSH-〉Tunnels 這里就是配置 SSH 隧道的。
          Add new forwarded port 這里就是添加隧道轉發端口的,其中 Source port 是隧道的源端口,也就是隧道的入口,連接隧道時要連接這個端口。Destination 這里是目的地,隧道的出口,輸入的格式是: server:port。
          還 要說明的一點是 SSH 隧道是有方向的,這個方向是由下面的單選按鈕 Local/Remote/Dynamic 來決定的。如果下面的單選按鈕選中的是 Local,那么 Destination 這里填寫的目標是相對于遠程主機而言,而非你的機器。這樣的隧道可以稱之為正向隧道,隧道的入口是在你的本地,出口在遠程主機那一端。如果單選按鈕選中的 是 Remote,那么目標地址就是相對與你的機器而言,而非遠程主機。這樣的隧道稱之為反向隧道,隧道的入口是遠程主機那一端,隧道的出口則是你的本地機 器。這與 Local 選項是相反的。而最后一個 Dynamic 則不用指明 Destination 目標地址,也就是說目標地址是動態的了,連入隧道時可以隨意指定目標地址,而不像 Local/Remote 指明的固定目標地址,所以這樣的隧道就成了變相的加密 socks5 代理服務器了。
          看明白了么?是不是會有些糊涂?后面我會舉個例子來詳細說說的。

          開 始演練,我們現在建立一條到遠程主機 guantouping 上端口 7001 的隧道,在 guantouping 上可以用 nc -l -p 7001 localhost 這條命令建立一個監聽本地到端口 7001 的連接,這樣確保無法從其他機器訪問這臺主機的端口,只能在 guantouping 這臺主機上用 telnet localhost 7001 來連接。現在我的機器 IP 是 192.168.6.25,如果直接用命令 telnet guantouping 7001 訪問的話,那么在主機 guantouping 上會看到這樣的提示:
          [taylor@guantouping taylor]$ nc -l -p 7001 localhost
          invalid connection to [192.168.6.200] from (UNKNOWN) [192.168.6.25] 1926
          在這個配置面板上, Source port 上填寫 8080,也就是我們要通過本地的 8080 端口來進入 SSH 隧道, Destination 這里填上 127.0.0.1:7001,就表示被登錄的主機 guantouping 訪問該主機本地的 127.0.0.1:7001 這個端口。正常登錄到主機 guantouping 以后,SSH 隧道就建立好了。在我的機器 192.168.6.25 上輸入命令 telnet localhost 8080,輸入一些東西,就會在 guantouping 上看到有響應。在這里我用的是 nc,看起來方便一點,telnet 也是一樣的。

          這 就是正向 SSH 隧道的一個例子,大家實地操作幾次也就會明白了。最上面有個復選框是“Local ports accept connections from other hosts”,這個選項的作用是允許其他主機連接你機器上的隧道入口,默認情況下建立好隧道以后,只允許本地鏈接。只有選中這個復選框才允許其他主機連接 你的本地隧道入口。

          象特洛伊木馬一樣建立一條 SSH 反向隧道

          下面要說的就是選中單選按鈕 Remote 后建立的反向 SSH 隧道,這樣的隧道做什么用呢?一般防火墻都是允許從內往外鏈接,而不允許從外到內的鏈接,除非在防火墻上做好nat或端口轉發。現在,你在防火墻的內部, 但是又想讓外面的人鏈接到你的機器上。防火墻厚厚的城門緊閉,外面的人進不來,只有你能從里面打開這扇防護嚴密的大門,就像一個特洛伊木馬一樣,你主動連 接出去建立一個反向的 SSH 隧道,然后外面的人就可以通過這個反向的 SSH 隧道輕松突破防火墻鏈接到的你的本地機器。看下面這個圖:
          在 Source port 這里填寫 8080,也就是隧道的入口是端口8080,Destination 這里填寫 localhost:7001,也就是隧道的出口是本地的 7001 端口,下面的單選按鈕要選中 Remote,表示建立的隧道是個反向隧道,填寫完畢別忘記點 Add 按鈕,在上面就可以看到顯示的是 R8080 localhost:7001。成功登錄遠程主機 guantouping 后,反向隧道就建立好了。在遠程主機 guantouping 上輸入命令 telnet localhost 8080 就可以連接到你的本地端口7001。


          哈 哈,這樣一個特洛伊木馬般的反向 SSH 隧道就建立完畢了。我們在遠程主機上連接 8080 端口,其實就連接到了我們本地機器的7001 端口了。上面共有兩個復選框,我們提到了一個,已經說了,選中以后就允許其他機器連接隧道入口了。那第二個“Remote ports do the same (SSH-2 only)”,則是給反向隧道使用的,也就是說遠程主機的那個反響隧道入口也做同樣的事情,也就是允許其他機器連接遠程主機上的反向隧道入口,不過一般情 況下這個選項都不會起作用的 ^_^。

          把 PuTTY 作為一個安全的代理服務器來使用

          這個簡單,在 Source port 那里填寫上 1080,Destination 這里空下不填,選中下面的 Dynamic,最后別忘了點 Add 按鈕。
          登錄遠程主機后,一個代理服務器就建立好了,這個代理服務器的地址就是 localhost:1080,還是加密的哦。據說國外某著名的主機供應商就提供遠程的 SSH 鏈接,通過這個方法我們就建立了一個加密的 socks5 代理,可以輕松繞過萬惡的 GFW 去擁抱 Wikipedia,波~~~,來一口。

          設置 PuTTY 的默認設置

          每次登錄主機,無一例外的修改字體,修改字符集,修改窗口的大小,指定私鑰文件,允許 X11 轉發,……
          幾臺主機還好說,幾十個上百個主機這樣三天兩頭的設置也會讓唐僧煩了的。
          選中一個先前配置好的會話,點 Load 按鈕。

          然后修改Saved Sessions會話名稱 和 Host Name 這里的主機地址,點Save

          如果在 Saved Sessions 這里和上面的 Host Name 清空,點 Save 按鈕,就可以把設置保存為默認設置。

          備份 PuTTY 的設置

          用 PuTTY 最不爽的就是,它把所有的設置都保存到注冊表了,本來這不是什么問題。但是難免會重裝一下機器,用下面的命令可以備份 PuTTY 的所有設置
          regedit /e PuTTY.config.reg "HKEY_CURRENT_USER\Software\SimonTatham\PuTTY"

          刪除 PuTTY 的設置

          如果只是在其他機器上臨時用了一個 PuTTY,用完以后想刪除 PuTTY 的配置,就在控制臺里輸入如下的命令:
          putty.exe -cleanup

          用 PuTTYgen 來生成密鑰,以后可以不用密碼登錄服務器了

          PuTTYgen 是密鑰生成器,用來生成一對公鑰和私鑰供 PuTTY、PSCP、Plink、Pagent 來使用。
          直接運行 PuTTYgen 可以看到如下的界面。

          點擊 Generate 按鈕就開始生成一個公鑰和私鑰對,生成完畢后,點下面的 Save private key 就可以把私鑰保存起來,擴展名是 .ppk 的文件。
          Load 按鈕可以把先前保存的私鑰重新打開,然后做些修改,比如修改注釋和私鑰口令,或者把 PuTTY 格式的私鑰轉換為 OpenSSH 格式的。

          開始用 PuTTYgen 創建密鑰

          單擊 Generate 按鈕,然后你會看到進度條上面有個提示“Please generate some radomness by moving the mouse over the blank area.”,意思就是讓你用鼠標在空白區域隨機移動。隨著鼠標在空白區域的移動,進度條會一直走下去。停止移動鼠標,進度條也就停止了。那我們就移動鼠 標,直到進度條走滿為止。

          等進度條走完之后,會出現下面的界面

          最上面那個大大的只讀文本框里面是公鑰,用來保存到 OpenSSH 的 authorized_keys 文件中,這個文件中的每一行都是一個公鑰。默認情況下,這個文件位于 Linux 用戶主目錄的 .ssh/ 子目錄中,如果文件和目錄都不存在,可以直接創建。
          但 是創建的文件、目錄和用戶主目錄($HOME, $HOME/.ssh, $HOME/.ssh/authorized_keys)的權限有個限制就是對除了本帳戶的其他所有帳戶都要求是只讀的,否則的話,即使公鑰、私鑰都匹配 無誤,也是無法登入系統的。這是 SSH 服務器的一個安全要求,因為如果別的帳戶可以修改你的 authorized_keys 的話,惡意的增加一個公鑰,那對方不用你的帳戶口令也能以你的帳戶登入系統了。對于一些特殊要求,你可以在 SSH 服務器的配置文件 sshd_config 中用指令
          StrictModes no
          來取消這個限制。在 sshd_config 的幫助手冊中可以看到
          ???? StrictModes
          ???????????? Specifies whether sshd should check file modes and ownership of
          ???????????? the user’s files and home directory before accepting login.? This
          ???????????? is normally desirable because novices sometimes accidentally
          ???????????? leave their directory or files world-writable.? The default is
          ???????????? “yes”.
          小技巧:每次修改 authorized_keys 這個文件時,你可以用如下的命令來修改,確保所有的文件屬性和權限無誤
          mkdir -p $HOME/.ssh && touch $HOME/.ssh/authorized_keys \
          && chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys && vim $HOME/.ssh/authorized_keys
          還 有一個要強調的是那個 Key comment,這是密鑰的注釋,一定要修改。因為這個密鑰是給自己用的,所以最起碼要輸入自己的名字,用默認的注釋很容易和其他人的密鑰混淆的。如果擔 心自己的密碼忘記了,可以在后面加上密碼提示,當然了,不要讓別人用注釋猜出你的密鑰口令。比如,我可以把注釋修改為
          ChaiFeng [20061120] w.z.
          后面的 w.z. 就是我的密碼提示,能猜出來么?呵呵

          輸入注釋,上面的公鑰也會隨之發生變化。
          現在最重要的是,輸入自己的密鑰口令。就是 Key passphrase 和 Confirm passphrase 這個兩個輸入框。
          如果不輸入口令,直接保存私鑰會看到這個提示。為了安全起見還是輸入口令吧,要不任何人得到這個私鑰都可以不用口令登入系統了。

          最后單擊 Save private key 來保存私鑰吧,保存到自己認為安全的地方,比如存放到私人的 USB 閃存盤上。需要登錄時,插上 USB 閃存盤。登錄完畢后就可以把 USB 閃存盤取下來,哈哈,這樣子就比較安全了。
          大 家也注意到了,還有個 Save public key 按鈕,這個是保存 SSH2 格式的公鑰,有些 SSH 服務器要求用這種格式的公鑰文件。一般情況下,我們是不需要的,所以這里也就保存了。以后還想的話,就用 PuTTYgen 把私鑰 Load 出來,然后再保存也可以。

          用密鑰登錄服務器的流程

          上面雜七雜八的說了一堆創建密鑰時的事情,大家會不會已經有些亂了呢?我把這個過程再羅列一遍:
          1. 如果沒有公鑰/密鑰對,就用 PuTTYgen 創建一個,已經有了就可以忽略這一步。一個公鑰/密鑰對可以用在不同的服務器上,所以也不需要重復創建,關鍵要有足夠強健的密碼和安全的存放。
          2. 象先前一樣輸入帳戶名和口令登錄到主機上。
          3. 輸入如下命令,來編輯 authorized_keys 文件
            mkdir -p $HOME/.ssh && touch $HOME/.ssh/authorized_keys \
            && chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys && vim $HOME/.ssh/authorized_keys


          4. 這個文本框里的公鑰粘貼到 vim 中去,需要說明幾點:這個文本框里的內容是一行的,粘貼到 vim 中時,別忘了按字母 o 這個鍵,否則的話,粘貼進去后,開頭的 ssh-rsa 會變成 sh-rsa,為什么呢?哈哈,想想吧。
            為什么不按字母鍵 i 呢?這個在 vim 中不就是插入么?原因是我很懶,按字母 o,我可以節省一次按回車鍵。雖然按大寫 O 也行,那我不是還得再按一下 Shift 鍵么?
            別 忘了,在 PuTTY 中默認的粘貼可是按鼠標右鍵哦,然后按一下 ESC 鍵,然后輸入 :wq 保存退出,等等,大家先別著急的輸入 :wq,既然輸入冒號還得按下 Shift 鍵,那我們就干脆直接兩下大寫的字母 Z,也就是 ZZ。怎么樣?vim 也一樣保存退出了吧。這次又節省了一次按鍵和兩次尋找字母的移動,把懶得優良傳統再一次在實踐中發揚光大。

          5. 如果已經有了私鑰,第4步里的那個公鑰忘記保存了,就用 PuTTYgen 把這個私鑰 Load 上去,然后重新復制一下公鑰吧。
          6. 在 PuTTY 的配置 Connection->SSH->Auth 這里面,指定上私鑰,然后記得保存 Session,以后就不需要重復這一步了。

          7. 最好也指定上自動登錄的用戶名,還記得這里嗎?
          8. 開始登錄吧,這次你會看到一個不同于以往的登錄提示

            現 在輸入的口令可不是主機上這個賬戶的口令了,而是先前創建的這個密鑰的口令。以后不管這個賬戶的口令是什么,即使再復雜,也和我們沒關系了。只要這個賬戶 的 $HOME/.ssh/authorized_keys 文件中,有我們的公鑰,我們就隨時用匹配的私鑰都可以登錄了。配合后面提到的 Pagent,我們連輸入密鑰口令這一步也可以忽略過去。
          9. 登錄成功了,別忘了按 Ctrl+d 注銷哦。
          以后這些步驟就不需要再重復了,只需要打開 PuTTY 后,雙擊一下保存的會話名稱,輸入密鑰口令。

          Pagent 加載密鑰,每次開機后只需要輸入一次密鑰口令

          終于輪到 Pagent 出場了,雙擊一下 Pagent.exe,嗯,沒反應?再雙擊一下,咦?出來個提示,說已經運行了。

          看看右下角吧,在這里呢

          雙擊一下 Pagent 的圖標,出來這樣一個界面。很簡潔的,Add Key 是添加私鑰,Remove Key 是把選中的私鑰從 Pagent 中卸載了。

          好,現在單擊 Add Key 按鈕添加私鑰,我把這個演示用的私鑰保存到 C:\ 了

          然后會出現輸入密鑰口令的對話框,輸入正確的密鑰后,單擊 OK

          這時,在 Pagent 的窗口中就能看到我們的私鑰已經裝載上去了。

          現在打開 PuTTY,選擇先前保存的 Session,雙擊一下。只要自動登錄用戶名設置上,主機上改帳戶的 authorized_keys 文件里也有匹配的公鑰。哈哈,發現沒有?完全不需要口令,我們已經登錄到系統了。
          在 Pagent 的圖標上點右鍵,也可以快捷的選擇已經保存的會話。

          建 議大家把 Pagent 放到啟動組里面,這樣每次一開機,Pagent 自動運行,然后我們只需要把私鑰裝載一下,然后我們就可以一直享受自動登錄系統的樂趣了。再配合上以后會講到的 Plink、PSCP 這些,我們可以實現很多工作的自動化進行。完全不需要每次輸入用戶名、口令、輸入又長又多的命令,再做一些煩躁的文件備份,最后還得記得注銷系統,難道不 覺得麻煩么?這一切煩惱很快就會遠離我們了,繼續往下看吧。

          用 SSH 來傳輸文件

          PuTTY 提供了兩個文件傳輸工具
          • PSCP (PuTTY Secure Copy client)
          • PSFTP (PuTTY SFTP client)
          PSCP 通過 SSH 連接,在兩臺機器之間安全的傳輸文件,可以用于任何 SSH(包括 SSH v1、SSH v2) 服務器。
          PSFTP 則是 SSH-2 中新增的特性,使用的是新的 SFTP 協議,使用上與傳統的 FTP 類似。事實上 PSCP 如果發現 SFTP 可用,PSCP就會使用 SFTP 協議來傳輸文件,否則還是 SCP 協議。PSFTP 與 PSCP 相比,PSFTP 的優點是可以與服務器進行交互,遍歷服務器上的文件系統,在一個會話中上傳或下載多個文件。而 PSCP 只能一次傳輸一個文件,傳輸完畢后立刻終止會話。

          PSCP 的使用

          在控制臺直接執行 pscp 可以看到幫助
          C:\>pscp
          PuTTY Secure Copy client
          Release 0.58
          Usage: pscp [options] [user@]host:source target
          ?????? pscp [options] source [source...] [user@]host:target
          ?????? pscp [options] -ls [user@]host:filespec
          Options:
          ? -V??????? print version information and exit
          ? -pgpfp??? print PGP key fingerprints and exit
          ? -p??????? preserve file attributes
          ? -q??????? quiet, don't show statistics
          ? -r??????? copy directories recursively
          ? -v??????? show verbose messages
          ? -load sessname? Load settings from saved session
          ? -P port?? connect to specified port
          ? -l user?? connect with specified username
          ? -pw passw login with specified password
          ? -1 -2???? force use of particular SSH protocol version
          ? -4 -6???? force use of IPv4 or IPv6
          ? -C??????? enable compression
          ? -i key??? private key file for authentication
          ? -batch??? disable all interactive prompts
          ? -unsafe?? allow server-side wildcards (DANGEROUS)
          ? -sftp???? force use of SFTP protocol
          ? -scp????? force use of SCP protocol

          C:\>
          可以看出 PSCP 的使用是很簡單的,把常用的幾個選項說一下:
          • -q 安靜模式,傳輸文件時什么也不顯示,否則會顯示出文件的傳輸進度,默認是關閉的
          • -P port 指定服務器的 SSH 端口,注意這個是大寫字母 P,默認是 -P 22,如果主機的 SSH 端口就是 22,就不用指定了
          • -l user 指定以哪個用戶的身份登錄主機,如果沒有指定,則 PSCP 會在 PuTTY 保存的同名 Session 中獲得默認的用戶名稱。用戶名稱也可以和主機名稱寫在一起,用 @ 分割開,比如:username@server
          • -pw passwd 指定登錄時所用的口令為 passwd
          • -i keyfile 就是指定登錄時所用的密鑰文件
          • 最 后面指定的主機名也可以是 PuTTY 中保存的 Session 名稱。比如我們在 PuTTY 中保存了一個名為 foobarserver 的會話,而我們所在的網絡又的確沒有名為 foobarserver 的主機名稱。而在這個 foobarserver 會話中保存的主機名稱是 demo-server,保存的自動登錄的用戶是 taylor。那么用命令
            pscp c:\autoexec.bat foobarserver:backup/
            就把本地的 c:\autoexec.bat 復制到了主機 demo-server 上的用戶 taylor 所在的主目錄下的 backup 子目錄中(這個路徑可能是 /home/taylor/backup

          所以 PSCP 大致用法的例子就是:
          pscp -P 22 -i c:\path\your-private-key.ppk -C username@server:/remote/path/
          下面還是用一些實例來說明會比較簡單一些:
          把本地的 C:\path\foo.txt 復制到遠程主機 192.168.6.200 的 /tmp 目錄下
          pscp c:\path\foo.txt 192.168.6.200:/tmp
          把本地的 C:\path\foo.txt 復制到主機 192.168.6.200 的 /tmp 目錄下,但是以主機上的用戶 taylor 的權限執行
          pscp c:\path\foo.txt taylor@192.168.6.200:/tmp
          或者是
          pscp -l taylor c:\path\foo.txt 192.168.6.200:/tmp
          把本地的 C:\path\foo.txt 傳送到主機 192.168.6.200 的 /tmp 目錄下,但是主機的 SSH 端口是 3122
          pscp -P 3122 c:\path\foo.txt 192.168.6.200:/tmp
          把本地的 C:\path\foo.txt 復制到主機 192.168.6.200 的用戶 taylor 的主目錄下
          pscp c:\path\foo.txt taylor@192.168.6.200:.
          把主機 192.168.6.200 上的用戶 taylor 主目錄下的所有 *.tgz 文件拷貝到本地的 c:\backup 目錄中,如果 SSH 版本是 SSH v1,那這個命令就會出錯。
          pscp taylor@192.168.6.200:*.tgz c:\backup

          再來看看 PSFTP

          在控制臺執行命令 psftp -h,可以得到 psftp 的幫助
          C:\>psftp -h
          PuTTY Secure File Transfer (SFTP) client
          Release 0.58
          Usage: psftp [options] [user@]host
          Options:
          ? -V??????? print version information and exit
          ? -pgpfp??? print PGP key fingerprints and exit
          ? -b file?? use specified batchfile
          ? -bc?????? output batchfile commands
          ? -be?????? don't stop batchfile processing if errors
          ? -v??????? show verbose messages
          ? -load sessname? Load settings from saved session
          ? -l user?? connect with specified username
          ? -P port?? connect to specified port
          ? -pw passw login with specified password
          ? -1 -2???? force use of particular SSH protocol version
          ? -4 -6???? force use of IPv4 or IPv6
          ? -C??????? enable compression
          ? -i key??? private key file for authentication
          ? -batch??? disable all interactive prompts

          C:\>
          用法與 PSCP 大同小異,雖然有個 -load 選項,其實這個沒啥用,后面用主機名的時候,與 PSCP 一樣直接用上會話名稱就可以了。
          用 PSFTP 登錄到服務器上以后,操作與 FTP 差不多,這里簡單的說一下吧:
          • open 登錄主機
            open [username@]<sessname|hostname|ip> [port]
            比如:
            • open taylor@demo-server 3022
              就是以用戶 taylor 的身份,登陸到主機 demo-server 上,SSH 端口是 3022
            • open demo-server
              登陸 demo-server,這里的 demo-server 可以是PuTTY 中已經保存的會話名稱,也可以是主機的名稱,如果主機名稱與會話名稱相同,以會話名稱為準。
          • close 關閉 SFTP 連接
            這個沒啥說的,close 就關閉了 SFTP 連接
          • quit 結束本次的 SFTP 會話
            也沒啥用法,就是關閉了 PSFTP 這個程序
          • help [command] 幫助
            直接打 help 就可以看到幫助指令,后面指定上 一個命令就可以查看該命令的幫助,比如: help open
          • cd [directory] 改變當前目錄
          • pwd 察看當前目錄
          • lcd [directory] 改變本地目錄
          • lpwd 察看本地當前目錄
          • get [-r] <filename|directory> 從服務器下載一個文件/目錄,這個命令不能用通配符,參數 -r 可以遞歸下載整個目錄
          • put [-r] <filename|directory> [dest] 把文件/目錄上傳到服務器,這個命令不能用通配符,參數 -r 可以遞歸上傳整個目錄
          • mget [-r] <filename|directory> 從服務器下載一批文件/目錄,可以用通配符,-r 的含義與 get 一樣
          • mget [-r] <filename|directory> [dest] 把一批文件/目錄上傳到服務器,可以用通配符,-r 的含義與 put 一樣
          • reget [-r] <filename|directory> 從服務器續傳下載一個文件/目錄,這個命令不能用通配符,-r 的含義與 get 一樣
          • reput [-r] <filename|directory> [dest] 把一批文件/目錄續傳上傳到服務器,這個命令不能用通配符,-r 的含義與 put 一樣
          • dir [directory] 列目錄
          • ls 和 dir 一樣
          • chmod [file|directory] 改變文件的權限,與 Unix 的 chmod 命令類似
          • del <filename> 刪除文件,要注意的是 del 只能刪除文件
          • rm 與 del 一樣
          • mkdir <new-directory-name> 創建一個目錄
          • rmdir <directory> 刪除一個空目錄,只有空目錄才可以被刪除
          • mv <source-file|source-directory> <dest-file|dest-directory> 改名/移動。如果源和目的都是文件或目錄,則是改名。如果目的是目錄的話,則是移動。
          • ! 在本地命令前加一個感嘆號,就可以直接執行

          其他可選的 SFTP 客戶端

          FileZilla : http://filezilla.sf.net
          WinSCP : http://www.winscp.net

          用 Plink 更方便快捷的執行遠程主機上的命令

          Plink 是 PuTTY 的命令行連接工具,主要用于自動化工作的處理。
          直接在控制臺執行 plink,可以看到 Plink 的幫助
          C:\>plink
          PuTTY Link: command-line connection utility
          Release 0.58
          Usage: plink [options] [user@]host [command]
          ?????? ("host" can also be a PuTTY saved session name)
          Options:
          ? -V??????? print version information and exit
          ? -pgpfp??? print PGP key fingerprints and exit
          ? -v??????? show verbose messages
          ? -load sessname? Load settings from saved session
          ? -ssh -telnet -rlogin -raw
          ??????????? force use of a particular protocol
          ? -P port?? connect to specified port
          ? -l user?? connect with specified username
          ? -batch??? disable all interactive prompts
          The following options only apply to SSH connections:
          ? -pw passw login with specified password
          ? -D [listen-IP:]listen-port
          ??????????? Dynamic SOCKS-based port forwarding
          ? -L [listen-IP:]listen-port:host:port
          ??????????? Forward local port to remote address
          ? -R [listen-IP:]listen-port:host:port
          ??????????? Forward remote port to local address
          ? -X -x???? enable / disable X11 forwarding
          ? -A -a???? enable / disable agent forwarding
          ? -t -T???? enable / disable pty allocation
          ? -1 -2???? force use of particular protocol version
          ? -4 -6???? force use of IPv4 or IPv6
          ? -C??????? enable compression
          ? -i key??? private key file for authentication
          ? -m file?? read remote command(s) from file
          ? -s??????? remote command is an SSH subsystem (SSH-2 only)
          ? -N??????? don't start a shell/command (SSH-2 only)

          C:\>
          看上去 Plink 的使用方法、參數與PSCP、PSFTP都很類似。
          • -P port 指定服務器的 SSH 端口,注意這個是大寫字母 P,默認是 -P 22,如果主機的 SSH 端口就是 22,就不用指定了
          • -l user 指定以哪個用戶的身份登錄主機,如果沒有指定,則 PSCP 會在 PuTTY 保存的同名 Session 中獲得默認的用戶名稱。用戶名稱也可以和主機名稱寫在一起,用 @ 分割開,比如:username@server
          • -pw passwd 指定登錄時所用的口令為 passwd
          • -i keyfile 就是指定登錄時所用的密鑰文件
          • -m file 如果執行的命令很多的話,可以把命令寫到文件中,然后用這個參數來指定
          還是用一些實際的例子來說明一下 Plink 吧
          還記得前面說到 PuTTY 的自動執行命令那個配置么?在說到那個配置的時候,我們演示了一個簡單的 Tomcat 重新啟動的命令,這個命令是要寫在 PuTTY 的 Remote command 里面去。現在我們用 Plink 來實現同樣的功能:
          假設連接的主機是 192.168.6.200,SSH 的端口是 3022,用戶是 taylor:
          plink -P 3022 taylor@192.168.6.200 export CATALINA_HOME="~/apache-tomcat-5.5.17";export JAVA_HOME="~/jdk1.5.0_07";export PATH=$JAVA_HOME/bin;$PATH ; cd $CATALINA_HOME/bin;./shutdown.sh;./startup.sh;tail -f $CATALINA_HOME/logs/catalina.out
          如果在 PuTTY 中保存了一個名為 192.168.6.200 的會話,注意,這個會話的名稱與主機 IP 一樣,在會話中已經正確保存了端口 3022,指定了默認的用戶是 taylor,現在這個命令就可以簡化為:
          plink 192.168.6.200 export CATALINA_HOME="~/apache-tomcat-5.5.17";export JAVA_HOME="~/jdk1.5.0_07";export PATH=$JAVA_HOME/bin;$PATH ; cd $CATALINA_HOME/bin;./shutdown.sh;./startup.sh;tail -f $CATALINA_HOME/logs/catalina.out
          用 date 命令查看一下主機上的時間,并且格式化輸出:
          plink 192.168.6.200 date "+%F %T"
          大家實際執行一下命令看看,會發現,這個命令并沒有返回我們期望的結果,而是返回了一個錯誤:
          C:\>plink 192.168.6.200 date "+%F %T"
          date: too many non-option arguments: %T
          Try `date --help' for more information.
          可是在服務器上直接執行命令 date "+%F %T",的確是正確無誤的,哪里出了問題呢?這是因為Windows的控制臺會把兩個雙引號之間的字符串作為一個參數傳遞給被執行的程序,而不會把雙引號也傳遞給程序。我們做這樣一個小小的實驗來說明一下這個問題:
          比 如在 c:\tmp 文件夾里建立三個文件夾,名稱分別為:"foo"、"bar"、"foo bar"。然后在 foo 這個文件夾里面建立一個名為“foo.log”的空文件,在“bar”這個文件夾里建立一個名為“bar.log”的空文件,在“foo bar”這個文件夾里建立一個名為“foo-bar.log”的空文件。
          然后在控制臺下進入 c:\tmp 這個文件夾,執行如下命令:
          dir foo bar
          結果是列出“foo bar”這個文件夾里的內容,還是分別列出“foo”和“bar”文件夾里的東西呢?正確答案是后者。
          要想正確列出“foo bar”文件夾里的東西,就需要用雙引號把"foo bar"引起來
          C:\tmp>dir foo bar
          ?Volume in drive C is System
          ?Volume Serial Number is 9C51-A51C

          ?Directory of C:\tmp\foo

          2006-11-22? 09:48??? <DIR>????????? .
          2006-11-22? 09:48??? <DIR>????????? ..
          2006-11-16? 11:58???????????????? 0 foo.log
          ?????????????? 1 File(s)????????????? 0 bytes

          ?Directory of C:\tmp\bar

          2006-11-22? 09:48??? <DIR>????????? .
          2006-11-22? 09:48??? <DIR>????????? ..
          2006-11-16? 11:58???????????????? 0 bar.log
          ?????????????? 1 File(s)????????????? 0 bytes
          ?????????????? 2 Dir(s)?? 1,107,345,408 bytes free

          C:\tmp>dir "foo bar"
          ?Volume in drive C is System
          ?Volume Serial Number is 9C51-A51C

          ?Directory of C:\tmp\foo bar

          2006-11-22? 09:48??? <DIR>????????? .
          2006-11-22? 09:48??? <DIR>????????? ..
          2006-11-16? 11:58???????????????? 0 foo-bar.log
          ?????????????? 1 File(s)????????????? 0 bytes
          ?????????????? 2 Dir(s)?? 1,107,345,408 bytes free

          C:\tmp>
          說 到這里,就會明白上面的那個命令 plink 192.168.6.200 date "+%F %T" 其實在主機上執行的真實命令是 date +%F %T,而不是命令行中指定的 date "+%F %T"。不過還好,Windows 的控制臺可不認得單引號,所以上面那個命令的正確用法應該是:
          c:\>plink 192.168.6.200 date '+%F %T'
          2006-11-22 09:39:57
          我經常需要登錄到服務器上把 ADSL 重新撥號,可以把下面的命令寫到一個文本文件中,比如保存到了 C:\adsl-restart.command.txt
          echo "stoping..."
          /sbin/adsl-stop
          echo "starting..."
          /sbin/adsl-start
          echo "done."
          /sbin/adsl-status
          然后執行如下命令:
          plink -m c:\adsl-restart.command.txt root@192.168.6.251
          我經常要查看 Tomcat 的運行日志
          plink taylor@192.168.6.200 tail -f ~/apache-tomcat-5.5.17/logs/catalina.out
          每天都要看服務器上的剩余空間,就用這個命令:
          plink taylor@192.168.6.200 df -k
          假 設 www.chaifeng.com 連接著另外一個網段 10.204.26.0,有臺內網IP 為 10.204.26.21 的 Solaris 8主機只能用 telnet 登錄,為了防止被監聽,我們可以用 Plink 建立一個隧道,隧道開放 120 秒鐘,如果隧道沒有被使用,就自動斷開連接,然后我們在本地就可以用命令 telnet localhost 2623 的安全登錄那臺 Solaris 8 主機了。
          plink -L 2623:10.204.26.21:23 www.chaifeng.com sleep 120
          在 主機 www.chaifeng.com 上正在運行著 tor,默認的監聽地址是 127.0.0.1:9050,用 Plink 建立一個隧道,然后瀏覽器上配置代理服務器為 127.0.0.1,端口是 9050,這樣就能夠安全的使用 tor 代理了,不用擔心從我們的機器到主機 www.chaifeng.com 有被監聽的可能了。
          plink -C -N -L 9050:127.0.0.1:9050 taylor@www.chaifeng.com
          結合上 PSCP 我們還可以完成文件的每天備份
          plink taylor@192.168.6.200 tar jcf $(date '+documents.%F.tar.bz2') ~/documents
          pscp taylor@192.168.6.200:$(date '+documents.%F.tar.bz2') c:\backup\
          plink taylor@192.168.6.200 rm -f $(date '+documents.%F.tar.bz2')
          如 果把這些常用的操作寫成批處理文件,到時候要重啟一下 Tomcat,或者馬上察看一下 Tomcat 日志,再或者只是要把 ADLS 重新撥號以下,只需要用鼠標一雙擊這個批處理文件,稍等一下就自動完成了。不比你打開 PuTTY,登錄到服務器上,然后再一個一個的執行命令,最后還得注銷來的方便快捷么?再懶一些,把自動備份的批處理放到計劃任務里面,每天定時完成,哈 哈,有時間上網找些好玩的東西了,不用每天忙于這些繁雜重復的命令中了。

          用假象去迷惑敵人

          如果我說 Google 的服務器也開放了 SSH,但是只有特定的 IP 可以連接上去,不信么?(聲明:下面的圖片都未經修改,我以 Google 的名義發誓,絕對沒有 PS)


          知道是怎么回事么?

          FAQ(常見問題)

          我在 PuTTY 官方網站下載的,可是執行 PuTTY、Pagent、PuTTYgen 時總是出錯,而命令行執行的這幾個卻沒問題
          這種情形我也碰到過,一個解決的辦法就是去下載最新版,或許你碰巧下載的是舊版本。另外一個解決辦法就是,創建三個擴展名為 .manifest 的文本文件,然后把這三個文件復制到 PuTTY 的目錄中,文件內容分別如下:
          把下面的內容復制到記事本中,文件名保存為:PAGEANT.exe.manifest
          <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
          <!-- This is present purely to make Visual Styles in XP work better.
          ???? See 20020104174954.A12067@imsa.edu. -->
          <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
          <assemblyIdentity
          ?? type="win32"
          ?? name="Pageant"
          ?? version="0.0.0.0" processorArchitecture="x86"/>
          ?? <dependency>
          ?? <dependentAssembly>
          ??????? <!-- Load Common Controls 6 instead of 5 to get WinXP native-
          ???????????? looking controls in the client area. -->
          ??????? <assemblyIdentity type="win32"
          ???????????? name="Microsoft.Windows.Common-Controls"
          ???????????? version="6.0.0.0"
          ???????????? publicKeyToken="6595b64144ccf1df"
          ???????????? language="*"
          ???????????? processorArchitecture="x86"/>
          ?? </dependentAssembly>
          ?? </dependency>
          </assembly>
          把下面的內容復制到記事本中,文件名保存為:PUTTY.exe.manifest
          <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
          <!-- This is present purely to make Visual Styles in XP work better.
          ???? See 20020104174954.A12067@imsa.edu. -->
          <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
          <assemblyIdentity
          ?? type="win32"
          ?? name="PuTTY"
          ?? version="0.0.0.0" processorArchitecture="x86"/>
          ?? <dependency>
          ?? <dependentAssembly>
          ??????? <!-- Load Common Controls 6 instead of 5 to get WinXP native-
          ???????????? looking controls in the client area. -->
          ??????? <assemblyIdentity type="win32"
          ???????????? name="Microsoft.Windows.Common-Controls"
          ???????????? version="6.0.0.0"
          ???????????? publicKeyToken="6595b64144ccf1df"
          ???????????? language="*"
          ???????????? processorArchitecture="x86"/>
          ?? </dependentAssembly>
          ?? </dependency>
          </assembly>
          把下面的內容復制到記事本中,文件名保存為:PUTTYGEN.exe.manifest
          <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
          <!-- This is present purely to make Visual Styles in XP work better.
          ???? See 20020104174954.A12067@imsa.edu. -->
          <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
          <assemblyIdentity
          ?? type="win32"
          ?? name="PuTTYgen"
          ?? version="0.0.0.0" processorArchitecture="x86"/>
          ?? <dependency>
          ?? <dependentAssembly>
          ??????? <!-- Load Common Controls 6 instead of 5 to get WinXP native-
          ???????????? looking controls in the client area. -->
          ??????? <assemblyIdentity type="win32"
          ???????????? name="Microsoft.Windows.Common-Controls"
          ???????????? version="6.0.0.0"
          ???????????? publicKeyToken="6595b64144ccf1df"
          ???????????? language="*"
          ???????????? processorArchitecture="x86"/>
          ?? </dependentAssembly>
          ?? </dependency>
          </assembly>
          屏幕輸出太快了,怎么能暫停一下?
          Ctrl+S 快捷鍵可以暫停終端,Ctrl+Q 恢復。
          怎么翻頁?
          Shift+PageUp/PageDown 一頁一頁的翻,Ctrl+PageUp/PageDown 則是一行一行的。
          不是說 PSCP 一次只能傳輸一個文件么?為什么我發現能傳輸很多個?
          那是因為 PSCP 發現 SFTP 協議可用,優先使用 SFTP 協議來傳輸文件
          為什么執行了 pscp、psftp、plink 這些命令總是說錯誤的命令呢?
          應該把 PuTTY 所在的路徑添加到 PATH 環境變量中。你可以編輯 c:\autoexec.bat 這個文件,在最后增加一行,把 c:\path\to\putty 換成你的真實路徑
          set PATH=c:\path\to\putty;%PATH%

          posted on 2008-06-16 15:53 Rabbit 閱讀(4922) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 资源县| 武鸣县| 疏勒县| 郧西县| 大埔区| 美姑县| 扬中市| 镇雄县| 开封市| 金沙县| 昌江| 崇州市| 大城县| 九寨沟县| 汽车| 兰州市| 衡阳县| 黔南| 开封市| 嵩明县| 白水县| 南川市| 金堂县| 卫辉市| 泽州县| 循化| 澎湖县| 德钦县| 浦江县| 屏东县| 宽城| 六安市| 岳普湖县| 信阳市| 台东市| 武清区| 嫩江县| 常州市| 乐陵市| 廉江市| 汉寿县|