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

标签 linux bash ssh

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

相关文章:

linux - 在 Linux shell bash 脚本中复制文件时出错

linux - WEXITSTATUS 命令

linux - 如何为 IP 范围添加 spf 记录?

javascript - 如何将看起来像英文的 Unicode 文本转换为 ASCII?

ssh - Google 计算引擎 - 访问 SSH 几次后被阻止

java - Jsch - 一个 session 多个 channel

linux - 如何连接到多个服务器来运行相同的查询?

ios - Apple 推送通知无法通过部署在 Linux 中的 Java Web 服务运行

regex - 如何检查字符串是否只包含 A-Z、a-z 和 0-9?

c - 在 X 时间运行 Bash 命令并终止 X 时间