java实现SSH跳板登录并执行脚本
ssh跳板登录
背景
最近遇到一个场景,有三台生成服务器通过docker部署了同样的程序,每次部署程序需要先登录跳板机再登录到目标设备,然后才能执行脚本进行部署,如果只有一台设备还好那要是有多台设备就比较繁琐了。现在遇到的场景就是这样,有三台需要跳板的设备需要执行同样的操作,由于我主用语言是java,所以用java来实现。
场景限制
不需要用sftp等操作,仅仅是执行命令行操作,或者执行shell脚本
不适用ansible是因为场景限制
sshj介绍
sshj是一个支持ssh, scp and sftp的j开源java,开源地址GitHub - hierynomus/sshj: ssh, scp and sftp for java,它支持的相关算法相对丰富,在实践中发现可以支持很低版本的openssh版本,也支持最新版本openssh 9.x版本,它自身也支持跳板登录,故而涉及到ssh登录的场景我都会选择 。
跳板登录介绍
sshj开源工程的测试例子里面就提供了跳板登录的案例,sshj/examples/src/main/java/net/schmizz/sshj/examples/Jump.java at master · hierynomus/sshj · GitHub
但是我并不直接使用它,由于我的场景是跳板进去执行脚本,不需要传输文件,考虑到会存在下列场景
- 超过两次跳板登录
- ssh登录跳板机再通过跳板机使用telnet进行登录目标设备
- 小型机作为跳板机,不支持ssh协议的跳板登录,再Solaris设备上遇到过
故而,我使用人机交互式的方式来实现跳板登录,这样带来的好处是,只要通过手敲命令能登录上去的设备,我就能用我的程序登录。
人机交互式登录实现
人机交互解释:通过手敲命令进行远程登录,如,终端输入ssh root@address 正确情况下控制台会返回输入密码提醒,这时候再输入密码回车,没有问题的情况下终端会提示登录成功
代码执行描述如下
1、使用sshj创建ssh连接伪终端
2、创建一个异步流管理组件,利用封装方法来方便地进行输入输出
3、利用异步流管理组件执行脚本并等待输出通知来进行跳板登录
4、利用执行器执行脚本
详情可以参考项目shixinmuhuo/PowerExec: PowerExec是一个超强的支持无限跳板的远程执行脚本的工具。致力于解决重复繁琐的手工运维问题。 (github.com)
是否可以使用部署程序的设备上的ssh来登录跳板机呢?
答案式不行的。
我在windows平台利用java的process执行ssh登录命令,发现输出流是获取不到password的输出提醒的,那就没有办法进行交互。linux平台同理,但是奇怪的是mac平台可以拿到输出。所以必须先建立一个ssh伪终端,后面的流程才能走得下去。
更多推荐
所有评论(0)