ssh bash从远程文件接收变量

时间:2016-03-12 07:18:44

标签: bash ssh

我需要通过SSH从远程文件中读取变量并进行比较。但我得到一个错误格式的变量。如何正确地做到这一点?

    #!/bin/bash 
    pass='dpassspass'
    user='root@10.10.19.18'
    IP="10.2.1.41"
    path=/sys/variable/serv
    #not work## No such file or directory# write=$(sshpass -p $ovhpass ssh -t $user echo "$IP" > $path)
    sshpass -p $pass ssh -t $user  << EOF
    echo "$IP" > $path
    EOF
    my_var=$(sshpass -p $pass ssh -t $user "cd /sys_ovh; ./serv.bash")
    echo mystart-"$my_var"-myend
    read=$(sshpass -p $pass ssh -t $user cat $path)
    echo start-"$read"-end
    echo start-"$IP"-end
    if [ "$read" == "$IP" ]; then 
    echo "run"
    fi

输出:

Connection to 10.10.19.18 closed.
-myendt-10.2.1.41
Connection to 10.10.19.18 closed.
-endt-10.2.1.41
start-10.2.1.41-end

我犯了哪个错误?如何从SSH获取数据?

2 个答案:

答案 0 :(得分:2)

变量my_varread填充了以'\ r'结尾的字符串,告诉echo返回第一列。我认为这是您的本地脚本的问题。您可以使用

更正此问题
tr -d "\r" < myfile > myfile2

答案 1 :(得分:1)

您的根本问题来自于在命令中使用未加引号的文档。你应该正确理解shell解释这些结构的顺序。

ssh remote cmd >file

远程执行cmd,但首先将ssh命令的输出重定向到本地file

ssh remote "cmd >’$file'"

引号导致重定向成为remote命令行的一部分。但是,变量file首先由本地shell解释。

ssh remote 'cmd >"$file"`

单引号可防止本地shell在发送之前修改命令。因此,变量插值和重定向都由remote shell按此顺序处理。

所以你的评论出来了#34;没有工作&#34;可以通过适当的引用轻松修复命令。但是,使用单个远程会话并一次执行所有命令将更加优雅和高效。但是,将局部变量IP与远程变量混合可以调用一些相当精细的转义。一个主要的简化是在标准输入上传递值,以便整个远程脚本可以单引号。

#!/bin/bash 
pass='dpassspass'
user='root@10.10.19.18'
IP="10.2.1.41"
result=$(echo "$IP" |
  sshpass -p "$pass" ssh -t "$user" '
    path=/sys/variable/serv
    cat > "$path"
    cd /sys_ovh
    ./serv.bash
    cat "$path"')
echo mystart-"${result%$'\n'*}"-myend
echo start-"${result#*$'\n'}"-end
echo start-"$IP"-end
if [ "${result#*$'\n'}" == "$IP" ]; then 
  echo "run"
fi

远程shell的输出是两行;我们通过使用shell的前缀和后缀替换运算符来区分它。