【问题标题】:SSH in a script - commands not running on remote server [duplicate]脚本中的 SSH - 远程服务器上未运行的命令 [重复]
【发布时间】:2015-05-16 02:54:57
【问题描述】:

我需要一个 bash 脚本的帮助,该脚本以 root 身份连接到服务器,执行一些命令,然后从服务器退出。

我试过这个脚本,但是当登录到服务器时执行命令没有运行!

#!/bin/bash

sudo ssh -o ConnectTimeout=10 $1 'exit'

if [ $? != 0 ]; then
        echo "Could not connect to $1 , script stopped"
        exit
fi

sudo ssh $1

echo "SRV=`cat /etc/puppet/puppet.conf | grep -i srv_domain | awk '{print $3}'`"
echo $SRV
echo "puppetMaster=`host -t srv _x-puppet._tcp.$SRV | head -1 | awk '{print $8}' | cut -f1 -d"."`"
echo $puppetMaster
'exit'

【问题讨论】:

  • 顺便说一句,使用 ControlMaster 设置会做得更好——这样你就可以使用一个持久的 SSH 连接来进行测试和稍后的实际命令,而不是假设如果测试 SSH连接有效,然后真正的连接有效(并支付两次身份验证/连接/启动费用)。

标签: bash shell


【解决方案1】:

我很惊讶还没有人建议一个heredoc。

sudo ssh "$1" <<'EOF'
SRV=`cat /etc/puppet/puppet.conf | grep -i srv_domain | awk '{print $3}'`
echo $SRV
echo "puppetMaster=`host -t srv _x-puppet._tcp.$SRV | head -1 | awk '{print $8}' | cut -f1 -d"."`"
echo $puppetMaster
EOF

这会将从&lt;&lt;'EOF' 到以EOF 开头的行的所有内容输入ssh 的标准输入,以由远程shell 接收和运行。

【讨论】:

  • 在 EOF 之后,当我尝试 ssh 到 $puppetMaster 时,但它不起作用,因为 $puppetMaster 的值为空!为什么 ?我该如何解决?
  • puppetMaster 设置在 remote shell 内(运行在ssh 连接另一侧的shell,在EOF 处退出)。本地 shell 对此一无所知。以安全可靠的方式将变量从远程 shell 收集到本地 shell 有点复杂;我建议将其作为一个单独的问题提出。
  • ...嗯——从单个 SSH 会话中收集多个。如果你想每次 ssh 调用只收集一个变量,那很容易:puppetMaster=$(ssh "$1" &lt;&lt;'EOF'host -t srv "_x-puppet._tcp.$(cat /etc/puppet/puppet.conf | grep -i srv_domain | awk '{print $3}')" | head -1 | awk '{print $8}' | cut -f1 -d"."EOF
  • 工作 :) 你是男人!非常感谢
【解决方案2】:

脚本中ssh machine 之后的命令不在计算机上运行。一旦ssh 退出,它们将在本地机器上运行。

要么将要运行的命令指定为ssh 的参数,要么运行 ssh 并使其从标准输入读取命令,然后将命令发送给它。

ssh machine ls
# or
echo ls | ssh machine

【讨论】:

    【解决方案3】:

    你似乎对什么在哪里运行有点困惑。

    ssh -o ConnectTimeout=10 $1 'exit'
    

    将连接到 $1,运行退出,然后断开连接。

    ssh -o ConnectTimeout=10 $1 'echo hello world' 
    

    将打印hello world 服务器,然后断开连接。

    ssh $1

    将在遥控器上打开一个外壳。 shell 结束后,以下命令将在本地运行。

    echo "SRV=`cat /etc/puppet/puppet.conf | grep -i srv_domain | awk '{print $3}'`"
    echo $SRV
    echo "puppetMaster=`host -t srv _x-puppet._tcp.$SRV | head -1 | awk '{print $8}' | cut -f1 -d"."`"
    echo $puppetMaster
    'exit'
    

    您可能想要的是在遥控器上启动 bash 并通过标准输入向它转发您想给它的命令。

    echo "my commands" | ssh $1 bash
    

    从技术上讲,你不需要那个 bash —— 即使没有它,ssh 也会启动 bash(但使用不同的 rc 文件)。

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2021-09-04
      • 2019-05-18
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多