我正在尝试将作为一个很酷的项目自动部署到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
直到服务器断开连接,这里和下面的一切都不会运行
答案 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?及其答案。