2016-03-12 5 views
1

Мне нужно прочитать переменную из удаленного файла через SSH и сравнить ее. Но я получаю переменную в неправильном формате. как это сделать правильно?ssh bash получить переменную из удаленного файла

#!/bin/bash 
    pass='dpassspass' 
    user='[email protected]' 
    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

Vars my_var и read заполнены строкой, заканчивающейся '\ r', говорящей эхо, чтобы вернуться к первому столбцу. Я думаю, что это проблема с вашим местным скриптом. Вы можете исправить это с помощью

tr -d "\r" <myfile> myfile2 
+0

I change to read = $ (sshpass -p $ pass ssh -t $ user cat $ path16 | tr -d "\ r"), и все работает нормально. Спасибо! –

1

Ваша основная проблема связана с использованием некотируемых здесь документов для команд. Вы должны правильно понять, в каком порядке оболочка интерпретирует эти принципы.

ssh remote cmd >file 

cmd выполняет удаленно, но первый перенаправляет вывод команды ssh к локальной file.

ssh remote "cmd >’$file'" 

Кавычки причиной Перенаправление быть частью remote командной строки. Однако переменная file сначала интерпретируется локальной оболочкой.

ssh remote 'cmd >"$file"` 

Одиночные кавычки не позволяют локальной оболочке изменять команду перед ее отправкой. Таким образом, его переменная интерполяция и перенаправление обрабатываются оболочкой remote в этом порядке.

Так что ваша прокомментированная команда «не работает» может быть легко исправлена ​​при правильном цитировании. Тем не менее, будет намного более элегантно и эффективно использовать один удаленный сеанс и выполнить все команды за один раз. Однако смешение локальной переменной IP с удаленными переменными требует некоторого довольно сложного экранирования. Большим упрощением было бы передать значение стандартного ввода, чтобы весь удаленный сценарий мог быть одинарным.

#!/bin/bash 
pass='dpassspass' 
user='[email protected]' 
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 

Выход из удаленной оболочки - две линии; мы выделяем его с помощью префиксов оболочки и операторов замещения суффикса.