Friday, March 27, 2009

Windows XP启动黑屏的实例分析

Windows XP启动黑屏的实例分析

文章所属标签: 电脑维护 

 

操作系统:Windows XP Pro
难度等级:Level 100
案例来源:微软中文新闻组(Windows XP)
排错记录:

问题摘要:我的windows xp pro (英文版)面对了在启动 Windows时计算机停止响应并出现黑屏的问题。我有看过KB314503,寻求解决方案可是他们所提供的我都尝试了都无效。

步骤1:
(1)初步分析:KB314503介绍了出现Windows Logo前的启动故障排错方法,既然该方案无效,则可能用户并非
在该阶段启动出错。
(2)收集信息:询问用户启动出错的阶段,属于以下的哪个阶段:
  a. 系统POST时出错
  b. 出现Windows Logo前出错
  c. 出现Windows Logo后出错
  d. 帐户登录后出错
(3)用户反馈:属于阶段c,在出现Windows XP Logo时系统黑屏。(这也是KB314503无法解决该case的原因)

步骤2:
(1)原因分析:问题可能是由于某个驱动或者服务所引起。
(2)推荐方案1:开机按F8,选择“Last Known Good”,系统会自动从HKEY_LOCAL_MACHINE\SYSTEM\ControlSet00x里读取上次正确启动的配置信息,这里的x由HKEY_LOCAL_MACHINE\SYSTEM\Select下的LastKnownGood键值所指定。
用户反馈:无效
(3)推荐方案2:重启系统按F8,选择安全模式,看看能否登录系统。
用户反馈:安全模式下无法登录系统,每次到了AGP440.SYS就停止不动了。
(4)推荐方案3:借助Windows XP安装光盘引导系统,登录到Recovery Console,然后在命令提示符下运行listsvc,确认系统里有AGP440驱动,然后运行disable AGP440禁用该服务,设置完毕,重启系统。
用户反馈:问题解决。

补充:还可以开机按F8,在高级启动菜单里选中“Enable Boot Logging”,等系统启动失败后,利用Windows XP安装光盘引导系统,在故障恢复控制台下用more命令检查%systemroot%\ntbtlog.txt(引导日志文件),找出问题原因。

Friday, March 13, 2009

Putty|OpenSSH与Putty

ELM’s log » OpenSSH与Putty

OpenSSH与Putty

2009年1月23日

写在开始之前

其实这是一篇介绍Putty使用的文章,文章不会太关注于技术细节和其它客户端的比较,原本想把文章的题目叫“Putty的使用”,但是又觉得文章介绍的内容并非是Putty独有的功能,而是OpenSSH的一些功能,所以最终还是选择使用“OpenSSH与Putty”,希望这个题目会相对贴切一些。

每当看到一些朋友或同事使用SecureCRT的时候,我总是会问一句:“为什么使用SecureCRT呢,这个软件不免费,需要破解,需要安装……?”,一般得到的答复都是:“习惯了,刚开始接触就用这个,你用什么呢?”,没错,很多时候人总是让惯性所左右了,很多事情都是习惯了,因为习惯了,所以我要继续保持现状……,其实我刚开始接触SSH的时候,使用的也是SecureCRT,并且这个软件对Serial支持也很好,对于网管来说,再也不用忍受Windows自带的“超级终端”了。后来想让自己尽量尊重知识产权,尽量少使用破解、盗版软件,所以逐步替换机器上的破解软件,具体是什么时候开始使用Putty我也记不太清楚了,肯定是2006年以前的事情了,当时Putty还不支持Serial,现在最新版本已经支持了,虽然不支持Xmodem(需要使用的时候,可以使用超级终端嘛)。

因为前一段时间和段老师讨论通过SSH编辑远程主机上的UTF-8文件的时候讨论到了Putty,段老师建议我写一篇Putty的使用手册,发在我们的博客上,充分利用这个平台交流,所以这篇文章和大家见面了,由于本人水平有限,如有错误,欢迎指正。

SSH的出现

在2000年以前,如果你管理很多Unix或Linux的机器,你可能对telnet非常熟悉,因为要通过telnet远程管理这些主机。如果你是一个网管,登录交换机、路由器也只能通过telnet来实现,后来大家越来越重视网络安全,在各个Linux发行版本中默认启用的都是通过SSH远程登录,之后在交换机和路由器上也实现了通过SSH登录,以提高系统的安全性。

