我的(abc.tar.gz)
中有一个tar machineA
文件,我需要将其复制并在我的machineB
中解压缩。在我的machineB
中,我有一个运行的应用程序,它是该tar文件的一部分,因此我需要编写shell脚本,通过在machineB
上运行shell脚本,在machineA
上执行这些操作。 -
sudo stop test_server
machineB
/opt/data/
文件夹内的所有内容。machineB
/opt/data/
内复制该tar文件
/opt/data/
文件夹中的tar文件。sudo chown -R posture /opt/data
sudo start test_server
在machineA
中,我将把我的shell脚本和tar文件放在同一个位置。截至目前,我已经通过阅读教程获得了以下shell脚本,因为我最近开始使用shell脚本。
#!/bin/bash
set -e
readonly SOFTWARE_INSTALL_LOCATION=/opt/data
readonly MACHINE_LOCATION=(machineB) # I will have more machines here in future.
readonly TAR_FILE_NAME=abc.tar.gz
ssh david@${MACHINE_LOCATION[0]} 'sudo stop test_server'
ssh david@${MACHINE_LOCATION[0]} 'sudo rm -rf /opt/data/*'
sudo scp TAR_FILE_NAME david@${MACHINE_LOCATION[0]}:$SOFTWARE_INSTALL_LOCATION/
ssh david@${MACHINE_LOCATION[0]} 'tar -xvzf /opt/data/abc.tar.gz'
ssh david@${MACHINE_LOCATION[0]} 'sudo chown -R posture /opt/data'
ssh david@${MACHINE_LOCATION[0]} 'sudo start test_server'
我是否把一切都搞定了,或者我们可以改进上面的shell脚本中的任何内容?我需要在生产机器上运行上面的shell脚本。
是否可以显示每个步骤的状态消息,说这个步骤是否已成功执行,因此转到下一步,否则将使用正确的错误消息终止出shell脚本?
答案 0 :(得分:1)
您可以在单ssh
次往返中完成所有操作,并且根本不需要将tarball存储在远程位置。
#!/bin/bash
set -e
readonly SOFTWARE_INSTALL_LOCATION=/opt/data
readonly MACHINE_LOCATION=(machineB)
readonly TAR_FILE_NAME=abc.tar.gz
ssh david@${MACHINE_LOCATION[0]} "
set -e
sudo stop test_server
sudo rm -rf '$SOFTWARE_INSTALL_LOCATION'/*
tar -C '$SOFTWARE_INSTALL_LOCATION' -x -v -z -f -
sudo chown -R posture '$SOFTWARE_INSTALL_LOCATION'
sudo start test_server" <"$TAR_FILE_NAME"
这也解决了tarball将被提取到您的主目录(而不是/opt/data
)的错误,并且您在变量TAR_FILE_NAME
的插值上缺少一个美元符号。
我将远程脚本放在双引号中,以便您可以在脚本中使用$SOFTWARE_INSTALL_LOCATION
;注意插值如何在远程shell的单引号中插值(当然,如果值包含单引号,则无效)。
如果您可以直接以用户chown
运行tar
命令,则可以避开posture
。
添加echo
提示以显示进度是一项微不足道的工作。
如果您拥有所有内容(ssh
和sudo
- 设置无密码访问权限,那么事情将变得更加顺畅,但我相信即使您收到密码提示或2。
(如果您确实要远程存储tarball,只需在tee
之前添加tar
。)
答案 1 :(得分:1)
您可以使用ssh命令的退出状态为每个步骤生成状态消息,就像我尝试使用前两个ssh命令一样。
#!/bin/bash
set -e
readonly SOFTWARE_INSTALL_LOCATION=/opt/data
readonly MACHINE_LOCATION=(machineB) # I will have more machines here in future.
readonly TAR_FILE_NAME=abc.tar.gz
# An error exit function
function error_exit
{
echo "$1" 1>&2
exit 1
}
if ssh david@${MACHINE_LOCATION[0]} 'sudo stop test_server'; then
echo "`date -u` INFO : Stopping test_Server" 1>&2
else
error_exit "`date -u` ERROR : Unable Stop test_Server! Aborting."
fi
if ssh david@${MACHINE_LOCATION[0]} 'sudo rm -rf /opt/data/*'; then
echo "`date -u` INFO : Removing /opt/data" 1>&2
else
error_exit "`date -u` ERROR : Unable to remove! Aborting."
fi
sudo scp TAR_FILE_NAME david@${MACHINE_LOCATION[0]}:$SOFTWARE_INSTALL_LOCATION/
ssh david@${MACHINE_LOCATION[0]} 'tar -xvzf /opt/data/abc.tar.gz'
ssh david@${MACHINE_LOCATION[0]} 'sudo chown -R posture /opt/data'
ssh david@${MACHINE_LOCATION[0]} 'sudo start test_server'
密码管理您可以创建ssh pass-wordless身份验证。 http://www.linuxproblem.org/art_9.html