背景
由于博主所在的公司对安全非常重视, 不仅仅登入内网服务器需要使用跳板机, 登入跳板机的时候还需要配合 密码 + 动态口令进行登入. 可谓是重重关卡, 安全是安全了,但是使用起来十分不方便.很多开发,运维人员会使用 SecureCRT 来对机器进行管理.不可否认 SecureCRT 是很好用的软件,但是在 mac 下,个人感觉没必要用, 这款软件就不做介绍了.
问题
- 每次手动的输入密码 + 动态口令 十分繁琐.如果使用的是命令行窗口,切换或者关闭窗口后还得重新登入.
- ssh 命令是个交互命令, 没有提供参数密码的参数.
- 公司的跳板机不允许配置密钥.所以无法走密钥方案来自动化
jump server
Jump Server,国内的公司把它称之为 堡垒机 或者 跳板机。
- A jump server, jump host or jump box is a system on a network used to access and manage devices in a separate security zone. The most common example is managing a host in a DMZ from trusted networks or computers.
- A jump server is a hardened and monitored device that spans two dissimilar security zones and provides a controlled means of access between them. User access should be tightly controlled and monitored.
- 上述关于 跳板机 的解释,引用自维基百科
大概的意思就是的 跳板机 是用来登入和管理服务器,并且跳板机是在一个和这些服务器隔离的安全区域内。 - 跳板机是经过安全加固并且收审查的设备,用户使用跳板机登入服务器就有了严格的监控和约束.
解决方案
虽然 ssh 命令是个交互命令,没有提供传入密码的参数,但是 linux 中提供了一套用来处理交互命令的程序 expect.
Expect
- Expect 语言是基于 Tcl 的。
- Tcl 实际上是一个子程序库,这些子程序库可以嵌入到程序里从而提供语言服务。 最终的语言有点象一个典型的 Shell 语言。
- Expect 给变量赋值用 set 命令, 控制程序执行的 if,for,continue 等命令,还能进行普通的数学和字符串操作.以用 exec 来调用 Unix 程序。
- spawn 命令激活一个 Unix 程序来进行交互式的运行
- send 命令向进程发送字符串
- expect 命令等待进程的某些字符串 .expect 支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect 还能理解一些特殊情况,如超时和遇到文件尾
所以我们可以利用 expect 这个程序来实现自动化的交互 ssh.
具体思路: 我们开启一个进程来执行 ssh 命令,然后在监听这个进程输出的提示输入密码的交互信息,然后自动输入密码。
用 expect 我们可以非常方便的实现以上思路.
- 首先我们使用
spawn linux命令
就可以开启一个进程执行 linux 命令. - 然后使用 expect 来监听该进程的输出.
- 最后使用 send 命令来发送密码给该进程,就可以完成连接.
详细代码如下:
- 其中使用
set 变量名 变量值
的方式来设置变量.使用$变量名
来获取值.
#!/usr/bin/expect
set user wxxxx
set ipaddress jump.xxxxxx.com
set salt 123456
set passwd "$salt [lindex $argv 0]"
set timeout 30
spawn ssh $user@$ipaddress
expect {
"*Password:" { send "$passwd\r" }
"Please input server keyword" { send "\r" }
"Select page:" { send "1\r" }
}
expect {
"Please input server keyword" { send "\r" }
}
expect {
"Select page:" { send "1\r" }
}
interact
将上面脚本保存为 connect_server.sh,权限更改为 777.以后登入只需要 ./connect_server.sh 动态口令
最后效果如下图
后续
- 理论上,就连同动态口令都可以做成自动化.只要直到对应的接口和 token 就可以获取到动态口令.如果还想做得更自动化点, 感兴趣的,可以研究下.
- Mac 的 OSX 系统只需要使用以下命令就可以使用按照好 expect
brew install expect
brew install spawn-fcgi
我的公众号
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于