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

How to execute multiple commands on machineB from machineA efficiently?

我的 machineA 中有一个 tar (abc.tar.gz) 文件,我需要将其复制并取消 tar 在我的 machineB 中。在我的 machineB 中,我有一个应用程序 运行ning,它是 tar 文件的一部分,所以我需要编写 shell 脚本,它将在 [=13] 上执行以下操作=] 通过 运行 在 machineA -

上使用 shell 脚本

machineA 中,我会将我的 shell 脚本和 tar 文件放在同一位置。截至目前,我通过阅读教程获得了低于 shell 的脚本,因为我最近 tar 使用 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 脚本并显示正确的错误消息?

您可以在一次 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.[=23= 的插值中缺少美元符号的错误]

我把远程脚本放在双引号里,这样你就可以在脚本里面使用$SOFTWARE_INSTALL_LOCATION;请注意如何将内插值内插到远程 shell 的单引号中(当然,如果值包含单引号,这将不起作用)。

如果您可以 运行 作为用户 posture 直接执行 tar 命令,您也许可以避免 chown

添加 echo 提示以显示进度是一个微不足道的练习。

如果你拥有一切 - sshsudo - 设置无密码访问,事情会更顺利,但我相信即使你获得密码也应该有效一两个提示。

(如果你确实想远程存储 tarball,只需在 tar 之前添加一个 tee。)

您可以使用 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>&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