如何有效地在机器上执行多个命令?

时间:2015-02-17 03:22:46

标签: linux bash shell ssh scp

我的(abc.tar.gz)中有一个tar machineA文件,我需要将其复制并在我的machineB中解压缩。在我的machineB中,我有一个运行的应用程序,它是该tar文件的一部分,因此我需要编写shell脚本,通过在machineB上运行shell脚本,在machineA上执行这些操作。 -

  • sudo stop test_server
  • 上执行命令machineB
  • 删除{tarne文件中的/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脚本?

2 个答案:

答案 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提示以显示进度是一项微不足道的工作。

如果您拥有所有内容(sshsudo - 设置无密码访问权限,那么事情将变得更加顺畅,但我相信即使您收到密码提示或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