天天看點

putty使用方法~SSH等實時儲存會話

我的這些文字是從這幾年來的 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 的官方網站:[url]http://www.chiark.greenend.org.uk/~sgtatham/putty/[/url],截止到 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 的強大功能。

安裝

下載下傳頁面在這裡:[url]http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html[/url]

PuTTY 需要安裝麼?需要麼?需要麼?真的需要麼?不需要。PuTTY 是一個準綠色軟體,說它綠色是因為直接就能使用,完全沒有任何的安裝程式。準綠色是指 PuTTY 的所有配置都儲存到了系統資料庫,如果不記得備份系統資料庫中的相關内容,下次重裝機器所有配置就沒了,而且配置也不友善用閃存盤随身攜帶。但是 PuTTY 的配置删除還是蠻友善的,運作時指定個參數 -cleanup 就可以清除 PuTTY 的所有配置資訊。

第一印象,開始登入一台遠端主機

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

putty使用方法~SSH等實時儲存會話

在這裡輸入伺服器的 IP 或主機名,選擇好登入協定,還有協定的端口,如果希望把這次的輸入儲存起來,以後就不需要再重新輸入了,就在第4步輸入好會話儲存的名稱,比如:mail-server,或者幹脆就是主機的位址,點選儲存就可以了。

putty使用方法~SSH等實時儲存會話

最後點下面的 Open 按鈕,輸入正确的使用者名和密碼,就可以登入伺服器了。

首次登入一台主機時

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

putty使用方法~SSH等實時儲存會話

這是要告訴你登入的主機密鑰指紋,點 Yes 就儲存起來,以後就不會再彈出這個視窗,然後就正常登入。點 No 不儲存,下次還是要提示你,然後也可以正常登入。如果一台主機我們隻是臨時登入一下,當然就是點 No 了。Cancel 就是取消,也就是取消了這次登入。

如果你曾經登入過這台主機,但是又彈出來這個對話框,可能有以下幾種情形:

  • 主機重新安裝了作業系統
  • 這台主機可能有多個IP,這次用的是另外一個 IP
  • 有其他不懷好意的主機來冒充,誘騙我們登入,竊取隐秘資訊

前兩個情形很常見,一般點 Yes 就行了。後面這個嘛……唔……唔……,點 No/Cancel,再去詢問相關的主機管理人員。

又看到了中文亂碼

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

putty使用方法~SSH等實時儲存會話

PuTTY 的預設字型和字元集并不适合中文顯示, 在視窗标題上點選右鍵,選擇 Change Settings...

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

字型選擇好了,還要确定字元集。

選擇配置視窗左邊的 Translation,在右邊的 Received data assumed to be in which character set 下拉清單中選擇最後一個“Use font encoding”,最後點下面的 Apply 按鈕就生效了。

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

怎麼還是亂碼?

如果還是亂碼的話,就執行以下指令,看看系統的字元集

echo $LANG $LANGUAGE

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

這下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。然後在終端中輸入漢字“柴鋒”,按左方向鍵,可以看到漢字顯示很正常。

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

至于用哪個編碼,主要還是看上司的決定了,我們的上司就喜歡 GBK,連 GB18030 都不行。以前在用 Debian 的時候,好像預設都不支援 GBK 編碼。這幾年公司的開發在漢字編碼問題上出過幾次麻煩,還不就是在 ISO8859-1, GB2312/GBK/GB18030和UTF-8上折騰來折騰去。

給大家看一張 emacs 的截圖,看看上面的這麼多語言的文字共同顯示,這個會是用 GB2312/GBK/GB18030 的編碼麼?

putty使用方法~SSH等實時儲存會話

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

在 PuTTY 裡面怎樣選中,複制和粘貼?

在 PuTTY 的視窗裡面複制、粘貼可不能用 Windows 裡的這些 Ctrl+C, Ctrl+Ins, Ctrl+V 這些快捷鍵,Ctrl+C 在控制台上可是終止目前的指令執行。

PuTTY 的選擇、複制、粘貼這些操作都是通過滑鼠來完成的。

在 Window-〉Selection 這裡可以設定複制和粘貼的方式。

putty使用方法~SSH等實時儲存會話

預設的 Action of mouse buttons (滑鼠按鍵的功能)的選項是 Compromise,這種方式下選中有兩種方式,一是直接用滑鼠左鍵拖拉選中就可以了,二是用滑鼠中鍵單擊選中區域的開頭,用滾動條拖拉到期望選中區域的末尾,再用滑鼠中鍵單擊,就可以選中了。

