欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker容器内使用容器外的shell脚本

程序员文章站 2024-03-12 08:47:02
...

使用场景:需要使用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  [email protected]$tohost:$basePath"
#等待带有password字样,并输入密码
expect "*password*" {send "XXXXXXX\r"}
#退出
expect eof
#ssh连接服务器
spawn ssh [email protected]$tohost
#等待带有password字样,并输入密码
expect "*password*" {send "XXXXXXX\r"}
#执行命令
expect "*[email protected]*" {
    send "cd $basePath  \r"
    send "chmod 777 $fileName \r"
    send "unzip -o $fileName -d data  \r"       
}
#退出
expect eof