如何通过shell脚本在机器上执行命令?

时间:2014-10-23 06:26:17

标签: linux bash unix ssh ubuntu-12.04

我有一个在Ubuntu 12.04上运行的应用程序服务器,我正在启动并通过以下命令停止 -

停止应用服务器

david@machineA:/opt/kml$ /opt/kml/bin/kml_start_stop.sh stop

启动应用服务器

david@machineA:/opt/kml$ /opt/kml/bin/kml_start_stop.sh start

现在我正在尝试编写一个shell脚本,它将使用上面的命令停止并启动我的应用程序服务器,但是这个shell脚本我将从machineX运行。从machineX我们可以无需密码即可登录用户davidmachineA

的密码

例如 - 来自machineX我无需输入密码即可ssh david@machineA

以下是我的开始。一切看起来都合适吗?

#!/bin/bash

ssh david@machineA

/opt/kml/bin/kml_start_stop.sh stop
sleep 10s
/opt/kml/bin/kml_start_stop.sh start

3 个答案:

答案 0 :(得分:1)

您可以使用here document远程执行某些脚本:

ssh david@machineA << EOJ
  /opt/kml/bin/kml_start_stop.sh stop
  sleep 10
  /opt/kml/bin/kml_start_stop.sh start
EOJ

在您的情况下,您还可以在本地执行多个ssh命令和sleep

ssh david@machineA /opt/kml/bin/kml_start_stop.sh stop
sleep 10
ssh david@machineA /opt/kml/bin/kml_start_stop.sh start

顺便说一句,我建议您学习更多关于shell脚本的知识。你可以阅读Advanced Bash Scripting Guide(有批判性的眼睛,确实有不完善之处)和documentation of GNU bash。特别是,要在多台计算机上执行此操作,您可以使用一些bash for循环。

答案 1 :(得分:1)

不,你不能这样做,因为ssh将登录并等待命令,而你想要将命令提供给完全相同的ssh。该脚本看起来应该更像这样:

#!/bin/bash
while read host rest; do
  ssh david@$host <<EOF &
  /opt/kml/bin/kml_start_stop.sh stop
  sleep 10s
  /opt/kml/bin/kml_start_stop.sh start
  EOF
done < hostlist.txt
wait

使用名为“here document”的Bash功能,该功能将文本提供给ssh进程的标准输入。

编辑:我添加了一个小技巧:我在每个ssh作业启动时对其进行后台处理,因为每个作业都需要一些时间才能完成(由于睡眠而至少需要10秒)。然后在最后我做wait等待所有这些完成。这样,整个脚本可以在10秒内运行,加上开销时间,无论有多少台服务器。

答案 2 :(得分:1)

此脚本将执行远程终端上的命令。

#!/bin/bash

ssh david@machineA '/opt/kml/bin/kml_start_stop.sh stop && sleep 10s && /opt/kml/bin/kml_start_stop.sh start'

如果您之前使用了以下脚本,则会生成一个单独的ssh会话shell以连接到远程计算机,并且以下命令将在本地计算机shell上运行,而不是在远程计算机上运行

#!/bin/bash

ssh david@machineA 
/opt/kml/bin/kml_start_stop.sh stop
sleep 10s
/opt/kml/bin/kml_start_stop.sh start