Board logo

标题: Unix/Linux 系统自动化管理 远程登录篇(3) [打印本页]

作者: look_w    时间: 2018-6-13 15:50     标题: Unix/Linux 系统自动化管理 远程登录篇(3)

脚本实现配置自动化登录本节的脚本实现基于 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 交换的自动化登录脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/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”实现自动化登录,而不再需要输入用户名密码。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0