- 浏览: 165863 次
- 性别:
- 来自: 南宁
最新评论
-
pipal:
jy1245626 写道引用Eclipse的代理这个是哪个功能 ...
eclipse启动tomcat成功,但却一直处在starting状态 -
jy1245626:
引用Eclipse的代理这个是哪个功能?,我eclips跑Jb ...
eclipse启动tomcat成功,但却一直处在starting状态 -
iany:
I have the same case before, it ...
eclipse启动tomcat成功,但却一直处在starting状态 -
pipal:
烟雨遥_sun 写道很强大,正好遇到这个问题,感谢楼主分享! ...
linux mysql mysql_real_connect函数导致内存泄露 -
烟雨遥_sun:
很强大,正好遇到这个问题,感谢楼主分享!
linux mysql mysql_real_connect函数导致内存泄露
本文转自 “Unix/Linux 系统自动化管理: 远程登录篇” http://www.ibm.com/developerworks/cn/aix/library/0909_jinjh_unixlogin/
本文是 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何利用脚本来实现远程服务器系统的自动化登录和在远程系统上执行命令。
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 命令会等待接受该进程返回的结果并且会根据返回的字符串来决定下一步的操作;而 spwan 命令可以发起一个进程的运行。
send 命令接收一个字符串做为参数并发送给指定的进程;从
send “Hello world”
这行代码中,send 会送出字符串“Hello world”( 不带引号 )。如果 Expect 早已经开始与某一个程序进行交互,那么这个字符串将被发送给该程序;而在通常情况下,这个字符串会被送到标准输出设备。
expect 命令则等待一个响应,通常是来自于 Expect 正在与之交互的进程,或者来自于标准输入设备;它会等待一个指定的字符串或者满足给定的正则表达式的任何字符串。我们可以创建一个名为 response.exp 的文件,来看 Expect 是如何处理的,其内容如下:
#!expect – f
expect “hi\n”
send “hello there\n”
然后在 shell 下面运行 ”expect response.exp”,它会等待来自标准输入设备的响应,直到用户输入 hi 并回车,它才会发送”hello there”到标准输出设备,并回车。然后结束 expect 脚本的运行。但是,如果用户没有输入 hi 并回车,那么 expect 会继续等待”hi\n”;输入其他的字符并不会影响到 expect 的工作。通常情况下,expect 会一直等会输入,直到最终超时退出。此外, expect 还支持使用正则表达式来预防 expect 匹配到未预想到的输入数据。
spawn 命令会调用另一个程序。它的第一个参数是要启动程序的名字;剩余的参数则会被传递给该程序做为参数。比如
spawn ftp ftp.linux.ibm.com
命令会衍生出一个 ftp 进程,并且将 ftp.linux.ibm.com 做为参数传递给这个 ftp 进程。
用户通过 spawn,send 和 expect 这三个基本命令,就可以编写一段 Expect 程序来实现自动化工作。
Expect 脚本实现
本节将利用基于用户口令的安全认证方式,并使用 Expect 来实现 SSHD 服务器的自动化登录过程,并在登录的会话中实现命令在 SSHD 服务器端的执行。本文使用的具体实验环境如下:用户使用的 SSH 客户端机器:操作系统均为 RHELS5.3, IP 地址为 192.168.0.3, Expect 版本为 version 5.43.0;远程的 SSHD 服务器:操作系统均为 RHELS5.3,IP 地址为 192.168.0.4,用户名 / 密码为 root/123456。
清单1.登录 SSHD 服务器的自动化脚本
#!/usr/bin/expect
# 设置超时时间为 60 秒
set timeout 60
# 设置要登录的主机 IP 地址
set host 192.168.0.4
# 设置以什么名字的用户登录
set name root
# 设置用户名的登录密码
set password 123456
#spawn 一个 ssh 登录进程
spawn ssh $host -l $name
# 等待响应,第一次登录往往会提示是否永久保存 RSA 到本机的 know hosts 列表中;等到回答后,在提示输出密码;之后就直接提示输入密码
expect {
"(yes/no)?" {
send "yes\n"
expect "assword:"
send "$pasword\n"
}
"assword:" {
send "$password\n"
}
}
expect "#"
# 下面测试是否登录到 $host
send "uname\n"
expect "Linux"
send_user "Now you can do some operation on this terminal\n"
# 这里使用了 interact 命令,使执行完程序后,用户可以在 $host 终端进行交互操作。
interact
如果要运行该脚本,可以参考如下的操作,假设 expect 脚本的文件名为 t1.expect。另外,在运行该脚本之前,需要将 t1.expect 文件设置成可执行的模式 ;
清单2.运行自动化登录脚本的操作步骤
[root@redhat ~]chmod a+x t1.expect
[root@redhat ~]./t1.expect
spawn ssh 192.168.0.4 -l root
root@192.168.0.4's password:
Last login: Fri Jun 12 15:36:01 2009 from 192.168.0.3
Red Hat Enterprise Linux Server release 5.1 (Tikanga)
[root@c96m3h4ms01 ~]# uname
Linux
Now you can do some operation on this terminal
[root@c96m3h4ms01 ~]#
回页首
基于 SSH 交换 Key 自动化登录
SSH 证书简介
SSH 证书使用一对密钥 : 私钥(private key)和公钥 (public key)。公钥(public key)对数据进行加密而且只能用于加密,私钥(private key)只能对所匹配的公钥(public key)加密过的数据进行解密。私钥(private key)只保存你独有的一些秘密信息。SSH 客户端用其向 SSHD 服务器证明自已的身份。公钥是公开的,可以随便将其放入 SSHD 服务器上自已的帐号中 , 在认证时,进行私钥和公钥协商,如果匹配,那么身份就得以证明,认证就成功。
目前所有的 OpenSSH 版本都应该既能使用 RSA 密钥又能使用 DSA 密钥。RSA 密钥和 DSA 密钥的生成命令和使用方法相同,本文仅介绍 RSA。
如果采用 SSH 密钥认证的方式实现自动化登录,用户可以参考下面的章节。
生成密钥对
ssh-keygen 程序生成的 RSA 密钥的文件名默认为 id_rsa 和 id_rsa.pub,用户也可以将其更改为别的名称。下面”清单 3. 生成密钥对”的操作过程将采用系统的默认值。
清单3. 生成密钥对
如果 ssh 目录不存在,程序为自动创建本地 SSH 目录 ~/.ssh,并将所生成的密钥分成两个文件存储,私钥为 id_rsa,公钥为 id_rsa.pub。
配置自动化登录
在配置自动化登录的过程中,账户对应的公钥需要被添加到 SSHD 服务器端的配置文件。在 3.0 版本的 OPENSSH 中,用户需要修改的文件为 authorized_keys,早于 3.0 的版本则使用 authorized_keys2 文件。将在客户端生成的 id_rsa.pub 文件内容加入到 authorized_keys 或者 authorized_keys2 文件中即可完成配置工作。
为安全起见,要确保 $HOME/.ssh 目录的安全,只有所有者才有 权写入。如果远程用户的 SSH 配置文件的权限设置不当,服务器可能会拒绝进行认证。
下面是配置自动化登录的具体过程,其场景如下:
Openssh 为 OpenSSH_4.3p2SSH,将以 root 用户登录到 SSHD 服务器(192.168.0.4)上,因此公钥的内容将存放在 root/.ssh/authorized_keys。
清单4. 终端操作记录
如果用户在生成 rsa 和 id_rsa.pub 的时候没有输入密码,可以直接使用“ssh root@192.168.0.4”登录,而不用输入密码。
而如果用户在生成 rsa 和 id_rsa.pub 的时候输入了密码,需要进行以下两步操作:
1. 启用 ssh-agent 认证代理 ,
清单5. 终端操作记录
(2) 使用 ssh-add, 装入私钥,并输入生成 rsa 和 id_rsa.pub 时输入的密码
清单6. 终端操作记录
把私钥保存在内存中,为认证提供服务,之后以 root 用户 ssh 登录时,就不用重复输入密码。其生命周期为 ssh-agent 启动的那个 shell,当用户退出该 shell 时,需要重新执行 ssh-agent 和 ssh-add。
只要密钥配置好,以后登录就是自动化了。因此本部分登录过程不需要用脚本来实现,实现了前期拷贝 SSH key 到远程服务器,并添加到相应的位置,并测试自动登录是否成功。
回页首
脚本实现配置自动化登录
本节的脚本实现基于 SSH key 交换的安全认证方式,并利用 Expect 来实现自动化登录。本节所实现的脚本可以运行在以下的实验环境中:用户使用的 SSH 客户端机器:操作系统均为 RHELS5.3, IP 地址为 192.168.0.3, Expect 版本为 version 5.43.0;远程的 SSHD 服务器:操作系统均为 RHELS5.3,IP 地址为 192.168.0.4,用户名 / 密码为 root/123456。
Expect 脚本的内容如下:
清单7.基于 SSH key 交换的自动化登录脚本
清单 7 基于 SSH key 交换的自动化登录脚本注释掉了主机名,用户名和密码,因此用户在运行脚本时需要手工输入主机名,用户名和密码。一旦 SSH Key 的交换完成,用户就可以直接运行 “ssh host-address – l username”实现自动化登录,而不再需要输入用户名密码。
小结
本文做为 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何利用 Expect 脚本来实现远程服务器系统的自动化登录和在远程系统上执行命令。
需要读者注意的是,采用基于用户口令的安全认证方式时,将用户名和登录密码尤其是 root 用户的密码以明文的形式存放在 Expect 脚本中是一种非常不安全的行为,可能会引起用户名和密码的泄露;如果远端的服务器需要特别安全的防护措施,那么用户可以采取利用 SSH key 交换的安全认证方式来实现自动化登录。这样既方便了系统管理,同时又能保证系统安全。
本文是 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何利用脚本来实现远程服务器系统的自动化登录和在远程系统上执行命令。
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 命令会等待接受该进程返回的结果并且会根据返回的字符串来决定下一步的操作;而 spwan 命令可以发起一个进程的运行。
send 命令接收一个字符串做为参数并发送给指定的进程;从
send “Hello world”
这行代码中,send 会送出字符串“Hello world”( 不带引号 )。如果 Expect 早已经开始与某一个程序进行交互,那么这个字符串将被发送给该程序;而在通常情况下,这个字符串会被送到标准输出设备。
expect 命令则等待一个响应,通常是来自于 Expect 正在与之交互的进程,或者来自于标准输入设备;它会等待一个指定的字符串或者满足给定的正则表达式的任何字符串。我们可以创建一个名为 response.exp 的文件,来看 Expect 是如何处理的,其内容如下:
#!expect – f
expect “hi\n”
send “hello there\n”
然后在 shell 下面运行 ”expect response.exp”,它会等待来自标准输入设备的响应,直到用户输入 hi 并回车,它才会发送”hello there”到标准输出设备,并回车。然后结束 expect 脚本的运行。但是,如果用户没有输入 hi 并回车,那么 expect 会继续等待”hi\n”;输入其他的字符并不会影响到 expect 的工作。通常情况下,expect 会一直等会输入,直到最终超时退出。此外, expect 还支持使用正则表达式来预防 expect 匹配到未预想到的输入数据。
spawn 命令会调用另一个程序。它的第一个参数是要启动程序的名字;剩余的参数则会被传递给该程序做为参数。比如
spawn ftp ftp.linux.ibm.com
命令会衍生出一个 ftp 进程,并且将 ftp.linux.ibm.com 做为参数传递给这个 ftp 进程。
用户通过 spawn,send 和 expect 这三个基本命令,就可以编写一段 Expect 程序来实现自动化工作。
Expect 脚本实现
本节将利用基于用户口令的安全认证方式,并使用 Expect 来实现 SSHD 服务器的自动化登录过程,并在登录的会话中实现命令在 SSHD 服务器端的执行。本文使用的具体实验环境如下:用户使用的 SSH 客户端机器:操作系统均为 RHELS5.3, IP 地址为 192.168.0.3, Expect 版本为 version 5.43.0;远程的 SSHD 服务器:操作系统均为 RHELS5.3,IP 地址为 192.168.0.4,用户名 / 密码为 root/123456。
清单1.登录 SSHD 服务器的自动化脚本
#!/usr/bin/expect
# 设置超时时间为 60 秒
set timeout 60
# 设置要登录的主机 IP 地址
set host 192.168.0.4
# 设置以什么名字的用户登录
set name root
# 设置用户名的登录密码
set password 123456
#spawn 一个 ssh 登录进程
spawn ssh $host -l $name
# 等待响应,第一次登录往往会提示是否永久保存 RSA 到本机的 know hosts 列表中;等到回答后,在提示输出密码;之后就直接提示输入密码
expect {
"(yes/no)?" {
send "yes\n"
expect "assword:"
send "$pasword\n"
}
"assword:" {
send "$password\n"
}
}
expect "#"
# 下面测试是否登录到 $host
send "uname\n"
expect "Linux"
send_user "Now you can do some operation on this terminal\n"
# 这里使用了 interact 命令,使执行完程序后,用户可以在 $host 终端进行交互操作。
interact
如果要运行该脚本,可以参考如下的操作,假设 expect 脚本的文件名为 t1.expect。另外,在运行该脚本之前,需要将 t1.expect 文件设置成可执行的模式 ;
清单2.运行自动化登录脚本的操作步骤
[root@redhat ~]chmod a+x t1.expect
[root@redhat ~]./t1.expect
spawn ssh 192.168.0.4 -l root
root@192.168.0.4's password:
Last login: Fri Jun 12 15:36:01 2009 from 192.168.0.3
Red Hat Enterprise Linux Server release 5.1 (Tikanga)
[root@c96m3h4ms01 ~]# uname
Linux
Now you can do some operation on this terminal
[root@c96m3h4ms01 ~]#
回页首
基于 SSH 交换 Key 自动化登录
SSH 证书简介
SSH 证书使用一对密钥 : 私钥(private key)和公钥 (public key)。公钥(public key)对数据进行加密而且只能用于加密,私钥(private key)只能对所匹配的公钥(public key)加密过的数据进行解密。私钥(private key)只保存你独有的一些秘密信息。SSH 客户端用其向 SSHD 服务器证明自已的身份。公钥是公开的,可以随便将其放入 SSHD 服务器上自已的帐号中 , 在认证时,进行私钥和公钥协商,如果匹配,那么身份就得以证明,认证就成功。
目前所有的 OpenSSH 版本都应该既能使用 RSA 密钥又能使用 DSA 密钥。RSA 密钥和 DSA 密钥的生成命令和使用方法相同,本文仅介绍 RSA。
如果采用 SSH 密钥认证的方式实现自动化登录,用户可以参考下面的章节。
生成密钥对
ssh-keygen 程序生成的 RSA 密钥的文件名默认为 id_rsa 和 id_rsa.pub,用户也可以将其更改为别的名称。下面”清单 3. 生成密钥对”的操作过程将采用系统的默认值。
清单3. 生成密钥对
[root@redhat ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): <--- 可以不输入密码 Enter same passphrase again: <--- 可以不输入密码 Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 4b:70:20:de:89:92:a9:fe:21:a4:9b:7c:6b:65:ae:e0 root@redhat [root@redhat ~]# ls -al .ssh total 20 drwx------ 2 root root 4096 May 10 02:51 . drwxr-x--- 11 root root 4096 May 10 02:51 .. -rw------- 1 root root 1675 May 10 02:51 id_rsa -rw-r--r-- 1 root root 397 May 10 02:51 id_rsa.pub
如果 ssh 目录不存在,程序为自动创建本地 SSH 目录 ~/.ssh,并将所生成的密钥分成两个文件存储,私钥为 id_rsa,公钥为 id_rsa.pub。
配置自动化登录
在配置自动化登录的过程中,账户对应的公钥需要被添加到 SSHD 服务器端的配置文件。在 3.0 版本的 OPENSSH 中,用户需要修改的文件为 authorized_keys,早于 3.0 的版本则使用 authorized_keys2 文件。将在客户端生成的 id_rsa.pub 文件内容加入到 authorized_keys 或者 authorized_keys2 文件中即可完成配置工作。
为安全起见,要确保 $HOME/.ssh 目录的安全,只有所有者才有 权写入。如果远程用户的 SSH 配置文件的权限设置不当,服务器可能会拒绝进行认证。
下面是配置自动化登录的具体过程,其场景如下:
Openssh 为 OpenSSH_4.3p2SSH,将以 root 用户登录到 SSHD 服务器(192.168.0.4)上,因此公钥的内容将存放在 root/.ssh/authorized_keys。
清单4. 终端操作记录
[root@redhat ~]# scp /root/.ssh/id_rsa.pub root@192.168.0.4:/tmp [root@redhat .ssh]# ssh 192.168.0.4 root@192.168.0.4's password: ****** [root@server ~]# cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys
如果用户在生成 rsa 和 id_rsa.pub 的时候没有输入密码,可以直接使用“ssh root@192.168.0.4”登录,而不用输入密码。
而如果用户在生成 rsa 和 id_rsa.pub 的时候输入了密码,需要进行以下两步操作:
1. 启用 ssh-agent 认证代理 ,
清单5. 终端操作记录
[root@redhat ~]# ssh-agent $SHELL
(2) 使用 ssh-add, 装入私钥,并输入生成 rsa 和 id_rsa.pub 时输入的密码
清单6. 终端操作记录
[root@redhat ~]# ssh-add Enter passphrase for /root/.ssh/id_rsa: Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) Identity added: /root/.ssh/id_dsa (/root/.ssh/id_dsa) [root@redhat ~]# ssh 192.168.0.4 Last login: Sat May 16 11:37:39 2009 from redhat
把私钥保存在内存中,为认证提供服务,之后以 root 用户 ssh 登录时,就不用重复输入密码。其生命周期为 ssh-agent 启动的那个 shell,当用户退出该 shell 时,需要重新执行 ssh-agent 和 ssh-add。
只要密钥配置好,以后登录就是自动化了。因此本部分登录过程不需要用脚本来实现,实现了前期拷贝 SSH key 到远程服务器,并添加到相应的位置,并测试自动登录是否成功。
回页首
脚本实现配置自动化登录
本节的脚本实现基于 SSH key 交换的安全认证方式,并利用 Expect 来实现自动化登录。本节所实现的脚本可以运行在以下的实验环境中:用户使用的 SSH 客户端机器:操作系统均为 RHELS5.3, IP 地址为 192.168.0.3, Expect 版本为 version 5.43.0;远程的 SSHD 服务器:操作系统均为 RHELS5.3,IP 地址为 192.168.0.4,用户名 / 密码为 root/123456。
Expect 脚本的内容如下:
清单7.基于 SSH key 交换的自动化登录脚本
#!/usr/bin/expect # 判断输入的参数是否为 3 个,如果不为 3 个,就打印错误信息,退出该程序。 if { $argc != 3 } { puts stderr "Usage: test1 host-address username host-password\n" exit 1 } # 设置超时时间为 60 秒 set timeout 60 # 将命令行输入的第一个参数作为将要登录的 SSHD 服务器 set host [lindex $argv 0] # 第二个参数是用户名,赋值给 name, 之后用 $name 格式来使用 set name [lindex $argv 1] # 第三个参数是以 $name 登录 $host 的口令 set password [lindex $argv 2] ##set timeout 60 ##set password "cluster" ##set name “root” ##set host "192.168.0.4" #root 用户的 rsa key 放在 /root/.ssh 中,其他用户则放在 /home/$name/.ssh if { $name == "root"} { spawn scp /$name/.ssh/id_rsa.pub $name@$host:/tmp } else { spawn scp /home/$name/.ssh/id_rsa.pub $name@$host:/tmp } # 等待上个命令的响应 expect { "(yes/no)?" { send "yes\n" expect "assword:" send "$pasword\n" } "assword:" { send "$password\n" } } # 输入密码后,拷贝成功,出现 100% 字符串,作为预期响应 expect "100%" # 调用 ssh 以 $name 用户名登录到 $host 上 spawn ssh $host – l$name # 期待提示出入密码的响应 expect "assword:" # 接收密码 send "$password\n" expect ":~#" # 将刚刚拷贝的 rsa key 添加到用户的 home 目录下的 ./ssh/authorized_keys if { $name == "root"} { send "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys\n" } else { send "cat /tmp/id_rsa.pub >> /home/$name/.ssh/authorized_keys\n" } expect ":~#" # 操作成功后,退回 SSH 客户端机器 send "exit\n" expect "#" # 下面将测试能否自动登录,不用输入密码 spawn ssh $host – l$name expect { "Welcome" { send_user "Auto login the server successfully!" } "assword:" { send_user "failed to login the server!" } } send "ls\n" expect ":~#" # 退出 $host send "exit\n" # 程序结束 expect eof
清单 7 基于 SSH key 交换的自动化登录脚本注释掉了主机名,用户名和密码,因此用户在运行脚本时需要手工输入主机名,用户名和密码。一旦 SSH Key 的交换完成,用户就可以直接运行 “ssh host-address – l username”实现自动化登录,而不再需要输入用户名密码。
小结
本文做为 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何利用 Expect 脚本来实现远程服务器系统的自动化登录和在远程系统上执行命令。
需要读者注意的是,采用基于用户口令的安全认证方式时,将用户名和登录密码尤其是 root 用户的密码以明文的形式存放在 Expect 脚本中是一种非常不安全的行为,可能会引起用户名和密码的泄露;如果远端的服务器需要特别安全的防护措施,那么用户可以采取利用 SSH key 交换的安全认证方式来实现自动化登录。这样既方便了系统管理,同时又能保证系统安全。
发表评论
-
Sub-process /usr/bin/dpkg returned an error code (1) 的解决办法
2011-05-23 11:50 1875Sub-process /usr/bin/dpkg retur ... -
Unix下shell对文件随机读写
2011-02-25 14:01 2607在《高级Bash脚本编程指南》上有一个例子,用重定向,通过sh ... -
ibus添加自定义词组
2011-02-11 23:33 1199ibus添加自定义词组 原文:http://www.cnbl ... -
更换iBus五笔的左与右Shif
2010-05-18 00:09 1748更换iBus五笔的左与右Shif 本文转自“http://w ... -
linux tr 命令详解
2009-12-14 10:03 2400linux tr 命令详解 本文转自“http://blo ... -
gedit乱码解决方案
2009-11-09 08:11 1806本文引自http://linux.chinaunix.net/ ... -
Shell测试运算和流程控制语句 监控disk、cpu和处理qmail邮件队列
2009-10-23 23:02 1111本文转自:http://hi.baidu.com/speiwa ... -
Shell字符串匹配
2009-10-23 22:44 2880Shell字符串匹配 转意的"尖括号" ... -
恢复grub方法
2009-10-15 00:07 1081安装完Linux后再重新安装Windows,则会把grub给覆 ... -
vi方向键无法定位解决方案
2009-10-12 02:09 1286vi方向键的输出分别为ABCD,也就是说,不能使用方向键进行定 ... -
自动挂载windows分区
2009-10-12 01:42 1137在forum.ubuntu.org.cn上看到这个自动挂载wi ... -
Vista下硬盘安装Ubuntu
2009-10-11 22:35 1477换了新本本,自带的系统是Vista,说起这Vista,我就是一 ... -
ubuntu 终端记录日志
2009-09-14 16:47 1912ubuntu 终端记录日志软件---screen > ...
相关推荐
【Unix/Linux 系统自动化管理:数据备份与同步】 数据备份和同步是Unix/Linux系统管理中的关键环节,确保数据安全性和业务连续性。本篇文档着重讲解如何在Unix/Linux环境中实现自动化备份与同步,以便在面对系统...
Python是一种强大的脚本语言,因其简洁的语法和丰富的库支持,被广泛用于Unix和Linux系统的自动化管理。通过Python,你可以编写脚本来自动化日常的维护任务,如备份、日志分析、系统监控等,提高效率和准确性。 2....
- `ssh`:远程登录其他Unix/Linux主机。 - **Shell脚本编写:** - 使用bash或其他shell编写自动化脚本。 - 脚本变量、条件语句、循环控制等基础语法。 #### 四、Unix/Linux文件系统管理 - **文件系统结构:** -...
《Unix/Linux系统自动化管理——数据备份与同步》 在Unix/Linux系统管理中,自动化管理是一项重要的任务,尤其在数据备份与同步方面。数据是系统的核心,确保其安全性和可用性至关重要。本文主要探讨如何利用系统...
Shell 脚本是 Unix/Linux 系统上的一种简单脚本语言,可以用来自动化日常任务。一个典型的 Shell 脚本以 `#!/bin/bash` 开头,指定解释器路径。 ##### 8.2 Bourne Shell Bourne Shell (`sh`) 是最早的 Unix Shell ...
自动化管理:许多Unix/Linux代理程序支持脚本自动化,允许管理员创建定制的任务自动化流程。例如,通过cron定时任务调度器,可以定期运行备份、系统检查或清理任务,提高运维效率。 扩展性与兼容性:Unix/Linux代理...
【基于Unix/Linux/Windows混合平台的电能量采集及管理系统】是一种综合运用多种操作系统技术的电能数据管理系统,旨在提升电力企业的自动化与信息化水平。该系统采用Unix、Linux和Windows混合平台,利用各自的优势来...
在UNIX和Linux操作系统中,日常操作是每个用户和管理员必须熟悉的技能。这些操作涉及登录、退出、环境配置、文件系统管理、命令行交互以及进程控制等多个方面。以下是对这些知识点的详细说明: **登录和退出** 登录...
《Unix/Linux实践教程》是一本深入探讨Unix/Linux操作系统核心概念和技术的教材,旨在帮助学习者掌握实际操作系统的使用和管理技巧。源码的提供使得学习更为直观和透彻,不仅能够阅读理解系统内部的工作原理,还能...
在IT领域,Linux和Unix是两种广泛使用的操作系统,尤其在服务器和系统管理方面。这篇教材主要涵盖了Linux和Unix的基础知识以及基本操作,非常适合初学者进行自学。以下将详细阐述这些主题,帮助你深入理解这两个系统...
根据提供的标题“Python Unix和Linux系统管理指南”以及描述“Unix和Linux系统管理员的必备书籍,看后对你一定有很大的帮助”,我们可以推断出这是一本关于如何使用Python进行Unix和Linux系统管理的书籍。...
Python在Unix和Linux系统管理中的应用是广泛的,它作为一个强大的脚本语言,为系统管理员提供了高效、灵活的工具来自动化日常任务。以下是一些关于Python在Unix和Linux系统管理中的核心知识点: 1. **文件和目录...
《Python.UNIX和Linux系统管理指南》是一本深入探讨如何使用Python进行UNIX和Linux系统管理的书籍。在当今数字化世界中,Python因其简洁、高效和强大的功能,已成为系统管理员和IT专业人士的重要工具。这本书旨在...
2.实验室管理:使用VNC可以远程管理实验室中的服务器和设备,实现实验室的自动化管理。 3.多用户远程管理:使用VNC可以实现多用户远程管理,提高了管理效率和灵活性。 五、结论 本文介绍了如何利用LINUX图形界面...
《SecureCRT:Windows环境下连接UNIX或Linux服务器的强大工具》 SecureCRT,全称为SecureCRT for Windows,是一款...无论是日常的系统管理,还是复杂的自动化脚本执行,SecureCRT都能游刃有余,是远程连接的得力助手。
总之,尽管GDB的命令行界面可能对初学者来说不够直观,但熟悉后你会发现它的强大和灵活性,特别是在处理复杂问题和自动化调试任务时。在Unix/Linux开发环境中,掌握GDB的使用是每个程序员必备的技能。
4. 脚本编写:支持Unix/Linux脚本语言的运行,使得Windows用户可以编写和执行bash、Perl、Python等脚本,实现自动化任务。 总结来说,MKS Toolkit 8.0是Windows用户通往Unix/Linux世界的一座桥梁,它使得开发者和...
针对“批量重启动Unix、Linux系统服务”的需求,我们可以创建一个自动化脚本来完成这个任务。Unix和Linux系统的服务通常通过System V init或Systemd进行管理,而这个脚本将帮助管理员轻松地对多个服务进行启动或停止...
- **shell脚本**:学习编写简单的自动化任务脚本。 - **条件表达式**:进行文件类型检查、比较运算等。 - **循环和逻辑控制**:for、while、if...else结构的使用。 10. **日志和调试**: - **logrotate**:自动...