使用场景:需要使用java来执行某个脚本,对容器外的某个文件进行操作,把这个文件发送到另外一个服务器上面去

为什么写这篇博客呢?

因为在CSDN上看了很多博客,发现大部分都是容器外使用容器内的操作,所以当我找到解决方法的时候,就顺便发了出来。

其实我这个方法其实不是像标题说的一样,在容器内使用容器外的shell脚本

首先介绍我会遇到的问题

第一个问题: 如何解决在容器内使用容器外的脚本问题(难)

第二个问题: 如何在JAVA里面使用SHELL脚本(易)

第三个问题:如何免密发送文件到另一台服务器上(难)

对于这个三个问题,由于我刚出来工作不久,经验不深,所以很多在大佬眼里看似简单的问题,在我看来很麻烦。

  • 我查了很多博客,都没有查到如何在docker容器内执行容器外脚本的方法,如果有大佬知道,麻烦在评论区留下您好心的链接
  • 所以我选择了在容器内使用SSH登录当前服务器,使用GitHub上的开源:SSH-client-pool,通过这个来使用SSH登录服务器,执行脚本
SshClientConfig clientConfig = new SshClientConfig(ip,22,username,password,null);
SshClientWrapper client = pool.client(clientConfig);
client.executeCommand("sh xxx.sh",100);
  • 但是也因此有了第三个问题,脚本里使用scp发送指令,需要手动输入登录密码。经过一番资料的查找,我使用了expect指令,把sh换成expect脚本。
  • 以下是我的脚本分享:
  • 如果执行不成功,有以下两个原因
  • 1.没有装expect指令,这个可以通过 yum install -y expect 来安装即可
  • 2.使用方法/传递参数传递不对,使用该脚本指令为: expect xxxx.sh [传参1] [传参2] [传参3] [传参4]
  • 脚本作用:使用SSH连接服务器时,不必手动输入账号密码
#!/usr/bin/expect -f
# 如果执行不成功,有以下两个原因
# 1.没有装expect指令,这个可以通过 yum install -y expect 来安装即可
# 2.使用方法/传递参数传递不对,使用该脚本指令为:  expect xxxx.sh [传参1] [传参2] [传参3] [传参4]
# 使用scp上传
set fileName [lindex $argv 0]
set savePath [lindex $argv 1]
set tohost [lindex $argv 2]
set basePath [lindex $argv 3]
spawn  bash -c "scp -r $savePath$fileName  root01@$tohost:$basePath"
#等待带有password字样,并输入密码
expect "*password*" {send "XXXXXXX\r"}
#退出
expect eof
#ssh连接服务器
spawn ssh root01@$tohost
#等待带有password字样,并输入密码
expect "*password*" {send "XXXXXXX\r"}
#执行命令
expect "*01@ubuntu*" {
    send "cd $basePath  \r"
    send "chmod 777 $fileName \r"
    send "unzip -o $fileName -d data  \r"       
}
#退出
expect eof