Secure Shell(SSH)在维基百科上的解释是:在两个网络设备之间通过安全通道传输数据的一种网络协议。专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。透过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗。SSH 之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替 Telnet,又可以为FTP、POP、甚至为 PPP 提供一个安全的“通道”。相信总有一天你会和我有一样的感觉“Great SSH”。

为什么使用Putty

为什么使用Putty?我也问过我自己好多遍,为什么使用它,想来想去,我觉得首先它是开源的,其次它很小巧(putty.exe只有444K),再次免安装,在任何一台机器,只要上网下载putty.exe即可通过用户名/密码登录远程主机,Putty界面很简洁,整个屏幕只有标题栏和滚动栏,剩下的空间全是你的啦。

如果你还使用WinSCP来传输文件,WinSCP和Putty使用的是相同的Pageant(使用公钥验证),你只需在本地开一个Pageant,就可以使用WinSCP在你机器和远程主机之间传输文件,也可以使用Putty远程登录其它主机。

当然,Putty也不是十全十美的,至少现在我觉得是有一些缺陷;首先、Putty不能帮你保存密码,如果你习惯了SecureCRT,因为SecureCRT可以帮你保存密码,你可能会觉得很不习惯;其次、Putty最新版本虽然支持Serial,但是不支持Xmodem,如果你要升级交换机软件版本,需要通过Xmodem传输软件包,那Putty可能无能为力。

如何获得Putty

习惯使用搜索引擎,登录http://www.google.com输入putty,返回的第一条记录就是你要的答案。从http://www.chiark.greenend.org.uk/~sgtatham/putty/ 可以获得最新版本的Putty软件,你可以选择下载完整的zip软件包,也可以单独下载你需要的一个用程序。

  • PuTTY (the Telnet and SSH client itself)
  • PSCP (an SCP client, i.e. command-line secure file copy)
  • PSFTP (an SFTP client, i.e. general file transfer sessions much like FTP)
  • PuTTYtel (a Telnet-only client)
  • Plink (a command-line interface to the PuTTY back ends)
  • Pageant (an SSH authentication agent for PuTTY, PSCP and Plink)
  • PuTTYgen (an RSA and DSA key generation utility).

一共包含了这些文件,一般比较常用的就是Putty、Pageant、PuttyGen。

Putty使用之基础篇

下载Putty.exe后第一运行出现这样的对话框:

image

当然,在配置文件区域(Saved Sessions)中只有一个Default Settings,当然了,你可以通过修改默认配置,然后为不同的主机保存不同的配置文件。如上图的(BSD_wzk CNC_wzk …)。

登录篇

基本使用方法很简单:

在Host Name(or IP address)输入你要登录主机的域名或IP地址,如果使用的是非默认端口,需要修改Port的值,然后选择Open即可连接主机,接着分别输入用户名和密码即可登录上远程主机。

小技巧:如果你觉得每次都输入用户名比较麻烦,下载最新版本的Putty(老版本不支持该功能),在Host Name(or IP address)输入 USER@host 即可省略用户名的输入,如: wzk@www.wenzk.net 下次登录的时候只需输入密码即可。

中文篇:

1、字符集问题

现在最新版本对中文的支持已经很不错了,如果是老版本除了需要关注字符编码问题,还需要关注这个地方的设置:

Window->Appearance->Font settings->Change…

image

注意使用“新宋体”,字号根据自己喜好即可,字符集选择“GB2312”,如下图:

image

不过似乎新版本不需这样配置(新版本的Putty,且不使用UTF-8编码),直接使用默认配置也可以正常显示中文,应该是一个进步吧。

2、字符编码问题

如果你使用Linux有7-8年左右,你可能会发现UTF-8编码使用越来越普遍了,现在Linux默认就使用UTF-8编码了。在RedHat 7.2默认配置:

[wzk@intranet ~]$ locale
LANG=en_US
LC_CTYPE=”en_US”
LC_NUMERIC=”en_US”
LC_TIME=”en_US”
LC_COLLATE=”en_US”
LC_MONETARY=”en_US”
LC_MESSAGES=”en_US”
LC_PAPER=”en_US”
LC_NAME=”en_US”
LC_ADDRESS=”en_US”
LC_TELEPHONE=”en_US”
LC_MEASUREMENT=”en_US”
LC_IDENTIFICATION=”en_US”
LC_ALL=
[wzk@intranet ~]$

而现在的Linux发行版本却是这样的(CentOS 5.2):

