连接到外部服务器后,Shell脚本停止

时间:2018-10-26 20:12:39

标签: amazon-web-services sh

我正在尝试将作为一个很酷的项目自动部署到AWS Server,以完成我的编码课程。我正在使用ShellScript自动化不同的流程,但是在连接到AWS E2 Ubuntu服务器时。连接到服务器后,在关闭连接之前它将不执行任何其他shell命令。有没有办法让它在连接时继续发送命令?

read -p "Enter Key Name: " KEYNAME

read -p "Enter Server IP With Dashes: " IPWITHD

chmod 400 $KEYNAME.pem

ssh -i "$KEYNAME.pem" ubuntu@ec2-$IPWITHD.us-east-2.compute.amazonaws.com

直到服务器断开连接,这里和下面的一切都不会运行

1 个答案:

答案 0 :(得分:2)

一些基本要点:

shell脚本是要执行的Shell的一系列顺序命令。它运行一个程序,等待其退出,然后运行下一个程序。

class Runner { public Object run(Map<String, Object> input); public String name(); } public class Test { public static void main(String args[]) { Map<String, Object> map = Maps.newHashMap(); List<Runner> runners; forEach(Runner runner: runners) { Object obj = runner.run(map); map.put(runner.name(), obj); } } } 程序连接到服务器,并告诉服务器该怎么做。退出后,您将不再连接到服务器。

您在ssh之后输入的说明仅在ssh退出时运行。这些命令将在您的本地计算机上运行,​​而不是ssh进入的服务器上运行。

因此,您要做的是运行ssh,并告诉它在服务器上运行一组步骤,然后退出。

查看ssh。它说:

  

ssh目标[命令]

     

如果指定了命令,它将在远程主机而不是登录shell上执行

因此,要运行类似man ssh的命令,请使用ssh,如下所示:

echo hi

或者,对于更长的命令,请使用bash heredoc:

ssh -i "$KEYNAME.pem" ubuntu@ec2-$IPWITHD.us-east-2.compute.amazonaws.com "echo hi"

或者,将所有这些命令放在单独的脚本中,并将其通过管道发送到ssh:

ssh -i "$KEYNAME.pem" ubuntu@ec2-$IPWITHD.us-east-2.compute.amazonaws.com <<EOF
  echo "this will execute on the server"
  echo "so will this"
  cat /etc/os-release
EOF

一定要阅读What is the cleanest way to ssh and run multiple commands in Bash?及其答案。