我有一个包含 2 个 ssh
命令的脚本。 SSH 脚本使用 SSH 登录远程服务器并删除 docker 镜像。
ssh person@someserver.com 'set -x &&
echo "Stop docker images" ;
sudo docker stop $(sudo docker ps -a -q) ;
sudo docker rmi -f $(sudo docker images -q) ;
sudo docker rm -f $(sudo docker ps -a -q)'
注意使用 ;
来分隔命令(我们不关心一个或多个命令是否失败)。
第二个 ssh
命令使用 SSH 登录到同一台服务器,获取 docker compose 文件并运行 docker。
ssh person@someserver.com 'set -x &&
export AWS_CONFIG_FILE=/somelocation/myaws.conf &&
aws s3 cp s3://com.somebucket.somewhere/docker-compose/docker-compose.yml . --region us-east-1 &&
echo "Get ECR login credentials and do a docker compose up" &&
sudo $(aws ecr get-login --region us-east-1) &&
sudo /usr/local/bin/docker-compose up -d'
请注意使用 &&
来分隔命令(这次我们确实关心是否一个或多个命令失败,因为我们获取退出代码,即 exitCode=$?
) .
我不喜欢我必须将它分成 2 个,所以我的问题是这 2 个部分的 bash 命令可以组合成一个 SSH 调用(同时使用 ;
和 &&
组合)?
最佳答案
虽然可以将一组命令作为简单的单引号字符串传递,但我不建议这样做,因为:
- 应转义内部引号
- 很难阅读(和维护!)在文本编辑器中看起来像字符串的代码
我发现最好将脚本保存在单独的文件中,然后将它们作为标准输入传递给 ssh
:
cat script.sh | ssh -T user@host -- bash -s -
几个脚本的执行都是以同样的方式完成的。只需连接更多脚本:
cat a.sh b.sh | ssh -T user@host -- bash -s -
如果您仍想使用字符串,请使用 here document相反:
ssh -T user@host -- <<'END_OF_COMMANDS'
# put your script here
END_OF_COMMANDS
注意 -T
选项。您不需要为非交互式脚本分配伪终端。
关于linux - Bash - 将 2 个 ssh 调用合并为 1 个(带有可选和强制命令),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40304269/