如何有效地从机器上执行机器上的多个命令?
How to execute multiple commands on machineB from machineA efficiently?
我的 machineA
中有一个 tar (abc.tar.gz)
文件,我需要将其复制并取消 tar 在我的 machineB
中。在我的 machineB
中,我有一个应用程序 运行ning,它是 tar 文件的一部分,所以我需要编写 shell 脚本,它将在 [=13] 上执行以下操作=] 通过 运行 在 machineA
-
上使用 shell 脚本
- 在
machineB
上执行命令 sudo stop test_server
- 删除
/opt/data/
文件夹中的所有内容,留下 tar 文件。
- 将 tar 文件复制到此位置
machineB
中 /opt/data/
- 现在取消tar
/opt/data/
文件夹中的 tar 文件。
- 现在执行这个命令
sudo chown -R posture /opt/data
- 之后执行此命令以发送tar服务器
sudo start test_server
在 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
提示以显示进度是一个微不足道的练习。
如果你拥有一切 - ssh
和 sudo
- 设置无密码访问,事情会更顺利,但我相信即使你获得密码也应该有效一两个提示。
(如果你确实想远程存储 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
我的 machineA
中有一个 tar (abc.tar.gz)
文件,我需要将其复制并取消 tar 在我的 machineB
中。在我的 machineB
中,我有一个应用程序 运行ning,它是 tar 文件的一部分,所以我需要编写 shell 脚本,它将在 [=13] 上执行以下操作=] 通过 运行 在 machineA
-
- 在
machineB
上执行命令 - 删除
/opt/data/
文件夹中的所有内容,留下 tar 文件。 - 将 tar 文件复制到此位置
machineB
中/opt/data/
- 现在取消tar
/opt/data/
文件夹中的 tar 文件。 - 现在执行这个命令
sudo chown -R posture /opt/data
- 之后执行此命令以发送tar服务器
sudo start test_server
sudo stop test_server
在 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
提示以显示进度是一个微不足道的练习。
如果你拥有一切 - ssh
和 sudo
- 设置无密码访问,事情会更顺利,但我相信即使你获得密码也应该有效一两个提示。
(如果你确实想远程存储 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