【问题标题】:use of ssh variable in the shell script在 shell 脚本中使用 ssh 变量
【发布时间】:2014-04-15 06:40:50
【问题描述】:

我想在 shell 脚本中使用 ssh 的变量。 假设我有一些变量 a,我在 ssh 中获取了它的值,现在我想在 shell 本身的 ssh 之外使用该变量,我该怎么做?

ssh my_pc2 <<EOF
<.. do some operations ..>
a=$(ls -lrt | wc -l)
echo \$a
EOF
echo $a

在上面的示例中,ssh 中的第一个 echo print 10 打印 10,但第二个 echo $a 什么也不打印。

【问题讨论】:

    标签: shell unix ssh


    【解决方案1】:

    我会通过定义一些特殊的语法来传递所需的设置来完善最后一个答案,例如"#SET var=value"

    我们可以将命令(我们想在 ssh 会话中运行)放在一个 cmdFile 文件中,如下所示:

    a=`id`
    b=`pwd`
    echo "#SET a='$a'"
    echo "#SET b='$b'"
    

    主脚本如下所示:

    #!/bin/bash
    
    # SSH, run the remote commands, and filter anything they passed back to us
    ssh user@host <cmdFile | grep "^#SET " | sed 's/#SET //' >vars.$$
    
    # Source the variable settings that were passed back
    . vars.$$
    rm -f vars.$$
    
    # Now we have the variables set
    echo "a = $a"
    echo "b = $b"
    

    如果您要为大量变量执行此操作,您可以向 cmdFile 添加一个函数,以简化/封装用于传回数据的特殊语法:

    passvar()
    {
      var=$1
      val=$2
      val=${val:-${!var}}
      echo "#SET ${var}='${val}'"
    }
    
    a=`id`
    passvar a
    b=`pwd`
    passvar b
    

    当值包含空格时,您可能需要使用引号。

    【讨论】:

      【解决方案2】:

      这样的脚本可用于将 SSH 的输出所有存储到变量中:

      #!/bin/bash
      
      VAR=$(ssh user@host << _EOF
      id
      _EOF)
      
      echo "VAR=$VAR"
      

      它产生输出:

      VAR=uid=1000(user) gid=1000(user) groups=1000(user),4(adm),10(wheel)
      

      【讨论】:

      • hmmm 但是如果在 ssh 里面有大约 1000 行和 100 个输出变量,但我想使用 ssh 的 10 个特定变量,那么我该如何使用它..?
      • 您可以在远程端运行一个脚本,只输出您感兴趣的内容,或者如果数据太复杂,您可以将信息收集在一个大字符串中,base64 对其进行编码并输出,在客户端解码和解析它。对于复杂的场景,您可能想尝试fabric (docs.fabfile.org/en/1.8)
      猜你喜欢
      • 2018-07-16
      • 2011-06-04
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多