gpt4 book ai didi

linux - Bash - 将 2 个 ssh 调用合并为 1 个(带有可选和强制命令)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:19 25 4
gpt4 key购买 nike

我有一个包含 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com