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

时间:2016-10-28 11:37:10

标签: 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的事实所以我的问题是这两个bash命令部分可以组合成一个SSH调用(;和{{1} }组合)?

2 个答案:

答案 0 :(得分:2)

虽然可以将一组命令作为简单的单引号字符串传递,但我不建议这样做,因为:

  • 内部引号应该被转义
  • 很难阅读(并维护!)在文本编辑器中看起来像字符串的代码

我发现最好将脚本保存在单独的文件中,然后将它们作为标准输入传递给 <!-- // Begin Module: [Dark] Image left text right \\ --> <table class="responsive-table" width="650" bgcolor="#d1d6e1" border="0" cellpadding="0" cellspacing="0" align="top" mc:repeatable="trading" mc:variant="[Dark] Image left text right"> <tbody> <tr> <td width="5%"></td> <td width="90%" align="center"> <table width="100%" cellpadding="0" cellspacing="0" border="0"> <tbody> <tr><td width="650" height="30"></td></tr> <tr> <td width="35%" align="center" valign="top" class="mobile-width-100" mc:label="image" mc:edit="iltrdimage"> <a href="#" target="_blank"> <img src="http://placehold.it/800x538" width="230" style="text-decoration: none;"> </a> </td> <td width="5%" class="mobile-height-30"></td> <td width="60%" align="left" valign="top"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td style="padding-bottom: 5px;" mc:label="body title" md:hideable="" mc:edit="iltrdbodytitle"> <a href="#" class="block-title" style="font-family: 'OpenSans', Arial; font-size: 16px !important;line-height: 18px;color: #224691; text-decoration: none; font-weight: 700;" mc:label="heading"> <font color="#224691">Title</font> </a> </td> </tr> <tr> <td style="padding-bottom: 10px;" mc:label="body text" mc:edit="iltrdbodytext"> <span style="font-family: 'OpenSans', Arial; color: #323232;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer pharetra hendrerit felis, eget auctor ex tincidunt eget. Vestibulum consequat quam nibh. </span></td> </tr> </table> <table bgcolor="#2f57ad" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td align="center" class="btn"> <table cellpadding="0" cellspacing="0"> <tr> <td mc:label="button" mc:edit="iltrdbutton"> <a href="#" class="btn-more" target="_blank" style="font-family: 'OpenSans', Arial; color: #fff; font-size: 15px; text-decoration: none;"><font color="#ffffff">Read more</font></a> </td> <td style="padding-left: 10px; padding-top: 1px;"><span style="font-size: 13px; color: #fff;">▸</span></td> </tr> </table> </td> </tr> </tbody> </table> </td> </tr> <tr><td width="650" height="30"></td></tr> </tbody> </table> </td> <td width="5%"></td> </tr> </tbody> </table> <!-- // End Module: [Dark] Image left text right \\ -->

ssh

以相同的方式执行多个脚本。只需连接更多脚本:

cat script.sh | ssh -T user@host -- bash -s -

如果您仍想使用字符串,请改用here document

cat a.sh b.sh | ssh -T user@host -- bash -s -

请注意ssh -T user@host -- <<'END_OF_COMMANDS' # put your script here END_OF_COMMANDS 选项。您不需要为非交互式脚本进行伪终端分配。

答案 1 :(得分:0)

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) ;

   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'