選中以後,單擊滑鼠左鍵就把選中部分複制到剪貼闆了。粘貼也很簡單,單擊滑鼠右鍵。

Action of mouse buttons 的第一個選項是 Windows (Windows 方式的),滑鼠中鍵的操作跟前面提到的一樣。右鍵不是粘貼了,而是打開了右鍵菜單。

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

第三個選項是 xterm (xterm 方式),這個跟預設的 Compromise 方式相反的,中鍵和右鍵的操作調換了一下,就不多說了。

下面那個 Shift overrides application's use of mouse 是和 Shift 鍵有關的。有些 Rogue Like 的程式,比如 mc、links、Lynx、VIM 等等,都支援滑鼠操作,想在用滑鼠在上面選擇或粘貼就不行了。這個選項預設是選中的,在支援滑鼠操作的 Rogue Like 界面下,按住 Shift 鍵,就可以像前面的那樣用滑鼠來選擇、複制、粘貼了。

看下面的這個圖檔,用 Links 打開了 Google 的首頁,用滑鼠去選中 頂部中間的 Google,我們會發現,彈出了儲存的對話框。

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

實時儲存會話

這次更改配置參數了,關閉視窗後,下次使用還是要重新選擇的,麻煩。

還是回到上面修改配置的哪個地方,選擇左邊的 Session,在右邊選擇要覆寫的會話名稱,或者重新輸入一個新的名稱,點選 Save 按鈕儲存。

putty使用方法~SSH等實時儲存會話

關于登出登入的一些事情

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

putty使用方法~SSH等實時儲存會話

這樣做是不對的,首先這不是正确的登出方式,應該輸入指令 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的

putty使用方法~SSH等實時儲存會話

在上面的 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。

下面的那兩個複選框都保持預設選中吧。

putty使用方法~SSH等實時儲存會話

自動登入使用者

在 Connection-〉Data 裡面有個 Auto-login username,可以指定預設的登入使用者。如果每次登入主機都是用同一個使用者,不妨在這裡設定一下。SSH、Telnet、Rlogin 這三種協定都支援,但不是所有的 Telnet 伺服器支援自動登入使用者

putty使用方法~SSH等實時儲存會話

自動設定環境變量

還是前面的那個界面,下面有個 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。

putty使用方法~SSH等實時儲存會話

自動執行一個指令

在 Connection-〉SSH 裡有個 Remote command,在這裡面填寫上遠端伺服器上的某個指令,比如:df,登入後就會自動執行。

我們在 Unix 上用 ssh 登入主機時用的指令 ssh,在 ssh 的最後面加上遠端主機上的指令,就跟這個一樣。

但是……,先别着急,一旦設定上這個選項,你會發現在登入成功後,視窗一下就關閉了,嘿,怎麼啦?什麼也沒看見。

因為指令執行完畢的同時,本次 SSH 登入連接配接也随之關閉。

putty使用方法~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使用方法~SSH等實時儲存會話

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

資料自動壓縮傳輸,變相的提高傳輸速率

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

putty使用方法~SSH等實時儲存會話

無需密碼登入

在 Connection-〉SSH-〉Auth 這裡面有兩個需要了解的,以後在講到 PuTTYGEN 和 Pagent 時會詳細介紹的。

一個是 Allow agent forwarding,作用是允許私鑰代理的轉發。

另外一個是最下面的 Private key file for authentication,選擇私鑰認證檔案。

這兩個可以讓你用 SSH 登入不用輸入主機密碼,但是私鑰的密碼還是需要輸入的,如果使用了私鑰代理 Pagent ,私鑰密碼也可以省略。再配合前面提到的自動指定使用者名登入,可以實作自動登入主機。登入到主機上以後,用 SSH 登入另外一個同樣配置了相同的私鑰認證的主機,也可以不用再次輸入密碼。

這些可以大大減輕了我們的重複工作,不用單調枯燥的輸入使用者名和密碼,但是這樣使用有個後遺症就是如果主機密碼沒有在另外一個地方記錄下來的話,這個密碼很快會忘記的,好處嘛,密碼可以設定的很長很變态 XD。

putty使用方法~SSH等實時儲存會話

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

這裡很簡單,選中 Enable X11 forwarding 後登入主機,記得在我們本地運作 X 服務端程式(比如:免費好用的 Xming)。

putty使用方法~SSH等實時儲存會話

然後在控制台直接輸入 X 環境下運作的程式,比如:xlogo,我們就可以看到 Linux 上的GUI界面的程式在Windows桌面上打開了。

putty使用方法~SSH等實時儲存會話

運作個複雜的,比如 gnome-session,這個是 GNOME 的啟動指令,如果想打開 KDE 就是 startkde

