Telnet 和 SSH 协议是 Internet 远程登录服务的标准协议和主要方式,它们为用户提供了在本地机器上完成远程机器上工作的能力.用户使用 Telnet 或者 SSH 软件连接远程服务器,在 Telnet 或者 SSH 软件中输入的命令就会在服务器上运行.Telnet 协议本质上是不安全的, 它使用明文传送数据、用户账号和口令,很容易受到中间人攻击方式的攻击;而 SSH 协议则是比较可靠、专为远程登录会话和其他网络服务提供安全性的协议.通过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗.本文主要针对 SSH 协议进行阐述,使用的 SSH 软件是 OpenSSH,它是开放源代码的免费的 SSH 替代软件包.
用户使用 Telnet 或者 SSH 登录不同的操作系统,会得到不同的返回信息.用户可以编写程序根据运程登录的返回信息进行判断和处理,从而实现远程服务器系统的自动化登录.本文将先介绍实现远程自动化登录用到的技术,再详细介绍如何实现 Unix/Linux 系统间远程登录自动化.
远程系统自动化登录机制简介
所谓自动化远程登录,是指在用户不干预的情况下,不需要手动输入密码,就能登录到远程系统.目前远程登录工具有两种安全认证方式.
基于用户口令的安全认证
当使用登录账户登录时,根据提示输入口令,SSH 就会用安全密码认证协议,将加密传送给 SSHD 服务器.认证成功后,就可以登录到 SSHD 服务器.
针对这种安全认证方式,可以让程序自动输入用户名和密码,实现自动化登录.目前可以用 expect, C 或 Perl 来实现.如果采用 C, 需要很熟悉 TCP/IP 协议,实现起来比较复杂;如果用 expect, expect 是基于 Tcl 的,需要熟悉 Tcl 语法;如果用 perl 实现,需要采用 perl 的 expect.pm 这个包.但需要用户输入口令,因此这种认证方式存在着安全隐患.
基于 SSH key 交换的安全认证方式
用户需要先在 SSH 客户端为登录账户创建一对密匙:私钥(private key)和公钥 (public key),然后把公钥传送到要登录的 SSHD 服务器上.当用户使用 SSH 客户端登录 SSHD 服务器时,SSH 客户端就会向 SSHD 服务器发出用登录帐户的密钥进行安全验证的请求;SSHD 服务器收到请求,先在登录帐号的主目录下寻找对应的公钥,并与客户端发送过来的公钥进行对比;如果两个密钥一致,SSHD 服务器会用公钥加密“质询”(challenge),发送给 SSH 客户端;SSH 客户端收到“质询”之后用客户端的私钥解密,再把它发送给 SSHD 服务器.这样就完成了安全认证的整个过程.
使用基于 SSH key 交换的认证方式,用户只要将在 SSH 客户端生成的公钥复制到远程的 SSHD 服务器.当通过 SSH 客户端登录 SSHD 服务器时,用户不需要输入密码,就可以自动登录到远程 SSHD 服务器.这种方式不仅简便, 避免了用户名和密码的泄露,比第一种方式要安全.
使用 Expect 的自动化登录
Expect 的基础知识
Expect 是由 Don Libes 基于 Tcl 语言开发的,并被广泛应用于交互式操作和自动化测试的场景之中,它尤其适用于需要对多台服务器执行相同操作的环境中,可以大幅度得提高系统管理人员的工作效率.目前,大部分 Unix/Linux 系统安装有 expect. 万一系统中没有,可以从 http://expect.nist.gov/ 下载相应的包安装.
Expect 作为基于 Tcl 的高级语言,增加了一些特殊的语法.传统意义上的 Expect 是以 Tcl 扩展包的形式出现的,任何 Tcl 语言编写的应用程序都可以加载 Expect 功能;此外,Expect 已经以模块的方式移植到了 Perl 和 Python 语言中,因此用户同样可以在 Perl 和 Python 脚本中利用 Expect 强大的交互功能.
Send,expect 和 spwan 是 Expect 语言最基本的命令.其中,send 命令会发送字符串给指定进程(process); expect 命令会等待接受该进程返回的结果并且会根据返 |