8.3 OpenSSH客户端
本节内容涵盖ssh、scp和sftp客户端的安装与使用。
8.3.1 所需软件包
openssh-client软件包是默认安装的。不需要安装任何软件包就可以运行OpenSSH客户端。这里没有OpenSSH客户端的init脚本。
8.3.2 起步:使用ssh和scp
除了安装上面的所需软件包之外,ssh和scp客户端并不需要别的软件包,尽管可以创建并编辑几个文件让使用变得更加方便。为了在远程系统上运行安全的shell或者将文件安全地复制到远程系统上去或者从远程系统上复制文件,还必须满足以下条件:远程系统必须正在运行OpenSSH守护进程(sshd),在远程系统上必须有一个账号,服务器必须主动让客户端识别出自己。
在下面的示例中,用户Zach登录到名为plum的远程主机,然后给出了一条exit命令返回到本地系统的shell:
如果希望以自己的身份登录到远程系统,而且在本地系统和远程系统上具有相同的用户名,则可以忽略掉命令行中的user@(在上面的示例中就是zach@)。当第一次连接到远程OpenSSH服务器的时候,ssh或者scp会要求你确认是否连接到正确的系统。具体情况请参见8.3.3节第2小节中的“首次身份验证”。
下面的示例将ty1从本地系统的工作目录复制到plum系统上Zach的主目录中:
8.3.3 安装
本节描述如何在客户端上安装OpenSSH软件。
1. 推荐设置
X11转发
Ubuntu 提供的配置文件建立了基本安全的系统,这或许能够满足你的需求,也可能不会满足要求。你可能想要修改的一个OpenSSH参数是 ForwardX11Trusted(默认情况下设置为yes)。为了提高安全性(在某些情况下会降低可用性),可在Ubuntu的/etc/ssh /ssh_config配置文件中,将ForwardX11Trusted(参见8.3.7节)设置为no。有关X11端口转发的更多信息请参见8.6 节。
2. 服务器身份验证和已知主机
known_hosts、 ssh_known_hosts ~/.ssh/known_hosts(用户配置)和/etc/ssh/ssh_known_hosts(全局配置)这两个文件列出了本地系统已经连接到并能确定身份的主机。除了文件的所有者(对于第二个文件而言,它的所有者就是root)之外,其他用户不应该有这两个文件中任何一个文件的写权限。除了所有者之外,任何用户都不能够访问~/.ssh目录。
首次身份验证
当第一次连接到OpenSSH服务器的时候,OpenSSH客户端会给出提示,要求确认是否连接到正确的系统。这种检查有助于防止“中间人”攻击(man-in-the-middle attack,参见附录A.1.4的脚注3):
在响应上面的查询之前,一定要确信自己登录到正确的系统,而不是某个伪冒系统。如果不确定的话,就电话咨询某个以本地方式登录到该系统的人,这有助于确认自己是否登录到期望的系统。当回答yes(必须全部写出这个单词)之后,客户端将会把这个服务器的主机公钥(服务器上的/etc/ssh /ssh_host_rsa_key.pub或者/etc/ssh/ssh_host_dsa_key.pub文件中的一行)追加到该用户在本地系统上的~/.ssh/known_hosts文件中,如有必要就会创建~/.ssh目录。OpenSSH将服务器的名称和服务器的IP地址作为每行的前缀,这样就可以记录known_hosts的哪一行对应到哪一个服务器。
后面再使用OpenSSH连接到该服务器时,通过将这个密钥与服务器所提供的密钥进行比对,客户端就可以验证是否连接到正确的服务器。可以使用下面的命令来列出本地系统的RSA密钥指纹:
known_hosts文件
known_hosts 文件使用非常长的一或两行文本行来标识它所记录的每一个主机。每一行的开头均是该行对应的系统的主机名和IP地址,后面跟着所用的加密类型和服务器的主机公钥。当HashKnownHosts(参见8.3.7节)设置为yes(默认情况下)时,为了安全起见,OpenSSH就将系统的名称和地址进行散列。因为它将主机名和IP地址分别散列,所以OpenSSH分别为每个主机在known_hosts中加入两行文本行。下面的文本行(它们是两个逻辑行,每一行自动换行成多个物理行)摘自known_hosts,用来使用RSA(参见术语表)加密算法连接到某个远程系统:
可以在ssh-keygen带上-R选项后跟一个主机名来移除某个散列项。ssh-keygen的-F选项可以显示known_hosts文件中与指定系统相对应的文本行,即使该项已经散列:
OpenSSH 自动将所连接的服务器的密钥保存到用户私有文件中(~/.ssh/known_hosts)。这些文件只能用于它们所在目录的所有者。如果以root用户身份进行操作,然后使用文本编辑器,就可以将某个用户的私有已知主机列表中的若干没有被散列的行复制出来,添加到/etc/ssh /ssh_known_hosts文件中的公开列表中,这样就可以让某个服务器成为本地系统上所有用户的已知主机。
下面的示例显示了Sam(具有管理权限)是如何将被散列的项从他的known_hosts文件中取出并放入到全局ssh_known_hosts文件中的。首先,Sam(以自己的身份运行)将ssh-keygen的输出结果经过管道发送给tail以去掉Host plum found行,并将该输出重定向到名为tmp_know_hosts的文件中。然后,Sam以root特权身份运行,将他刚创建的文件的内容追加到 /etc/ssh/ssh_known_hosts中。如果该文件不存在,这条命令可以创建该文件。最后,Sam删除他创建的临时文件,之后返回到自己的用户身份。
因为cat的输出经过重定向,所以Sam以root特权身份创建了一个shell(sudo -i)来执行命令。关于对sudo下运行的命令的输出进行重定向的讨论请参见1.1.1节。
如果已经将远程系统的公钥保存到这些已知主机文件中的某一个文件中去,而在系统连接的时候发现该远程系统提供了不同的“指纹”,那么OpenSSH将会显示下面的消息,而不会完成连接:
如果看到了这条消息,那么说明你可能受到了“中间人”攻击。但是,更有可能的是,远程系统上的某些部分发生了变化,从而导致它提供了新的“指纹”。找远程系统的管理员核实一下真实情况。如果没有什么问题的话,就将有问题的密钥从指定文件中删除(在上面的示例中,倒数第3行指出了需要删除的行),然后再次尝试连接。可以使用ssh-keygen带-R选项,后面跟着某个主机名,用来删除某个散列的项。在OpenSSH要求确认你连接到正确的系统的时候,将会再次遇到首次身份验证情形。遵循初次连接到该远程主机时所采用的步骤重新来过。
8.3.4 ssh:连接到远程系统或者在远程系统上执行命令
ssh命令行的格式如下:
ssh [options] [user@]host[command]
其中,host为想要连接到的OpenSSH服务器(远程系统)的名称,它是惟一的必需参数。host可以是某个本地系统的名称,也可以是因特网上某个系统的FQDN(参见术语表)或者是一个IP地址。命令ssh host登录到远程系统host,使用的用户名与正在本地系统上使用的用户名完全相同。如果希望登录的用户名与正在本地系统上使用的用户名不同,那么就应该包含user@。根据服务器设置的不同,可能还需要提供口令。
打开远程shell
如果没有提供command参数,ssh就会让你登录到host上去。远程系统显示一个shell提示符,然后就能够在host上运行命令。命令exit将会关闭与host的连接,并返回到本地系统的提示符。
在下面的示例中,Sam(登录到dog)使用ssh登录到plum,然后使用命令who am i(该命令会显示登录所使用系统的IP地址),最后使用exit关掉与plum的连接,并返回到本地系统的提示符:
执行远程命令
如果包含了command参数,ssh就会登录到host,执行command,关闭与host的连接,然后将控制返回到本地系统。远程系统不曾显示提示符。
下面的示例在远程系统plum上的memos目录下面运行ls命令。这个示例假设运行该命令的用户(Sam)在plum上有一个登录账号,而memos目录就是Sam在plum上的主目录:
对于下面这个示例,假设文件memo.new位于本地系统(dog)的工作目录中。你不能记起这个文件里是否做过某些修改或者是否曾经将这些修改同步到 plum上的文件memo.draft。可以将memo.draft复制到本地系统中,然后运行diff(参见《基础篇》5.3.9节)比较这两个文件,但是这样就会在两个系统上保存了同一文件的3份类似副本。如果在完成之后忘记删除旧的副本,那么几天之后你自己就会分不清哪个文件是最新的了。与其复制文件,不如使用ssh:
在运行ssh时,这条命令(在远程系统上运行)的标准输出将会传送到本地shell,就像是这条命令在本地系统中运行一样。跟所有shell命令一样,如果不希望本地系统解释某些特殊字符,就必须将这些特殊字符用引号引起来。在上一个示例中,plum上cat命令的输出通过dog上的一个管道发送到 diff(在dog上运行),diff拿本地文件memos.new与标准输入(-)进行比较。下面的命令行具有同样的效果,但是会让diff在远程系统上执行:
远程系统上diff的标准输出被发送到本地shell,然后显示在屏幕上(因为没有进行重定向)。
选项
本节讨论的是可以用到的一些ssh选项。
-C
(compression) 启用压缩功能。(在ssh的商业版本中,“-C”关闭压缩功能,而“+C”则开启压缩功能。)
-f
(not foreground) 在询问口令之后且在执行command之前,将ssh送到后台运行。如果希望在后台执行command但是又必须输入口令的话,这个选项就特别有用。该选项还暗含着-n选项。
-L
将本地系统中的某个端口转发到远程系统。更多信息请参见8.6节。
-l user
(login)试图以user用户身份进行登录。
-n
(null)将ssh的标准输入重定向,从/dev/null获取输入。如果在后台运行ssh的话(-f选项),就需要这个选项。
-o option
(option)按照配置文件所用的格式来指定option(参见8.3.7节)。
-p
(port)指定要连接到的远程主机的端口。通过使用配置文件中的host声明(参见8.3.7节),可以为你所连接到的每个系统指定不同的端口。
-R
将远程系统上的某个端口转发到本地客户端。更多信息请参见8.6节。
-t
(tty)为远程系统上的ssh进程分配一个伪tty(终端)。如果没有使用这个选项,当你在远程系统上运行某条命令的时候,ssh不会为该进程分配tty(终端)。相反,ssh将会把远端进程的标准输入和标准输出附加到ssh会话上去,这通常就是你所希望的(但并非总是如此)。这个选项将强制ssh在远端系统上分配tty,这样那些需要tty的程序就能够正常运行。
-v
(verbose)显示与连接和传送有关的调试信息。如果命令运行不太正常的话,这个选项就会非常有用。
-X
(X11)开启不可信X11转发。如果在配置文件中开启X11不可信转发的话,这个选项就没有必要。更多信息请参见8.6节的“X11转发”部分。
-x
(X11)关闭X11转发。
(X11trusted)开启可信X11转发。如果在配置文件中开启X11可信转发的话,这个选项就没有必要。更多信息请参见8.6节的“X11转发”部分。
8.3.5 scp:从/向远程系统复制文件
实用工具scp(secure copy,安全复制)将一个普通文件或目录文件从一个系统复制到网络上的另一个系统(包括两个远程系统)。这款实用工具使用ssh来传递文件,并使用与 ssh一样的验证机制。因此,它能够提供与ssh一样的安全性。如果需要的话,实用工具scp会要求输入口令。scp命令的格式如下:
scp [[user@]from-host:]source-file[[user@]to-host:][destination-file]
其中,from-host和to-host为两个系统的名称,分别表示文件复制操作的源和目的地。参数from-host和to-host可以是本地系统名称、因特网上系统的FQDN(参见术语表)或者IP地址。当未指定主机时,scp会假设为本地系统。两个系统上的user都默认为本地系统上正在输入该命令的那个用户。可以用user@来指定不同的用户。
source-file是待复制的文件,destination-file是最终副本。确保自己拥有待复制文件的读权限以及存放最终副本的目录的写权限。可以采用相对路径名或者绝对路径名的方式指定普通文件或目录文件。(相对路径名是相对于指定的路径,或隐含相对于主目录。)如果source-file是一个目录,就必须使用选项-r来复制该目录的内容。如果destination-file是一个目录,则所有源文件都保持原来的简单文件名。如果没有指定destination-file,那么scp将其假设为用户的主目录。
假设Sam在plum系统上还有一个用户名sls。在下面的示例中,Sam使用scp将他在plum上的账号sls的主目录中的文件memo.txt复制到本地系统上的工作目录中的allmemos目录。如果allmemos不是目录名,那么memo.txt将被复制到工作目录下名为allmemos的文件中。
在传送过程中,已传送百分比和字节数不断增长,剩余时间在不断减少。
在下面的示例中,Sam(在peach上操作)将前一个示例中的同一个文件复制到Sam在speedy上的主目录中名为old的目录中去。要想成功运行这个示例,Sam必须能够使用ssh从plum上登录到speedy,无须输入口令。更多信息请参见8.4.4节。
选项
本节讨论能够用到的一些scp选项。
-C
(compression,压缩)启用压缩。
-o option
(option,选项)使用配置文件(稍后讨论)中所用的格式来指定选项option。
-P port
(port,端口)连接到远程主机的端口port。这个选项作为scp选项时是大写,而作为ssh选项时是小写。
-p
(preserve,保留)保留原始文件的修改时间、访问时间以及模式。
-q
(quiet,安静)在scp复制文件时不显示进度信息。
-r
(recursive,递归)递归复制目录层次。
-v
(verbose,详细信息)显示与连接以及传送有关的调试信息。如果出现一些不正常的状况,那么这个选项就非常有用。
8.3.6 sftp:安全的FTP客户端
作为OpenSSH的一部分,Ubuntu Linux提供了sftp,它是一种安全性更高的ftp(参见第9章)替代品。在功能上,sftp等同于ftp,它将ftp命令映射成OpenSSH命令。当登录到一台运行OpenSSH守护进程(sshd)的服务器上时,可以用sftp替代ftp。一旦连接到运行sftp的系统,输入命令?显示命令列表。对于安全的通信,使用sftp或scp来执行所有需要身份验证的文件传送任务。更多信息请参见sftp的手册页。
lftp
Ubuntu 还提供lftp,lftp支持sftp并且比sftp更高级。lftp提供了一个与shell类似的命令语法结构,该语法结构具有许多特性,包括支持 tab键自动补全功能和在后台运行任务的能力。使用/etc/lftp.conf来配置lftp,更多信息请参见lftp的手册页。
8.3.7 配置文件~/.ssh/config和/etc/ssh/ssh_config
一般不需要修改OpenSSH客户端配置文件。对于给定用户,共有两个配置文件:~/.ssh/config(用户专用)和/etc/ssh/ssh_config(全局共享)。要按照该顺序读取这些文件,对于给定的某个参数,它使用的是读取过程中发现的第一个配置。用户可以通过以下方式将全局参数设置覆盖掉:在自己的用户配置文件中设置同样的参数即可。在ssh或scp命令行上给出的参数的优先级要高于这两个文件中所设置的参数的优先级。
用户的~/.ssh/config文件必须由该用户所有(他是目录“~/”的所有者),并且除了所有者之外任何人都不能写入该文件。否则客户端就会给出一条错误消息然后退出。这个文件的模式通常被设为600,这是因为除了它的所有者之外任何人没有理由能够读取它。这些配置文件中的配置行包含着声明,这些声明均以某个关键字(不区分大小写)开头,后面跟着空格,最后是参数(区分大小写)。可以使用关键字Host,让声明只作用于特定的系统。Host声明作用于它与下一条Host声明之间的所有配置行。
CheckHostIP yes | no
如果将其设置为yes(默认值),那么除了用known_hosts文件中的主机名之外,还可以采用IP地址来识别远程系统。若设置为no,则只使用主机名。将CheckHostIP设置为yes可以提高系统的安全性。
ForwardX11 yes | no
如果设置为yes,那么自动通过一条安全通道以不可信模式来转发X11连接,但是并不设置shell变量DISPLAY。如果 ForwardX11Trusted也设置为yes,那么连接以可信模式转发。此外,可以在命令行上使用选项-X以不可信模式重定向X11连接。这个参数的默认值是no。要想让X11转发起作用,还必须将服务器上的/etc/sshd_config文件中的X11Forwarding设置为yes(参见 8.4.6节)。更多信息请参见8.6节的“X11转发”部分。
ForwardX11Trusted yes | no
与 ForwardX11一块使用时,ForwardX11必须设置为yes(默认),这个声明才能起作用。当这个声明设置为yes(默认),而 ForwardX11也设置为yes时,这个声明将设置shell变量DISPLAY,并给予远程X11客户端对原来的(服务器)X11显示的完全访问权限。此外,可以在命令行上使用选项-Y以可信模式重定向X11连接。这个声明的默认值是no。要想让X11转发起作用,还必须将服务器上的/etc /sshd_config文件中的X11Forwarding设置为yes(参见8.4.6节)。更多信息请参见8.6节的“X11转发”部分。
HashKnownHosts
当设置为yes时, OpenSSH会将文件~/.ssh/known_hosts中的主机名和地址进行散列。当设置为no时,主机名与地址将以明文形式写入。Ubuntu Linux将这份声明设置为yes来提高系统的安全性。关于known_hosts文件的更多信息请参见8.3.3节第2小节。
Host hostnames
指定它后面的(直到下一个主机声明为止)声明只适用于与hostnames相匹配的主机。Hostnames可以包含?与*通配符。单个的*指定所有主机。如果没有这个关键字,任何声明都适用于所有主机。
HostbasedAuthentication yes | no
当设置为yes时,尝试进行rhosts身份验证。对于安全性要求较高的系统,设置为no(默认)。
HostKeyAlgorithms algorithms
其中algorithms是一个由逗号隔开的算法列表,客户端按照优先级顺序依次使用这些算法。从ssh-rsa或ssh-dss中选择algorithms(默认值为“ssh-rsa, ssh-dss”)。
Port num
使OpenSSH通过num端口与远程系统连接。默认值为22。
StrictHostKeyChecking yes | no | ask
决定OpenSSH是否将主机密钥添加到用户的known_hosts文件中以及如何添加。如果将该选项设置为ask,那么在连接新系统时会询问是否添加主机密钥;如果设置为no,就会自动添加主机密钥;如果设置为yes,就要求手工添加主机密钥。若将参数设置yes或ask,则当某系统的主机密钥发生改变之后,OpenSSH会拒绝连接到该系统。对于安全性要求较高的系统,请将此参数设置为yes或ask。默认为ask。
TCPKeepAlive yes | no
如果设置为yes(默认值),就定期检查连接是否存活。如果服务器崩溃或者由于其他原因导致连接死掉,那么这种检查将会导致ssh或scp连接中断,即便连接只是暂时死掉。若将这个参数设置为no,则会导致客户端不去检查连接是否存活。
这项声明用到了TCP keepalive选项,它未经加密,并且容易受到IP欺骗(参见术语表)。如果希望采用能够防止IP欺骗的替代品,那么可以采用基于服务器的相关技术,请参见8.4.6节中的“ClientAliveInterval”。
User name
指定登录系统时所用的用户名。可用Host声明来指定系统。该选项意味着,在远程系统上登录时,如果使用的用户名不同于在本地系统上登录所用的用户名,那么不必在命令行上输入用户名。







http://book.csdn.net/bookfiles/1056/100105631576.shtml