putty使用方法~SSH等實時儲存會話

這樣跟在本地使用 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 代理伺服器了。

看明白了麼?是不是會有些糊塗?後面我會舉個例子來詳細說說的。

putty使用方法~SSH等實時儲存會話

開始演練,我們現在建立一條到遠端主機 guantouping 上端口 7001 的隧道,在 guantouping 上可以用 nc -l -p 7001 localhost 這條指令建立一個監聽本地到端口 7001 的連接配接,這樣確定無法從其他機器通路這台主機的端口,隻能在 guantouping 這台主機上用 telnet localhost 7001 來連接配接。現在我的機器 IP 是 192.168.6.25,如果直接用指令 telnet guantouping 7001 通路的話,那麼在主機 guantouping 上會看到這樣的提示:

[[email protected] 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 也是一樣的。

putty使用方法~SSH等實時儲存會話

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

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

下面要說的就是選中單選按鈕 Remote 後建立的反向 SSH 隧道,這樣的隧道做什麼用呢?一般防火牆都是允許從内往外連結,而不允許從外到内的連結,除非在防火牆上做好nat或端口轉發。現在,你在防火牆的内部,但是又想讓外面的人連結到你的機器上。防火牆厚厚的城門緊閉,外面的人進不來,隻有你能從裡面打開這扇防護嚴密的大門,就像一個特洛伊木馬一樣,你主動連接配接出去建立一個反向的 SSH 隧道,然後外面的人就可以通過這個反向的 SSH 隧道輕松突破防火牆連結到的你的本地機器。看下面這個圖:

putty使用方法~SSH等實時儲存會話

在 Source port 這裡填寫 8080,也就是隧道的入口是端口8080,Destination 這裡填寫 localhost:7001,也就是隧道的出口是本地的 7001 端口,下面的單選按鈕要選中 Remote,表示建立的隧道是個反向隧道,填寫完畢别忘記點 Add 按鈕,在上面就可以看到顯示的是 R8080 localhost:7001。成功登入遠端主機 guantouping 後,反向隧道就建立好了。在遠端主機 guantouping 上輸入指令 telnet localhost 8080 就可以連接配接到你的本地端口7001。

putty使用方法~SSH等實時儲存會話

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

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

這個簡單,在 Source port 那裡填寫上 1080,Destination 這裡空下不填,選中下面的 Dynamic,最後别忘了點 Add 按鈕。

putty使用方法~SSH等實時儲存會話

登入遠端主機後,一個代理伺服器就建立好了,這個代理伺服器的位址就是 localhost:1080,還是加密的哦。據說國外某著名的主機供應商就提供遠端的 SSH 連結,通過這個方法我們就建立了一個加密的 socks5 代理,可以輕松繞過萬惡的 GFW 去擁抱 Wikipedia,波~~~,來一口。

設定 PuTTY 的預設設定

每次登入主機,無一例外的修改字型,修改字元集,修改視窗的大小,指定私鑰檔案,允許 X11 轉發,……

幾台主機還好說,幾十個上百個主機這樣三天兩頭的設定也會讓唐僧煩了的。

選中一個先前配置好的會話,點 Load 按鈕。

putty使用方法~SSH等實時儲存會話

然後修改Saved Sessions會話名稱 和 Host Name 這裡的主機位址,點Save

putty使用方法~SSH等實時儲存會話

如果在 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 可以看到如下的界面。

putty使用方法~SSH等實時儲存會話

點選 Generate 按鈕就開始生成一個公鑰和私鑰對,生成完畢後,點下面的 Save private key 就可以把私鑰儲存起來,擴充名是 .ppk 的檔案。

Load 按鈕可以把先前儲存的私鑰重新打開,然後做些修改,比如修改注釋和私鑰密碼,或者把 PuTTY 格式的私鑰轉換為 OpenSSH 格式的。

開始用 PuTTYgen 建立密鑰

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

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

最上面那個大大的隻讀文本框裡面是公鑰,用來儲存到 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. 就是我的密碼提示,能猜出來麼?呵呵

putty使用方法~SSH等實時儲存會話

輸入注釋,上面的公鑰也會随之發生變化。

現在最重要的是,輸入自己的密鑰密碼。就是 Key passphrase 和 Confirm passphrase 這個兩個輸入框。

如果不輸入密碼,直接儲存私鑰會看到這個提示。為了安全起見還是輸入密碼吧,要不任何人得到這個私鑰都可以不用密碼登入系統了。

putty使用方法~SSH等實時儲存會話

最後單擊 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. putty使用方法~SSH等實時儲存會話

    這個文本框裡的公鑰粘貼到 vim 中去,需要說明幾點:這個文本框裡的内容是一行的,粘貼到 vim 中時,别忘了按字母 o 這個鍵,否則的話,粘貼進去後,開頭的 ssh-rsa 會變成 sh-rsa,為什麼呢?哈哈,想想吧。

    為什麼不按字母鍵 i 呢?這個在 vim 中不就是插入麼?原因是我很懶,按字母 o,我可以節省一次按Enter鍵。雖然按大寫 O 也行,那我不是還得再按一下 Shift 鍵麼?

    别忘了,在 PuTTY 中預設的粘貼可是按滑鼠右鍵哦,然後按一下 ESC 鍵,然後輸入 :wq 儲存退出,等等,大家先别着急的輸入 :wq,既然輸入冒号還得按下 Shift 鍵,那我們就幹脆直接兩下大寫的字母 Z,也就是 ZZ。怎麼樣?vim 也一樣儲存退出了吧。這次又節省了一次按鍵和兩次尋找字母的移動,把懶得優良傳統再一次在實踐中發揚光大。

    putty使用方法~SSH等實時儲存會話
  5. 如果已經有了私鑰,第4步裡的那個公鑰忘記儲存了,就用 PuTTYgen 把這個私鑰 Load 上去,然後重新複制一下公鑰吧。
  6. 在 PuTTY 的配置 Connection->SSH->Auth 這裡面,指定上私鑰,然後記得儲存 Session,以後就不需要重複這一步了。
    putty使用方法~SSH等實時儲存會話
  7. 最好也指定上自動登入的使用者名,還記得這裡嗎?
    putty使用方法~SSH等實時儲存會話
  8. 開始登入吧,這次你會看到一個不同于以往的登入提示
    putty使用方法~SSH等實時儲存會話
    現在輸入的密碼可不是主機上這個賬戶的密碼了,而是先前建立的這個密鑰的密碼。以後不管這個賬戶的密碼是什麼,即使再複雜,也和我們沒關系了。隻要這個賬戶的 $HOME/.ssh/authorized_keys 檔案中,有我們的公鑰,我們就随時用比對的私鑰都可以登入了。配合後面提到的 Pagent,我們連輸入密鑰密碼這一步也可以忽略過去。
  9. 登入成功了,别忘了按 Ctrl+d 登出哦。
    putty使用方法~SSH等實時儲存會話

以後這些步驟就不需要再重複了,隻需要打開 PuTTY 後,輕按兩下一下儲存的會話名稱,輸入密鑰密碼。

Pagent 加載密鑰,每次開機後隻需要輸入一次密鑰密碼

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

putty使用方法~SSH等實時儲存會話

看看右下角吧,在這裡呢

putty使用方法~SSH等實時儲存會話

輕按兩下一下 Pagent 的圖示,出來這樣一個界面。很簡潔的,Add Key 是添加私鑰,Remove Key 是把選中的私鑰從 Pagent 中解除安裝了。

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

然後會出現輸入密鑰密碼的對話框,輸入正确的密鑰後,單擊 OK

putty使用方法~SSH等實時儲存會話

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

putty使用方法~SSH等實時儲存會話

現在打開 PuTTY,選擇先前儲存的 Session,輕按兩下一下。隻要自動登入使用者名設定上,主機上改帳戶的 authorized_keys 檔案裡也有比對的公鑰。哈哈,發現沒有?完全不需要密碼,我們已經登入到系統了。

在 Pagent 的圖示上點右鍵,也可以快捷的選擇已經儲存的會話。

putty使用方法~SSH等實時儲存會話

建議大家把 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] [[email protected]]host:source target

       pscp [options] source [source...] [[email protected]]host:target

       pscp [options] -ls [[email protected]]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 中獲得預設的使用者名稱。使用者名稱也可以和主機名稱寫在一起,用 @ 分割開,比如:[email protected]
  • -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 [email protected]:/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  [email protected]:/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 [email protected]:.

把主機 192.168.6.200 上的使用者 taylor 主目錄下的所有 *.tgz 檔案拷貝到本地的 c:/backup 目錄中,如果 SSH 版本是 SSH v1,那這個指令就會出錯。

pscp [email protected]:*.tgz c:/backup

再來看看 PSFTP

在控制台執行指令 psftp -h,可以得到 psftp 的幫助

C:/>psftp -h

PuTTY Secure File Transfer (SFTP) client

Release 0.58

Usage: psftp [options] [[email protected]]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     for

原文:http://www.javaeye.com/topic/560682

繼續閱讀