【转】putty 及其相关工具 使用(pscp、psftp、plink)

来源:互联网 发布:日信证券软件 编辑:程序博客网 时间:2024/05/16 14:03

 

随着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 的使用是很简单的,把常用的几个选项说一下:

  • -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,登录到服务器上,然后再一个一个的执行命令,最后还得注销来的方便快捷么?