LINUX.ORG.RU
ФорумAdmin

Скрипт на Bash:ошибка в логике

 


0

2

Добрый день!

Задача: скрипт создает на удаленных машинах бэкап,присваивает ему имя в виде ip+нынешняя дата,и копирует его.

Имеется список с ip,где есть как доступные,так и недоступные ip. При отрабатывании цикла,скрипт доходит до первого доступного ip,проделывает с ним нужные действия (архивирование нужных файлов и копирование с удаленного сервера),и дальше по списку ip скрипт не отрабатывает. Код прикладываю:

#!/bin/bash
rm -f /pingFailed.log
passwd=$(head -1 passwd)
while read ip
 do   
  mkdir -p  /zzz/$ip/
  ping -c 1 $ip &>>/dev/null
   if [ "$?" = "0" ];then         
    #echo "Good $ip" >> /pingFailed.log
    sshpass -p $passwd  ssh root@$ip 'DATE=$(date +%d-%m-%y); ADDR=$(ip addr | grep -oP "([\d]{1,3}[\.]){3}102"); tar -vcf /tmp/"$ADDR"_"$DATE".tar /media/'
 
    sshpass -p $passwd scp root@$ip:/tmp/*.tar /zzz/$ip/    
sshpass -p $passwd ssh root@$ip 'rm -f /tmp/*.tar'
    else  
     echo "Недоступен $ip" >> /pingFailed.log
   fi
done < iplist

Подскажите, что я делаю не так?

if [ «$?» = «0» ];then

if [ $? -eq 0 ]
then

или

if [[ "$?" = "0" ]]
then

while read ip
done < iplist

Например

for ip in $(cat iplist)

Задача: скрипт создает на удаленных машинах бэкап,присваивает ему имя в виде ip+нынешняя дата,и копирует его.

А наладить бакапилку на машинах, которая будет нужное на сервер заливать не вариант?

Radjah ★★★★★
()

grep грепает только адреса с четвертым октетом 102. is it okay

anonymous
()

Зачем создавать локально если вы его и так к себе копируете, при этом не проверяете скопировался ли он и все равно удаляете (причем по маске)? Не проще сразу лить?
Создание в /tmp у вас это общий раздел с /media ? А то памяти/места может не хватить.
Удаление по маске *.tar, это просто замечательно, а вдруг кто-то другой в этот момент тоже что-то положил туда?
Про «грепу» вам уже ответили выше.

anc ★★★★★
()

Вставь после каждой команды echo «cmdname» $?, чтобы видеть где break происходит.

IPR ★★★★★
()
Ответ на: комментарий от anc

или if [[ "$?" = "0" ]]; then

Тогда уж проще
if ping -c 1 $ip > /dev/null; then....

Занятно, что на if [[ «$?» = «0» ]] ничего не сказали, хотя это покруче будет о странностях представлений как это пишется на bash-like.

vodz ★★★★★
()

раз по делу уже всё сказали, то я влезу с предложением использовать ansible и костылять читаемый yml вместо нечитаемого баша.

SevikL ★★★★★
()
Ответ на: комментарий от everlast737

мне тоже раньше именно на баше нужно было. ну да ладно, это оффтоп.

SevikL ★★★★★
()
Ответ на: комментарий от vodz

Скопипастил первую попавшуюся, только для того что бы было понятно о чем я, мог бы и другую скопипастить.

anc ★★★★★
()
Ответ на: комментарий от gremlin_the_red

А что, set -x уже запретили?

А оно что, уже возвращает errcode?

IPR ★★★★★
()
Ответ на: комментарий от Radjah

или
if [[ «$?» = «0» ]]
then

=

Ну хоть бы поправил его сразу...

YAR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.