[wzk@netmon ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=
[wzk@netmon ~]$

现在越来越多的网页也使用UTF-8编码了,但是有很多老的代码使用的仍然是GB2312编码,在新的Linux发行版本中进行修改的时候可能会有很大的麻烦,vi之后发现是乱码,这个一般都是编码的问题。

一般说来,要正确显示汉字,编码方面需要有3个统一:客户端,Linux环境变量和文件编码。这三个方面的编码需要统一,必须以文件为准,因为你编辑的是文件,文件使用的是UTF-8编码,别的设置也设置成UTF-8编码,否则肯定出现乱码。

Putty设置使用UTF-8编码:

Window->Translation->Character set translation on recieved data->UTF-8

image

保存后,你客户端的UTF-8编码就设置成功了,默认使用的是“Use font encoding”。

Linux环境变量设置使用UTF-8编码:

一般来说新版本的Linux发行版都使用UTF-8编码了,可以使用locale命令来检查,如果不是,在BASH下可以使用export LANG=xx_XX.UTF-8来设置,xx_XX一般为zh_CN或en_US。

[wzk@intranet ~]$ export LANG=en_US.UTF-8
[wzk@intranet ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=

通过以上设置,你在Linux上通过VI打开一个UTF-8编码的文件就不会乱码了。在BSD上就更麻烦一些了,可以借助Google来搞定。

如果文件使用的是非UTF-8编码,而是普通的GBK或GB2312编码,在Putty的设置选择“Use font encoding”即可,Linux环境变量使用export LANG=xx_XX即可。

Putty使用之提高篇

1、公钥验证

对于很多人来说,可能习惯使用用户名/密码方式来登录服务器,使用密码验证带来的麻烦就是记忆一堆繁琐的密码,如果你管理很多机器,唯一的办法就是把所有机器的口令都设置成同一个,一般都建议使用与自己无关的口令,长度至少6位以上,包含字符(大小写)、数字和特殊符号,建议1-3月更换一次,记忆和更换密码将是很大的一个工程,如果完全依靠人脑来记忆这些没有任何规则的口令,几乎是不太可能的。

使用公钥验证可以很轻松的解决密码管理的问题,使用公钥验证,你根本不需要去关心系统上你的用户的密码是什么,因为你登录的时候不需要提供这个密码(除非你使用sudo),有些管理员为了安全,直接关闭密码验证,通过ssh登录根本不给你提供密码验证的机会,也就不用关心机器上用户的口令是否是弱口令的问题了。(现在把root口令设置成123456放在互联网上,不到一天的时间,再用root/123456或许就登录不上去了。)

公钥为什么安全,我个人觉得:1、因为公/私钥长度一般都是1024或2048位,如果别人要猜测你的私钥,要生成一个1024位的私钥并且与服务器上的公钥对应上应该不是很容易的事情吧(个人不懂密码学,所以不了解细节)。2、私钥一直是你自己保管的,别人(包括管理员)不可能获得你的私钥。3、私钥可以用一个PassPhrase保护起来,需要一个PassPhrase才能打开并使用你的私钥。

1)、如何生成公/私钥

需要使用公/私钥验证,首先必须生成一对密钥,当然你可以使用OpenSSH的ssh-keygen来生成,这里介绍使用图形化的PuttyGen.exe来生成。

image

image

在Parameters中可以选择密钥的类型(默认使用:SSH-2RSA),也可选择密钥的长度(默认:1024位)。点击“Generate”开始创建,创建的时候鼠标需要在空白框内移动,用于获取相对随机的随机数。

image

可以在Key passphrase中输入你的私钥的保护密码(这个必须记住,用来打开你的私钥,忘记就必须重新生成了)。

image

选择“Save private key”把生成的私钥保存成一个“.ppk”文件,以后Pageant.exe会用到。图中灰色框中显示的就是你的公钥(放到服务器上去的),类似以下内容(每个人生成的key是不一样的,每次生成的也不一样):

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiv/Unjvcm1GqvvtRET/IGk3nuR/YvlM1clRzoGi1LqY6zu6wgjT5q6VvfL3PHmBGx6V2GbHwvie91R5Y42oTsTvnUtryrPqfDisc3CIfCDBZjOWiPpSjwM46+Mjfj/xuyOe8NCcTkzcBlbx9ySQojRjiCnIt8oxESOYMlCbPvuc= rsa-key-20090122

到此为止,你的公/私钥就生成完毕了,记住:私钥自己保管好,任何人都不要给,否则你就需要更换你所有服务器上的公钥。公钥也保存好,建议放到某个web服务器上,让你可以从别的主机通过curl或wget下载得到,例如将文件保在http://mrtg.neu.edu.cn/authorized_keys中。

2)、如何处置公钥

