我需要通过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获取数据?
答案 0 :(得分:2)
变量my_var
和read
填充了以'\ 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的前缀和后缀替换运算符来区分它。