ssh

OpenSSH客户端的远程注册程序


语法格式

ssh [-1246CfgMnNqstTvVy] [-b bindaddr] [-c cipher] [-e escchar] [-F conf]
 [-i idfile] [-l login] [-o sshopts] [-O ctrlcmd] [-p port] [-S ctrlpath]
 [user@]host [cmd]
ssh [--help] [-V]

命令简介

ssh(SSH客户端软件)是一个终端仿真程序,用于注册远程主机,访问远程系统,执行其中的命令。ssh的设计目标是采用加密的通信方式,在不安全的网络上为相互信任的系统之间提供一个安全的信道,以替代rlogin、rsh和telnet等传统的远程注册程序。此外,也可以在安全的信道建立X11连接等。

ssh可以使用指定的用户身份user(选用的,省略时为当前用户)连接并注册到指定的主机host。如果指定了命令参数cmd,表示仅仅在远程系统中执行指定的命令后立即返回,而非注册到远程系统,交互访问远程系统。有关主机与用户身份认证的方法与说明详见“认证”一节。

除了系统配置文件ssh_config之外,ssh还可以从基于用户的配置文件~/.ssh/config中获取配置数据。

在注册OpenSSH远程服务器时,在开始执行用户注册Shell之前,ssh首先会读取并执行系统初始化文件/etc/ssh/sshrc和用户初始化文件~/.ssh/rc中的命令。

ssh通常会设置LOGNAME、USER或PATH等环境变量。此外,如果OpenSSH服务器允许,ssh也会读取~/.ssh/environment文件(如果存在),设置用户定义的变量。参见OpenSSH服务器sshd_config配置文件中的PermitUserEnvironment选项。此外,如果以后台方式运行ssh,当需要读取密码或密码短语时,也可以设置SSH_ASKPASS变量,以便ssh能够执行其中定义的程序,打开一个窗口读取密码或密码短语。

命令选项

-1  强制ssh仅使用OpenSSH协议版本1连接远程主机。

-2  强制ssh仅使用OpenSSH协议版本2连接远程主机。

-4  强制ssh仅使用IPv4地址连接远程主机。

-6  强制ssh仅使用IPv6地址连接远程主机。

-b bindaddr  使用本地系统的捆绑地址bindaddr作为连接的源地址。仅当本地系统存在多个IP地址时这个选项才有用。

-c cipher  选择会话加密时采用的密码规范。OpenSSHv1支持单一的密码规范,如3des、blowfish和des。3des是一种利用不同密钥实现加密-解密-再加密的三重DES加密方法,比较安全,也是默认的密码规范。blowfish是一种快速的数据块密码,非常安全,速度也比3des快。仅当早期的OpenSSHv1不支持3des密码时ssh才会选用des。由于des的安全性是三者中最弱的,通常不建议选用des密码。在OpenSSHv2中,密码规范是一组按优先顺序列出的密码表,中间加逗号分隔符。

-C  压缩所有的数据,包括标准输入、标准输出、标准错误输出,以及转发的X11与TCP连接上的数据。这里采用的压缩算法与gzip是相同的,且在OpenSSHv1中,压缩级别可由ssh配置文件中的CompressionLevel配置选项控制。因此,可以在ssh配置文件中采用基于主机的方式设置压缩级别的默认值。

-e escchar  设置pty会话期间使用的转义字符(默认的转义字符是“~”)。仅当位于数据行行首且在输入转义字符立即按下Enter键时,ssh才能识别转义字符。紧随转义字符之后输入一个句点“.”将会关闭当前的连接。紧随转义字符之后输入一个Ctrl-Z将会挂起当前的连接。“~&”表示挂起当前的连接,等待ssh终止执行。“~B”表示向远程系统发送一个BREAK信号。“~C”表示打开ssh交互命令行。紧随转义字符之后再输入一个转义字符(“~~”)表示仅发送一个转义字符。输入“~?”可以显示所有可用的转义字符列表。如果把escchar设置为none,将会禁用转义字符,使得整个会话完全透明。此外,也可以在ssh_config配置文件中,利用EscapeChar选项设置转义字符。

-f  在真正开始执行之前,令ssh进入后台运行模式。当ssh需要用户提供密码或密码短语,而用户又希望ssh以后台方式运行时,这个选项是非常有用的。指定“-f”选项也蕴含指定了“-n”选项。

-F conf  指定基于用户的ssh配置文件(默认的配置文件是~/.ssh/config)。如果在命令行中指定了基于用户的ssh配置文件,ssh将会忽略默认的系统配置文件/etc/ssh/ssh_config。

-g  允许远程主机连接到本地的转发端口。