公钥是放到服务器上的,对普通用户来说,应该把公钥放到什么地方呢?一般说来,OpenSSH默认配置(记住是默认配置,也有特殊的,具体可以问管理员)是使用用户目录下的.ssh/authorized_keys作为信任公钥列表,每行一个公钥(如果.ssh不存在,可以自己创建,如果authorized_keys不存在,这个文件一般都不存在,也可以自己创建)。以下演示如何创建该文件:

image

注意:用你自己的身份去创建目录和文件,最好保证目录权限为700,authorized_keys文件权限为600,在某些要求比较严的系统上会检查这个文件和目录的权限是否正确,如果有问题,就不允许你通过公钥验证登录。

3)、如何使用私钥登录服务器

在服务器上配置好后,你可以试着从客户端使用私钥登录服务器,使用SecureCRT的用户可能习惯在配置文件中选择一个私钥用户登录服务器,但是Putty不支持这种方式,Putty要使用公/私钥方式,必须在客户端启用Pageant.exe这个程序。

image

启动Pageant后,系统托盘上会有Pageant图标。

image

双击图标出现如下界面。

image

从上面可以看到,在Key list中没有任何私钥加入进来,所以我们要把刚才生成的私钥加入到列表中,选择“Add Key”,然后选择刚才保存的.ppk文件,输入打开私钥的PassPhrase,如图:

image

如果你使用不同的私钥登录不同的服务器,你也可以将多个私钥加入到Pageant中来,在登录系统的时候,Pageant会自动为你挑选一个私钥用于验证。

完成上述步骤后,重新登录你的服务器,看是否不再向你提示输入密码就可以登录进去了。

image

小窍门:如果你常使用的只有一个Key,每次打开Pageant.exe之后,然后点击系统托盘上的图标,然后添加Key,是否会太繁琐呢?解决办法:创建一个Pageant.exe的快捷方式,修改快捷方式的内容,把目标改成 D:\CommonSoft\putty\PAGEANT.EXE D:\xxx\xxx.PPK,这样每次点击这个快捷方式打开Pageant.exe直接提示输入xxx.ppk的PassPhrase,成功之后就这个key就加入到Pageant中了。

2、TCP Port Forwarding

相信用过SSL VPN的人知道这么一个功能,如下面的网络结构:

A —— B  ——  C

假设你是A,A无法访问C的TCP/23端口,但是B却可以访问C的TCP/23端口,A如何便捷的通过B访问到C呢,使用TCP Port Forwarding就可以实现这个功能了,不过仅限TCP协议。

image

如上图所示,A想通过B访问C(bbs.neu.edu.cn/TCP/23)的bbsd服务,只需通过如下设置即可:

image

修改当前Session的配置(在标题栏上点击鼠标右键,选择“Change Settings”即可),在Connection->Tunnels

Source port:是在你本机监听的一个端口,隧道建立之连接这个端口即可。

Destination:隧道的另一端是哪个机器,哪个端口,这里应该写bbs.neu.edu.cn:23

因为是在本机监听端口,所以选择的是Local Forwarding。关于Remote类似,在远程监听端口,用于反向访问。

完成后点击Add添加,选择Apply应用。

image

配置完成后,在A机器上可以通过telnet localhost 1111访问C机器上的bbs.neu.edu.cn:23端口了。

image

再看看B机器的TCP连接情况

image

多了一条tcp        0      0 192.168.255.185:55043   202.118.1.82:23         ESTABLISHED,这个就是TCP Prot Forwarding的结果。

3、Socks代理

如果把TCP Port Forwarding看着是TCP的特定目的地址特定端口代理的话,那么Socks代理功能就是全能代理了,配合知名的Socks CAP v2,可以实现任何程序都通过服务器代理上网,也不用在服务器上安装任何代理软件(可谓是代理上网不留痕啊)。

配置Putty:

image

修改当前Session的配置(在标题栏上点击鼠标右键,选择“Change Settings”即可),在Connection->Tunnels

Source port:是在你本机监听的一个端口,也就是本机Socks代理的端口。

Destination:留空

