Linux系统自动化管理: 远程登录(1)(3)
配置自动化登录
在配置自动化登录的过程中,账户对应的公钥需要被添加到 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 的时候输入了密码,需要进行以下两步操作:
启用 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”实现自动化登录,而不再需要输入用户名密码。
评论暂时关闭