配置自动化登录

在配置自动化登录的过程中,账户对应的公钥需要被添加到 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”实现自动化登录,而不再需要输入用户名密码。


相关内容