-i idfile  指定一个密钥文件,以便能够使用其中的私钥与远程系统进行认证。在OpenSSHv1中,默认的密钥文件是~/.ssh/identity。在OpenSSHv2中,默认的密钥文件是~/.ssh/id_rsa(RSA认证)与~/.ssh/id_dsa(DSA认证)。在ssh的配置文件中,可以针对不同的主机指定不同的密钥文件。在ssh命令行中,可以同时指定多个“-i”选项(ssh配置文件中也可以指定多个密钥)。

-l login  指定以哪个用户身份注册远程系统,也可以在ssh配置文件中使用User配置选项指定基于主机的远程注册用户。

-M  令ssh客户端软件处于主(master)进程模式,以共享网络连接。如果同时指定多个“-M”选项,处于主进程模式的ssh在接受共享连接请求前需要确认。参见ssh_config(5)配置文件中有关ControlMaster配置选项的详细说明。

-n  把标准输入重定向到/dev/null,防止ssh读取标准输入。当需要以后台方式运行ssh时必须指定这个选项。注意,如果ssh需要用户提供密码或密码短语,则无法将ssh置于后台工作模式,参见“-f”选项。

-N  禁止执行远程目录。这个选项仅适用于OpenSSHv2的转发端口。

-o sshopts  采用ssh_config配置文件的格式(如“-o Protocol=2”),向ssh传递指定的配置选项。当ssh没有单独的命令行选项时,使用“-o”选项指定配置选项是非常有用的。可用的配置选项详见ssh_config配置文件的说明。

-O ctrlcmd  控制负责多路活动连接的主(master)进程。其中,ctlcmd是传递给主进程的参数,有效的参数是check(检查主进程是否正在运行)和exit(请求终止主进程)。

-p port  指定连接远程主机时使用的端口。也可以在ssh配置文件中指定基于主机的远程主机端口,如“Port =22”。

-q  安静运行模式。禁止输出大部分警告与诊断信息。

-s  用于调用远程主机中的子系统。子系统是OpenSSHv2提供的一个功能特性,便于其他应用(如sftp)利用OpenSSH的安全传输作为底层支持。注意,所谓的子系统实际上只是远程系统中的一个命令,参见OpenSSH服务器sshd_config配置文件中的subsystem选项。

-S ctrlpath  指定用于网络连接共享的控制套接字的位置。参见ssh_config配置文件中有关ControlPath与ControlMaster配置变量的说明。

-t  强制分配伪TTY终端,以便在远程系统中执行基于屏幕的程序。多个“-t”选项能够强制ssh分配伪TTY终端,即使ssh没有本地的伪TTY终端。

-T  禁止分配伪TTY终端。

-v  详细显示模式。显示ssh的内部处理过程与动作,输出调试信息,有助于诊断连接、认证以及配置等方面的问题。同时指定多个“-v”选项(最多3个)将会愈发增加输出信息的详细程度。

-y  使用syslog系统模块发送日志信息。通常,ssh的输出信息将会直接送到标准错误输出。

-V  显示命令的版本信息,然后退出。

认证

OpenSSH客户端的远程注册程序ssh支持OpenSSH协议版本1与2。协议版本2是默认的。如果服务器端不支持,自动降级为协议版本1。使用ssh_config配置文件中的Protocol选项,或在命令行中使用“-1”或“-2”选项,可以修改当前使用的协议版本。两个协议版本均支持类似的认证方法,但协议版本2能够提供附加的信用保障机制(采用AES、3DES、Blowfish、CAST128或Arcfour等加密算法加密传输数据)与完整性检测机制(hmac-md5、hmac-sha1、umac-64和hmac-ripemd160等),因而更受青睐。

可用的认证方法是基于GSSAPI的认证、基于主机的认证、公钥认证、询问-响应认证和密码认证。ssh采用上述的顺序依次尝试每一种认证方法。在协议版本2中,可以使用PreferredAuthentications配置选项改变默认的认证顺序。

基于主机认证的工作过程如下:如果用户注册时使用的主机位于远程系统/etc/hosts.equiv或/etc/ssh/shosts.equiv文件的列表中,且用户名在两个系统中是相同的,或者远程系统用户主目录存在~/.rhosts或~/.shosts文件,其中存在一行包含客户端主机的名字以及客户端主机中的用户名,则允许相应的用户注册。此外,作为服务器的远程系统必须能够验证客户端主机的密钥(参见下面即将介绍的/etc/ssh/ssh_known_hosts与~/.ssh/known_hosts文件的说明),方允许其注册。

公钥认证的工作过程如下:公钥认证是基于公钥密码方法实现的。公钥密码采用单独的密钥实现加密和解密,而且从加密的密钥中无法导出解密的密钥。其基本思路是,每个用户可以创建一对用于认证的公钥与私钥。服务器知道公钥,但只有用户自己知道私钥。ssh采用RSA或DSA算法自动实现公钥认证协议。协议版本1仅限于使用RSA密钥,协议版本2可以选用任何一种密钥。

