交代一下背景,在筆記本上裝虛擬機,在虛擬機里裝了Ubuntu系統,但用着一直感覺很卡。剛好同學有舊的不用的筆記本,就拿來裝了一個Ubuntu。
想要從我的筆記本上控制Ubuntu系統,於是就找到了putty。
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 密鑰的工具).
下載地址:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
PuTTY 是一個准綠色軟件,說它綠色是因為直接就能使用,完全沒有任何的安裝程序。准綠色是指 PuTTY 的所有配置都保存到了注冊表,如果不記得備份注冊表中的相關內容,下次重裝機器所有配置就沒了,而且配置也不方便用閃存盤隨身攜帶。但是 PuTTY 的配置刪除還是蠻方便的,運行時指定個參數 -cleanup 就可以清除 PuTTY 的所有配置信息。
putty的使用
雙擊即可運行putty,在Host Name(or IP address)輸入目標主機的IP地址,點擊Open即可連接。
可能會遇到連接不上和亂碼問題。
問題1:使用putty登錄顯示network error:Connection refused
解決方法:
1.gedit /etc/ssh/sshd_config 將PermitRootLogin的注釋取消,或者將no改為yes。(如果沒有sshd_config文件說明linux上沒有安裝SSH,使用sudo apt-get install ssh安裝之后,sshd-config文件中PermitRootLogin選項默認的是yes,新安裝的ssh不用操作下面兩部)
2.service sshd restart
3.setup命令進入將防火牆關閉。
問題2:使用putty登陸之后顯示亂碼
解決方法:(以下方法未經過本人測試,摘錄自網絡)
其實只需要一步即可: 在window-〉Translation中,character set 中,把Use font encoding改為UTF-8,其他不需要改動(按照方法一改動之后可能大寫字母顯示會編程亂碼)。
###方法一:
打開putty主程序,選擇window-〉Appearance-〉Font settings-〉Change Settings,選擇Fixedsys字體,字符集選擇CHINESE_GB2312。在window-〉Appearance-〉 Translation中,Received data assumed to be in which character set 中,把Use font encoding改為UTF-8如果經常使用,把這些設置保存在session里面。
保存方法:再做完以上操作的同時選中以下兩項:
在window-〉Appearance-〉 Translation中,選中:TReat CJK ambiguous characters as wide和Caps Lock acts as Cyrillic switch即可。
###方法二:
編輯/etc/sysconfig/i18n
把第1句"LANG="zh_CN.UTF-8""改為"LANG="zh_CN.GB18030"",完成后保存重新登錄即可。
##方法三:
打開putty,登錄成功后,在shell中輸入
# export LC_ALL= 'zh_CN.utf8'
# vi ~/.bash_profile
LANG=zh_CN.GB18030
LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN
export LANG LANGUAGE
在命令行輸入用戶名密碼即可登錄系統,進行各種操作。
如果覺得默認的字體不好看,還可以對字體進行各種設置。(Window->Appearance->Font settings->Change...)
在 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 鍵,就可以像前面的那樣用鼠標來選擇、復制、粘貼了。
在 Control use of mouse 里面還有個 Default selection mode (默認的選擇模式),默認是 Normal,就像文字處理工具里這樣的選擇。
另外一個是 Rectangular block(塊選擇方式),至於用哪種方式就看自己的選擇了。
成功登錄主機后,也能正常看到中文了。這樣,我們就可以完成大部分的工作。最后要關閉窗口了,該怎么辦呢?很多人都是直接點擊窗口上的關閉按鈕,完全沒有理會彈出警告窗口,直接點擊了 Yes。
這樣做是不對的,首先這不是正確的注銷方式,應該輸入命令 exit 來正常注銷;其次直接關閉窗口后,你的登錄其實還在服務器上,如果一連多次的這樣強制關閉窗口,用命令 w 或者 who 命令查看時,可以看到很多的用戶還在系統上登錄,占用了系統的資源。最重要的是,你的這次登錄可能只是為了啟動一下 WebLogic 或者其他什么應用服務器,直接關閉窗口后,可能會導致你的業務在隨后的幾分鍾內也被終止,這應該不是你所希望看到的吧。
如果上述的理由是每次要輸入 exit 然后回車,比較麻煩。你可以用快捷鍵 Ctrl+d 來注銷登錄,一般情況下,快捷鍵一按窗口都直接關閉了,還省了兩次鼠標點擊。
在前面說道保存會話時,大家或許也注意到,下面有個 Close window on exit 有三個選項:
- Always (不管怎樣,窗口總是要關閉的)
- Never (無論是否有程序還在運行,都不要關閉窗口)
- Only on clear exit (這個是默認選中的,只有在本次登錄中運行的程序都正常終止或者在后台運行,窗口才關閉)
有的程序在執行時,雖然在命令最后面加上"&"就能放到后台運行。但是正常注銷登錄后,窗口沒有被自動關閉,還能看到程序的輸出,這時強制關閉窗口還是可以的。為了避免這種情形,可以使用 nohup 命令。
用法: nohup 命令 命令參數,這樣就可以了。
刪除 PuTTY 的設置
如果只是在其他機器上臨時用了一個 PuTTY,用完以后想刪除 PuTTY 的配置,就在控制台里輸入如下的命令:putty.exe -cleanup
pscp的使用
putty可以遠程登錄主機進行操作,而pscp則可以向遠程主機傳輸文件,而且使用也十分簡單。pscp不想puttty直接運行,而是通過命令提示符運行。輸入pscp.exe即可看到pscp的具體用法。
可以看出 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的使用
用法與 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 會話並退出 SFTP
這個沒啥說的,close 就關閉了 SFTP 連接 - bye/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 *.c
- mput [-r] <filename|directory> [dest] 把一批文件/目錄上傳到服務器,可以用通配符,-r 的含義與 put 一樣,用法舉例:mput *.c
- reget [-r] <filename|directory> 從服務器續傳下載一個文件/目錄,這個命令不能用通配符,-r 的含義與 get 一樣
- reput [-r] <filename|directory> [dest] 把一批文件/目錄續傳上傳到服務器,前提是遠端必須存在需要續傳的文件,這個命令不能用通配符,-r 的含義與 put 一樣
- dir [directory] 列目錄
- ls 和 dir 一樣
- chmod [file|directory] 改變文件的權限,與 Unix 的 chmod 命令類似,用法舉例:chmod a+x *.sh
- del <filename> 刪除文件,要注意的是 del 只能刪除文件
- rm 與 del 一樣
- mkdir <new-directory-name> 創建一個目錄
- rmdir <directory> 刪除一個空目錄,只有空目錄才可以被刪除
- mv <source-file|source-directory> <dest-file|dest-directory> 改名/移動。如果源和目的都是文件或目錄,則是改名。如果目的是目錄的話,則是移動。
- ren <source> <distination> 重命名或移動遠端的文件
- ! 在本地命令前加一個感嘆號,就可以直接執
其他可選的 SFTP 客戶端
FileZilla : http://filezilla.sf.net
WinSCP : http://www.winscp.net
用 Plink 更方便快捷的執行遠程主機上的命令
看上去 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
說到這里,就會明白上面的那個命令 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,登錄到服務器上,然后再一個一個的執行命令,最后還得注銷來的方便快捷么?再懶一些,把自動備份的批處理放到計划任務里面,每天定時完成,哈哈,有時間上網找些好玩的東西了,不用每天忙於這些繁雜重復的命令中了。
本來是想自己總結的,結果總結了一小半,發現了很不錯的PuTTY教程,就從中參考了不少內容。
推薦PuTTY教程 http://chaifeng.com/blog/2007/06/putty_200611.html#h.11d569f9951d