Рейтинг:0

Оператор continue не работает должным образом - bash

флаг cn

Для контекста у меня есть инфраструктура из нескольких машин, использующих ssh. Мы подключаемся через ssh как root на машинах без пароля благодаря файлу author_keys на каждом компьютере. Мы регулярно добавляем новые машины в нашу инфраструктуру.

Проблема заключается в том, чтобы создать скрипт, который:

  1. Пингует всю машину (путем анализа файла, содержащего имена всех наших машин)
  2. Если пинг прошел успешно, проверьте ssh-соединение без пароля (с помощью команды ssh -o BatchMode=yes $machine uname -a )
  3. Если ssh не работает И это из-за этого сообщения: Вы уверены, что хотите продолжить подключение (да/нет)? (потому что это первое ssh-подключение к этой машине, например), затем с ожидаемым сценарием отправьте «да»
  4. Если ssh не работает И это из-за того, что запрашивается пароль, то с ожидаемым сценарием отправьте «CTRL + C»

Моя проблема в том, что два условия 3. и 4. могут произойти на одной машине, и я не могу понять, как использовать оператор continue в моем сценарии.

Этот конкретный случай будет для машины, которая запрашивает «да», но после этого также запрашивает пароль.

Вот как выглядит скрипт:

для машины в `cat ${liste} | grep -v \#`
делать

ping -c1 ${машина} 2>&1 >/dev/null

если [$? -экв 0]
тогда
    эхо ${машина} >> ${пингок}    
    ssh -o BatchMode=yes ${машина} uname -a &> $verifssh 2>&1    
    эхо $? > ${код выхода}
    
    если grep -q "255" "$exitcode"
    тогда        
        вырезать -c 15-74 $verifssh > $verifssh2
                
        если grep "сбой обработки". "$verifssh2"        
        тогда                
            ожидать ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            продолжить 3 
                        
        elif grep "Отказано в доступе (открытый ключ, пароль, интерактивная клавиатура)". "$verifssh2"        
        тогда        
            ожидать ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null            
            echo "${machine} -> Машина запрашивает пароль" >> "${sshnok}"           
        фи
                
    elif grep -q "0" "$exitcode"   
    тогда   
        echo "${machine} работает с ssh"
        эхо "${машина}" >> ${sshok}               
    фи
    
еще
    эхо "${машина}" >> "${пингнок}"     
фи

сделано

Вот сценарий ожидания (он обрабатывает обе ситуации):

установить машину [lindex $argv 0]

порождать ssh $ машина

ожидать {
    "Вы уверены, что хотите продолжить подключение (да/нет)?" {send "yes\r";exp_continue}
    -exact "Пароль: " {close}
    -re $prompt {отправить "выход\r"; закрыть}
}

Короче говоря, моя проблема заключается в том, что для машины, которая запрашивает ответ «да», а затем мне нужен пароль, я хочу зарегистрировать их в ${сшнок} файл, но Продолжить не работает. Я пытался Продолжить / продолжить 2 / продолжить 3 и он все еще не хочет возвращаться в предыдущий цикл.

Archemar avatar
флаг mx
Не уверен, что вы ожидаете (не каламбур), `continue` выйдет из цикла (в этом случае он может выйти только из глобального `для машины в...`)
флаг cn
Спасибо за ваш ответ, тогда я неправильно понял, как использовать continue, есть ли способ, которым я мог бы сказать скрипту, чтобы он повторил цикл с первого или второго, если?
флаг fo
Разве [ответ, который вы получили вчера на stackoverflow] (https://stackoverflow.com/q/71658273/7552), не ответил на этот вопрос?
Archemar avatar
флаг mx
удалить «продолжить» и заменить следующее «elif» на «fi if»?
Рейтинг:0
флаг cn

Как было предложено в комментарии, я бросил Продолжить и вместо нескольких Элиф я только что сделал еще кое-что если заявления :

для машины в кот ${список} | grep -v \#

делать

эхо "."

ping -c1 ${машина} 2>&1 >/dev/null


если [$? -экв 0]

тогда

    
    эхо ${машина} >> ${пингок}
    
    ssh -o BatchMode=yes ${машина} uname -a &> $verifssh 2>&1 
    
    эхо $? > ${код выхода}
    
    
    если grep -q "255" "$exitcode"
    
    тогда
    
    
        вырезать -c 15-74 $verifssh > $verifssh2
        
        
        если grep "сбой обработки". "$verifssh2"
        
        тогда 
        
        
            ожидать ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            

        фи
        
        
        ssh -o BatchMode=yes ${машина} uname -a &> $verifssh 2>&1
        
        вырезать -c 15-74 $verifssh > $verifssh2
        
        
        if grep "Отказано в доступе (открытый ключ, пароль, интерактивная клавиатура)". "$verifssh2"
        
        тогда
        
        
            ожидать ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            echo "${machine} -> Проблема с ssh (запрос mdp)" >> "${sshnok}"
            
            
        фи
        
        
        ssh -o BatchMode=yes ${машина} uname -a &> $verifssh 2>&1
        
        эхо $? > ${код выхода}
        
        
        если grep -q "0" "$exitcode"
        
        тогда
        
        
            эхо "${машина}" >> ${sshok}
            
            
        фи
        
        
    elif grep -q "0" "$exitcode"
    
    тогда
    
    
        эхо "${машина}" >> ${sshok}
        
        
    elif grep -q "1" "$exitcode"
    тогда
    
    
        эхо "wtf 1"
        
        
    фи
    
    
еще


    эхо "${машина}" >> "${пингнок}"
    
    
фи


сделано

Большое спасибо за все ответы!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.