PuTTY 中文教程 2 (续1)
续 PuTTY 中文教程1
Pagent 加载密钥,每次开机后只需要输入一次密钥口令
终于轮到 Pagent 出场了,双击一下 Pagent.exe,嗯,没反应?再双击一下,咦?出来个提示,说已经运行了。
看看右下角吧,在这里呢
双击一下 Pagent 的图标,出来这样一个界面。很简洁的,Add Key 是添加私钥,Remove Key 是把选中的私钥从 Pagent 中卸载了。
好,现在单击 Add Key 按钮添加私钥,我把这个演示用的私钥保存到 C: 了
然后会出现输入密钥口令的对话框,输入正确的密钥后,单击 OK
这时,在 Pagent 的窗口中就能看到我们的私钥已经装载上去了。
现在打开 PuTTY,选择先前保存的 Session,双击一下。只要自动登录用户名设置上,主机上改帐户的 authorized_keys 文件里也有匹配的公钥。哈哈,发现没有?完全不需要口令,我们已经登录到系统了。
在 Pagent 的图标上点右键,也可以快捷的选择已经保存的会话。
建议大家把 Pagent 放到启动组里面,这样每次一开机,Pagent 自动运行,然后我们只需要把私钥装载一下,然后我们就可以一直享受自动登录系统的乐趣了。再配合上以后会讲到的 Plink、PSCP 这些,我们可以实现很多工作的自动化进行。完全不需要每次输入用户名、口令、输入又长又多的命令,再做一些烦躁的文件备份,最后还得记得注销系统,难道不觉得麻烦么?这一切烦恼很快就会远离我们了,继续往下看吧。
PuTTY 提供了两个文件传输工具
PSCP 通过 SSH 连接,在两台机器之间安全的传输文件,可以用于任何 SSH(包括 SSH v1、SSH v2) 服务器。
PSFTP 则是 SSH-2 中新增的特性,使用的是新的 SFTP 协议,使用上与传统的 FTP 类似。事实上 PSCP 如果发现 SFTP 可用,PSCP就会使用 SFTP 协议来传输文件,否则还是 SCP 协议。PSFTP 与 PSCP 相比,PSFTP 的优点是可以与服务器进行交互,遍历服务器上的文件系统,在一个会话中上传或下载多个文件。而 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 c:autoexec.bat foobarserver:backup/就把本地的 c:autoexec.bat 复制到了主机 demo-server 上的用户 taylor 所在的主目录下的 backup 子目录中(这个路径可能是 /home/taylor/backup
所以 PSCP 大致用法的例子就是:
pscp -P 22 -i c:pathyour-private-key.ppk -C username@server:/remote/path/
下面还是用一些实例来说明会比较简单一些:
把本地的 C:pathfoo.txt 复制到远程主机 192.168.6.200 的 /tmp 目录下
pscp c:pathfoo.txt 192.168.6.200:/tmp
把本地的 C:pathfoo.txt 复制到主机 192.168.6.200 的 /tmp 目录下,但是以主机上的用户 taylor 的权限执行
pscp c:pathfoo.txt taylor@192.168.6.200:/tmp
或者是
pscp -l taylor c:pathfoo.txt 192.168.6.200:/tmp
把本地的 C:pathfoo.txt 传送到主机 192.168.6.200 的 /tmp 目录下,但是主机的 SSH 端口是 3122
pscp -P 3122 c:pathfoo.txt 192.168.6.200:/tmp
把本地的 C:pathfoo.txt 复制到主机 192.168.6.200 的用户 taylor 的主目录下
pscp c:pathfoo.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 差不多,这里简单的说一下吧:
FileZilla : http://filezilla.sf.net
WinSCP : http://www.winscp.net
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都很类似。
还是用一些实际的例子来说明一下 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:tmpfoo
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:tmpbar
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:tmpfoo 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)

知道是怎么回事么?
安全、方便的使用 VNC,远程连接 VNC 不需要密码
vncviewer /listen二、创建一个 PuTTY 的反向隧道,源端口 5500,目标 localhost:5500,具体操作看前面的部分,别忘记点"Add"按钮哦。这个 5500 端口就是 vncviewer 的默认监听端口。

vncconfig -display :1 -connect localhost说一下两个个关键参数,一个是 display 后面的 :1 ,这是连接到第一个 vnc 实例上。另一个就是 connect 参数后面的 localhost,既然我们是在远程机器上输入的这个命令,那很显然,连接的就是远程机器。别忘了,我们在此之前设置了反向的 SSH 隧道,连接远程机器的本地 5500 端口,其实连接的就是我们自己机器的 5500 端口。
plink.exe -R 5500:localhost:5500 guantouping "vncconfig -display :1 -connect localhost"命令参数中的那个 "guantouping" 是 PuTTY 保存的会话名,也可以是远程机器主机名,把这个命令做成一个快捷方式,双击直接打开 VNC。
我在 PuTTY 官方网站下载的,可是执行 PuTTY、Pagent、PuTTYgen 时总是出错,而命令行执行的这几个却没问题
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>把下面的内容复制到记事本中,文件名保存为:PUTTY.exe.manifest
<!-- 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>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>把下面的内容复制到记事本中,文件名保存为:PUTTYGEN.exe.manifest
<!-- 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>
<?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>
屏幕输出太快了,怎么能暂停一下?
怎么翻页?
不是说 PSCP 一次只能传输一个文件么?为什么我发现能传输很多个?
为什么执行了 pscp、psftp、plink 这些命令总是说错误的命令呢?
set PATH=c:pathtoputty;%PATH%
在登录的时候出现 "Proxy error: 407 Proxy authorization require" 的错误提示
每次开机后我都要先打开 Pagent,然后再添加我的私钥,还要输入私钥密码,太麻烦了,有没有简单一点的办法呢?
我希望下次登录服务器的时候,还是能看到这次登录的界面,也就是说可不可以像 Firefox 那样保存 PuTTY 登录的会话呢?
这个问题很多人都会遇到,比如在进行一个长时间的数据处理,而且还不能放到后台执行。这时是不能关闭 PuTTY 的,万一网络状况不好突然断掉,或者是自己的机器死机必须重启,那我们难道只能眼巴巴的看着就要完成的工作付之东流?screen -RD然后保存会话,登录。嗯,接下来你会发现什么呢?当然是命令提示符了,然后 ls 一下,一切正常啊,GNU Screen 呢?看到了没?其实我们已经在 Gnu Screen 里面了,在有的系统上,你会看到 PuTTY 的标题已经变成了 screen,有的显示的就是主机名,不管怎样,我们已经运行在 GNU Screen 里面了。如果你发现 PuTTY 是一闪而过,没有登录上去,那估计就是 GNU Screen 没有安装成功。