文章目錄
- PSCP 的使用
- 再來看看 PSFTP
- 其他可選的 SFTP 用戶端
隨著Linux在伺服器端應用的普及,Linux系統管理越來越依賴於遠程。在各種遠程登入工具中,Putty是出色的工具之一。
Putty是一個免費的、Windows 32平台下的telnet、rlogin和ssh用戶端,但是功能絲毫不遜色於商業的telnet類工具。用它來遠端管理Linux十分好用,其主要優點如下:
◆ 完全免費
◆ 在Windows 9x/NT/2000下啟動並執行都非常好
◆ 全面支援ssh1和ssh2
◆ 綠色軟體,無需安裝,下載後在案頭建個捷徑即可使用
◆ 體積很小,僅364KB (0.54 beta版本)
◆ 操作簡單,所有的操作都在一個控制台中實現
使用簡介:
把Putty下載到機器上,雙擊putty.exe,就出現1的配置介面。選擇“Session”,在“Host Name(or IP address)”輸入框中輸入欲訪問的主機名稱或IP,比如server1或192.168.9.4。連接埠號碼(Port)根據使用的協議有所區別,ssh預設使用22,telnet預設使用23,rlogin預設使用513。在“Protocol”單選欄中選擇使用的協議,一般是telnet或ssh,這取決於伺服器提供的服務。在“Saved Session”輸入欄中輸入任務的名字,單擊“Save”按鈕,就可以把任務配置儲存起來了。
配置完成後單擊“Open”按鈕,出現2的登入介面,就可以使用Putty串連Linux主機了。
關於putty的一些使用中常見的問題
一、在Windows中使用putty登入FreeBsd系統時,能夠輸入使用者名稱,但是輸入密碼後按斷行符號鍵半天無反應。
答:設定過程如下:
1. 在/etc/ssh/sshd_config中添加如下內容,使普通使用者可以通過SSH登入:
AllowUsers 普通使用者帳號
UseDNS no
2. 將希望使用su命令的使用者加入到wheel組中,在/etc/group中作如下修改
wheel:*:0:root,普通使用者帳號
二、在login as: 後輸入使用者名稱,J04222035@cs8.xmu.edu.cn's password: 游標不動。即使輸入正確的密碼也是沒有反應?
答:這是因為putty不像telent那樣會直接顯示密碼,而是不顯示密碼,只要你輸入的密碼是正確的,即使不顯示只要輸完密碼後直接斷行符號即可進入,不用在乎游標不動。
終於輪到 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 的使用是很簡單的,把常用的幾個選項說一下:
所以 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 改變檔案的許可權,與 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 建立一個隧道,然後瀏覽器上配置Proxy 伺服器為 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,登入到伺服器上,然後再一個一個的執行命令,最後還得登出來的方便快捷嗎?