在shell脚本中使用ssh变量

时间:2014-04-15 06:40:51

标签: shell unix ssh

我想在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不打印任何内容。

2 个答案:

答案 0 :(得分:1)

我会通过定义一些特殊语法来优化最后一个答案,以便将所需的设置传回去,例如: &#34; #SET var=value&#34;

我们可以将命令(我们想要在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

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

答案 1 :(得分:0)

这样的脚本可用于将来自SSH的输出 all 存储到变量中:

#!/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)