~/.ssh/authorized_keys文件包含允许注册的RSA或DSA公钥列表。当用户注册时,ssh告诉服务器应使用哪一对密钥认证。客户端证实自己已访问私钥,而服务器应检测相应的公钥,确定是否接受用户的注册要求。

当需要创建密钥对时,用户可以运行ssh-keygen命令。生成的私钥将会存储在用户主目录中的~/.ssh/identity(协议版本1)、~/.ssh/id_dsa(协议版本2 DSA)或~/.ssh/id_rsa(协议版本2 RSA)文件中,公钥存储在~/.ssh/identity.pub(协议版本1)、~/.ssh/id_dsa.pub(协议版本2 DSA)或~/.ssh/id_rsa.pub(协议版本2 RSA)文件中。然后,用户应当把公钥复制(或追加)到远程系统自己的用户主目录中的~/.ssh/authorized_keys文件中。authorized_keys文件相当于传统的~/.rhosts文件,每行包含一个用于认证的公钥(尽管一行可能非常长)。之后,无须提供密码,用户即可注册到远程系统。

询问-响应认证的工作过程如下:服务器发送任意一个“询问”文字,提示用户给予响应。协议版本2允许使用多个询问-响应序列,协议版本1仅限于使用一个询问-响应序列。询问-响应认证的例子是BSD认证(参见login.conf(5))和PAM认证。

最后,如果上述认证方法均失败,ssh将会提示用户输入密码,输入的密码将发送到远程主机进行检验。注意,ssh环境中的所有通信都是加密的,即使监听网络通常也无法轻易看到密码明文。

ssh自动维护和检测包含所有已知主机身份信息的文件。主机密钥存储在用户主目录的~/.ssh/known_hosts文件中。此外,ssh也会自动检测/etc/ssh/ssh_known_hosts文件,检索已知的主机。任何新的主机都会自动加到用户主目录的~/.ssh/known_hosts文件中。StrictHostKeyChecking配置选项用于控制来自未知主机或密钥已经改变的主机的系统注册。

在OpenSSH服务器已经接受了用户身份与主机认证之后,OpenSSH服务器将会执行指定的命令,或作为一个远程终端,注册到OpenSSH服务器,启动常规的注册Shell,交互访问远程系统。期间,所有的通信自动地予以加密。

在常规的交互会话期间(分配了伪TTY终端),也可以输入转义字符,参见“-e”选项的说明。

当指定的命令终止运行或退出远程系统的Shell时,ssh命令将会终止执行。

验证主机密钥

第一次连接远程服务器时,服务器将会向用户输出其公钥的指印(fingerprint),除非禁用了ssh_config配置文件中的StrictHostKeyChecking选项。使用下列ssh-keygen命令可以确定服务器公钥的指印:

$ ssh-keygen –l -f /etc/ssh/ssh_host_rsa_key
$ ssh-keygen –l -f /etc/ssh/ssh_host_rsa_key

如果已经知道了指印,可用于匹配密钥,确定是接受还是拒绝。由于仅仅通过观察十六进制字符串的方式比较主机密钥是困难的,ssh也支持采用随机艺术图形的可视化方法比较主机密钥。为此,可把ssh_config配置文件中的VisualHostKey选项设置为yes,在每次注册到服务器时,即可显示一个小型的由ASCII字符组成的图形,不管会话本身是交互的还是非交互的。

为了获取所有已知主机的指印及其随机艺术图形的列表,可以使用下列命令:

$ ssh-keygen -lv -f ~/.ssh/known_hosts

如果不知道指印,一个备用的验证方法是利用DNS配置文件中的SSHFP资源记录验证SSH指印。参见ssh_config配置文件中VerifyHostKeyDNS选项的详细说明。

应用实例

1. 第一次使用ssh注册到远程系统时,ssh会发出一个警告信息,提示用户确认连接的远程系统是否正确。如果用户回答yes,ssh将会在用户主目录的~/.ssh/known_hosts文件中存储远程系统的密钥,同时也会把客户端用户的密钥发送到远程系统。此后,当用户再次注册到同一远程系统时,就不会再出现此提示信息了。

$ ssh iscas
The authenticity of host 'iscas (192.168.90.100)' can't be established.
RSA key fingerprint is de:3a:81:70:36:c2:e4:e4:13:dc:b2:7f:c7:e8:8c:d9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'iscas,192.168.90.100' (RSA) to the list of known hosts.
gqxing@iscas's password:
Last login: Sun Dec 19 15:35:18 2010 from iscas
$ 

2. 执行远程系统中的单个命令后立即返回。

$ ssh iscas "uname -r"
gqxing@iscas's password:
2.6.32-71.el6.i686
$ 

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z