类型选择:Dynamic(动态)

同样选择“Add”后选择“Apply”应用设置生效。

image

IE配置使用Socks代理方法如上图,使用IE访问互联网试试:

image

呵呵,测试而已。

记住,Socks代理利器:Sockscap,目前似乎最新版本是2.40。

4、WinSCP与Pageant

只要在客户端启动了Pageant,并且把相应的Key都加入到keylist中,在使用WinSCP的时候会自动使用Pageant中的私钥,无需使用密码。

image

之后选择Login即可,当然你也可以单独为某个主机选择一个私钥,个人比较习惯使用Pageant。

5、Key Agent Forwarding

前面已经介绍过使用Pageant的使用,在本机启用Pageant之后,登录任何服务器都不需要提供密码了,直接从Pageant取私钥进行验证。这种方式似乎有一点点缺陷,任何一台服务器都需要从A直接登录,即:

A ——–  B

|

C

必须从A登录B和A登录C,如果A登录B之后,想从B登录C,此刻系统仍然提示输入密码,试图通过密码验证来登录服务器。如果A无法直接访问C,最傻瓜的方法是A把私钥在B服务器上放一份,在从B登录C的时候使用B上面的私钥登录,这样大大的降低了私钥的安全性。

为了解决这样一个问题,Key Agent Forwarding就诞生了,其目的是只要你在A上开启了Pageant,你登录B之后,从B登录其它任何服务器,公钥验证都可以Forwarding到A上面来验证。即从B登录C也不需要输入密码了,在B上也不需要保存一份私钥文件。配置Key Agent Forwarding如下:

image

修改Session配置,Connection->SSH->Auth,选上Allow agent forwarding即可。

A ——  B —— C —— D

这样从A登录到B,在B通过ssh C可以直接使用公钥验证。

如果从在C上还希望ssh D也通过使用公钥验证,这在登录C的时候需要打开ssh的key agent forwarding,使用ssh –X C即可。

6、关于配置文件(段老师提供)

关于Session 配置的存储和备份,我补充一点,对于在多台计算机上使用putty或者系统备份与重装很有用:

1、Putty把session信息存储在注册表中,而不是配置文件里。要把配置信息导出来,可以用:

REG EXPORT HKCU\Software\SimonTatham\PuTTY Putty.reg

在新的计算机上导入:

REG IMPORT Putty.reg

2、使用另一个putty版本:portaPuTTY ,把session信息存储在配置文件,而不是注册表,可以算绿色软件了吧。软件下载地址:http://socialistsushi.com/2005/11/17/portaputty

7、其他

X11 frowarding … 等等功能,大家用用Google吧,都是SSH的功能,在Putty上也能体现。

结束语

罗罗嗦嗦的讲了一大堆,我自己都晕了,希望大家不要晕,能给不熟悉SSH和Putty的用户起到一个抛砖引玉的作用,或许某一天你会从你嘴里说出“Great SSH”。

Tuesday, March 10, 2009

Putty|精彩PuTTY 中文教程

精彩PuTTY 中文教程(解决乱码、X窗口、自动登陆等问题) - dzh001的博客 - 51CTO技术博客-领先的IT技术博客

精彩PuTTY 中文教程(解决乱码、X窗口、自动登陆等问题)


2007-09-01 01:43:02
 标签: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.


您可自由:
  • 复制、发行、展览、表演、放映、广播或通过信息网络传播本作品
  • 创作演绎作品
  • 对本作品进行商业性使用

惟须遵守下列条件:
署名. 您必须按照作者或者许可人指定的方式对作品进行署名。
  • 对任何再使用或者发行,您都必须向他人清楚地展示本作品使用的许可协议条款。
  • 如果得到著作权人的许可,您可以不受任何这些条件的限制。

您的合理使用以及其他权利不受上述规定的影响。

这是一份普通人可以理解的法律文本(许可协议全文) 的概要。
免责声明

序言

懒,是一个优点,有些时候还是要学一学才能会了的。
                                                   —— 柴锋(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)
www.google.com" style="width: 610px; height: 366px" src="http://docs.google.com/File?id=ajbgz6fp3pjh_69gmdqqn" />
www.google.com" style="width: 692px; height: 680px" src="http://docs.google.com/File?id=ajbgz6fp3pjh_70hsgsvx" />
知道是怎么回事么?

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%

附录

A 致谢
B 参考
本文出自 51CTO.COM技术博客