我正在尝试自动部署到AWS服务器,作为我的编码课程的一个很酷的项目。我正在使用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
此处及以下任何内容都不会运行,直到服务器断开连接
几个基本要点:
shell脚本是shell执行的一系列顺序命令。它运行一个程序,等待它退出,然后运行下一个程序。
ssh
程序连接到服务器并告诉它该做什么。退出后,您将不再连接到服务器。
您在ssh之后输入的指令只会在ssh
退出时运行。然后,这些命令将在您的本地计算机上运行,而不是在您进行ssh
ed的服务器上运行。
所以你要做的是运行ssh
并告诉它在服务器上运行一组步骤,然后退出。
看看man ssh
。它说:
ssh目的地[命令]
如果指定了命令,则在远程主机而不是登录shell上执行该命令
所以,要运行像echo hi
这样的命令,你可以像这样使用ssh:
ssh -i "$KEYNAME.pem" ubuntu@ec2-$IPWITHD.us-east-2.compute.amazonaws.com "echo hi"
或者,对于更长的命令,请使用bash heredoc:
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
或者,将所有这些命令放在一个单独的脚本中并将其传递给ssh:
cat commands-to-execute-remotely.sh | ssh -i "$KEYNAME.pem" ubuntu@ec2-$IPWITHD.us-east-2.compute.amazonaws.com
绝对阅读What is the cleanest way to ssh and run multiple commands in Bash?及其答案。