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
#!/bin/bash

port=13899
User=heyingliang@47.115.158.159
resouceFile=/Users/heyingliang/go/src/github.com/bangwork/bang-api/bang-api
newFileName=ones-ai-api-core.old
fileDir=/home/heyingliang/project_bin
dockerBinFile=/usr/local/ones-ai-project-api/bin/

echo "----------- md5 $resouceFile -----------"
fileMd5=$(md5 $resouceFile)
echo $fileMd5

scp $resouceFile $User:$fileDir

ssh heyingliang@47.115.158.159 <<EOF
sudo su -
echo -e "\n--- docker ps -a"
docker ps -a

echo -e '\n--- docker ps | grep $port'
docker ps | grep $port

echo -e '\n--- docker cp \${fileDir}/bang-api \${targetContainerID}:$dockerBinFile'
targetContainerID=\$(docker ps -a | grep $port | awk '{print \$1}')
docker cp ${fileDir}"/bang-api" \${targetContainerID}:$dockerBinFile

echo -e '\n--- docker exec -i \${targetContainerID} bash'
docker exec -i \$targetContainerID bash <<EOF2
cd $dockerBinFile
echo -e '\n--- ls -la $dockerBinFile'
ls -la

if [ -f ones-ai-api-core.bak ];
then
echo -e '\n--- mv ones-ai-api-core $newFileName'
mv ones-ai-api-core ones-ai-api-core.old
else
echo -e '\n--- mv ones-ai-api-core ones-ai-api-core.bak'
mv ones-ai-api-core ones-ai-api-core.bak
fi
echo -e '\n--- mv bang-api ones-ai-api-core'
mv bang-api ones-ai-api-core
exit
EOF2

echo -e "\n--- docker restart $targetContainerID"
docker restart \$targetContainerID
echo -e "\n----------- fin -----------"

EOF
  • 使用ssh命令后,其实并不会进入对方的shell环境,还是呆在自己的shell环境中,如果要在对方的shell环境执行脚本,可以有两种方案

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 方法一
    ssh heyingliang@47.115.158.159 "pwd; cat hello.txt"

    # 方法二
    # 注意:EOF只是一个字符串,并不是关键字,可以随意更改
    ssh heyingliang@47.115.158.159 <<EOF
    pwd
    cat hello.txt
    EOF
  • 在进入对方的ssh的时候注意,我们使用的$resouceFile变量会在本地立即计算,得出结果。如果需要延迟到对方shell环境计算,可以对其进行转义\$resouceFile