第五章:用PSCP安全传输文件
(本文中,“参数”和“选项”均为同一个意思,可互换。)
PSCP是PuTTY的一个安全传输文件的客户端工具,它利用SSH连接在不同的计算机之间传文件。
如果你有一个安装有SSH-2的服务器,并且要和服务器进行交互式对话,请用PSFTP工具(详见第六章)。然而,PSFTP不能在SSH-1的服务器下工作。
5.1运行PSCP
PSCP是一个命令行的应用程序。也就是说,你不能双击它运行,只能在windows控制台的命令提示符下运行。(点击:开始-所有程序-附件-命令提示符)。
要使用PSCP,可以在PSCP所在目录下使用,也可以设置环境变量PATH,以便在任何目录下都可直接使用。即在autoexec.bat文件中,设置像这样的:
set PATH=C:\path\to\putty\directory;%PATH%,
根据自己文件的实际路径,修改上面的set语句。
5.2 PSCP用法
在windows控制台下(即在ms-dos命令行提示符下),只输入PSCP就可出现关于PSCP的用法说明,并告知当前PSCP的版本,以及PSCP各参数的简要说明。
C:\>pscp
PuTTY Secure Copy client
Release 0.76
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
显示PGP密码指纹并退出。
-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
强制使用SSH-1或SSH-2协议
-ssh -ssh-connection
force use of particular SSH protocol variant
-4 -6 force use of IPv4 or IPv6
强制使用IPv4或IPv6
-C enable compression
使用压缩
-i key private key file for user authentication
使用个人密码文件
-noagent disable use of Pageant
-agent enable use of Pageant
-no-trivial-auth
disconnect if SSH authentication succeeds trivially
若SSH正常授权,则断开连接
-hostkey keyid
manually specify a host key (may be repeated)
手动指定主机键值
-batch disable all interactive prompts
-no-sanitise-stderr don't strip control chars from standard error
-proxycmd command
use 'command' as local proxy
-unsafe allow server-side wildcards (DANGEROUS)
-sftp force use of SFTP protocol
-scp force use of SCP protocol
-sshlog file
-sshrawlog file
log protocol details to a file
-logoverwrite
-logappend
control what happens when a log file already exists
(PSCP的界面与UNIX的SCP命令非常相似)
5.2.1基本用法
从远程服务器接收一个(或多个)文件:
pscp [options] [user@]host:source target
例如,用户fred,从服务器上拷贝 /etc/hosts 文件到本地的c:\temp\example-hosts.txt,可以输入:
pscp fred@:/etc/hosts c:\temp\example-hosts.txt
发送一个(或多个)文件到远程服务器:
pscp [options] source [source...] [user@]host:target
例如,用户fred,发送本地文件c:\documents\foo.txt到服务器上的 /tmp/foo,可以输入:
pscp c:\documents\foo.txt fred@:/tmp/foo
你也可以用通配符*拷贝多个文件到目录中:
pscp c:\documents\*.doc fred@:docfiles
pscp fred@:source/*.c c:\source
然而,在第二个例子中(在远程文件中使用通配符),可能会出现这样的警告信息:“警告:远程主机试图写 “terminal.c”文件。如果你是输入的通配符,请升级到SSH-2或者用参数“-unsafe”。不允许对此文件更名。”
(这主要是基于安全方面的原因,不赘述)
只要有可能,PSCP将先尝试用SFTP协议(SSH-2的一部分)来处理,这样就可避免这个安全缺陷,也不会看到这个警告信息了。(若可以,你也可以强制使用SFTP协议,用参数-sftp,详见section5.2.2.6)
如果你非要在SSH-1下用通配符,在命令行上加上参数-unsafe,如下例:
pscp -unsafe fred@:source/*.c c:\source
这将忽视这个警告信息,并开始文件传输。然而,这个参数选项让远程服务器能写任何文件到你的目标目录。只有在你信任远程服务器的管理员,没有恶意(或服务器没有被恶意的人破坏)情况下,你才能使用这个参数。替代方案,你可以建一个新的空目录,来下载文件。
5.2.1.1用户(名)
即远程服务器的登录名。如果省略,并且主机名是一个PuTTY中保存的会话(设置),则PSCP就会用被保存的会话中的用户名。除此之外,PSCP会试着用本地windows的用户名。
5.2.1.2主机(名)
即远程主机名,或一个PuTTY保存的会话名(即简略形式)。在后者情况下,会话设置了主机名、端口、密码、用户名。
5.2.1.3源文件
一个或多个源文件。可以用通配符。用哪一种通配符形式取决于操作系统。若从windows系统向UNIX系统拷贝文件,应该遵循windows通配符的语法(*.*),但若从UNIX系统向windows系统拷贝文件,则用UNIX的通配符(*)。
若源文件是一个远程文件,你又没有指定一个完整的路径(UNIX中,路径用反斜杠 /),路径就会基于你的主目录(home)来确定。
5.2.1.4 目标文件
当你从远程服务器上拷贝文件到本机时,你可能只是想就拷贝到当前目录(即不重新指定文件名),那么,指定目标文件为 . 即可,例如:
pscp fred@:/home/tom/.emacs .
拷贝远程服务器上的/home/tom/.emacs到当前目录。
若目标文件是远程文件,你又没有指定完整的路径,那么目录就会基于你的主目录(home)来确定。
5.2.2选项(参数)
(本文中,“参数”和“选项”均为同一个意思,可互换。)
除了极个别在文件传输中无用的参数,PuTTY中的参数大多数都可以在PSCP中使用,详见3.11.3(PSCP不支持的参数已被明确标示出来)。PSCP也有自己专有的参数,下面的部分会介绍。
5.2.2.1-ls显示远程文件
命令行中加了选项 -ls,则没有文件会被传输,而是远程文件会被列出来。只要指定一个远程主机名和目录名即可,例如:
pscp -ls fred@:dir1
5.2.2.2-p 保留文件属性
默认状态下,用PSCP拷贝文件时,会变更时间戳,用参数-p则会保留原文件的时间戳。
(如,远程文件是1234年5月6日建立或修改的,则拷贝到本地时,则会变成拷贝时的时间)
5.2.2.3-q 安静模式,不要显示进度
默认状态下,PSCP显示文件传输的进度:
mibs.tar | 168 kB | 84.0 kB/s | ETA: 00:00:13 | 13%
上面一行,从左到右,依次显示的是:文件名、已传输的文件尺寸、传输速度、剩余传输时间、已传输文件百分比。加了参数-q,则不会显示这些信息。
5.2.2.4-r (递归)拷贝目录
默认状态下,PSCP将只拷贝文件。你指定的任何目录及其下面的文件都被跳过。选项-r告诉PSCP拷贝你指定的目录以及其中的文件。这个参数可以让你在主机间传送整个目录结构。
5.2.2.5-batch 避免交互式提示
若用了参数-batch,则PSCP在建立连接时,不会给出任何交互式提示。如果主机名无效,则连接会中断,而不会问你是否试一下其他的连接。
5.2.2.6-sftp,-scp 强制使用指定的传输协议
如上面5.2.1中提到的,有两种SSH的文件传输协议。尽管PSCP的名字更与SCP相近(像其他的那些看上去类似SCP的客户端软件一样),但它其实两种协议都能用。
旧的SCP协议没有一个规范的写法,并留下了许多坑。虽然这种协议比较简单,比如各种平台的通配符的写法都支持,但也导致了如5.2.1中描述的问题。
新的SFTP协议,通常在SSH-2服务器上使用,以一种独立的方式对各自写法进行了规范,比如通配符的写法。这就使各种写法在各平台都是一致的,更符合书写和自动化,并避免了通配符的安全问题。
通常,PSCP先用SFTP协议,实在不能用,才用SCP协议。
选项-SCP强制使用SCP协议,用不起,则退出。
选项-PSCP强制使用SFTP协议,用不起,则退出。使用SSH-1的服务器,根据其设置决定是否能用-PSCP选项。
5.2.2.7 -no-sanitise-stderr不删除错误信息
参数-no-sanitise-stderr将服务器的标准错误码原封不动的发送过来,包括一些控制字符,并且是一些彩色字符。这可能有用,但也可能把屏幕弄得五花八门。更多的讨论,详见7.2.3.5。
5.2.3返回值
PSCP可以返回错误码,若文件正常传输,则返回0。你可以用一个像下面这样的批处理文件来进行测试:
pscp file*.* user@hostname:
if errorlevel 1 echo There was an error
5.2.4使用公钥
与PuTTY一样,PSCP可以用公钥来替代密码。有三个方法:
第一种,PSCP用在PuTTY中保存的会话(设置)来替代主机名(详见5.2.1.2),可以这样操作:
运行PuTTY,并创建一个会话(设置)指定你的个人密码文件,也可同时指定一个登录的用户名。在PSCP中,你用保存的会话(设置)名来代替主机名,输入:PSCP 设置名:文件名 本地文件名
第二种,使用参数-i,你能在命令行中加上个人密码文件,详见3.11.3.18。
第三种,PSCP可以用Pageant(详第9章)的授权,这样做:
先运行Pageant,并保证个人密码保存在其中。在PSCP中指定一个用户名和主机名。PSCP将自动搜寻Pageant并用其中的密码。
更多的公钥信息,详见第8章。