LINUX.ORG.RU

Bash выполнять условия

 


0

1

Задача брать ip из файла, и пробовать соединится с хостом

cat text.txt |  while read ipoutput
do
    status=$(sshpass -p $pass ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 $user@$ipoutput echo ok)
      if [[ $status == ok ]] ; then
  	echo
        {
          echo $ipoutput
        } >> ubuntu.txt
		elif [[ $status == "Permission denied"* ]] ; then
  	echo
        {
          echo $ipoutput
        } >> mint.txt
    fi 
done

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


Явно проблему не вижу. Попробуй запустить так:

bash -x script.sh

Увидишь по крайней мере где заканчивается исполнение.

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

А, знаю!

Твой процесс sshpass читает весь STDIN до конца и циклу ничего не остается.

Сделай так:

status=$(sshpass -p $pass ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 $user@$ipoutput echo ok < /dev/null)
KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Да работает!) но почему то при таком раскладе не сохраняются ип в фаил mint.txt в фаил ubuntu.txt все сохраняет

vbox
() автор топика
Ответ на: комментарий от vbox

Вот echo показывает есть соединение получилось то ип выводит

10.211.1.2
Permission denied, please try again.
Permission denied, please try again.
Permission denied, please try again.
а если нет, то текст Permission denied, please try again.

vbox
() автор топика
Ответ на: комментарий от vbox

Скорее всего «Permission denied, please try again.» выводится в STDERR, а у тебя захватывается только STDOUT.

Попробуй перенаправить STDERR в STDOUT

status=$(sshpass -p $pass ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 $user@$ipoutput echo ok </dev/null 2>&1)
KennyMinigun ★★★★★
()
Ответ на: комментарий от vbox

Покажи что в $status находится

status=$(sshpass -p $pass ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 $user@$ipoutput echo ok </dev/null 2>&1)
echo "## DEBUG: status = '$status'" >&2
KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

'# DEBUG: status = 'ssh: connect to host 10.211.1.2 port 22: No route to host '# DEBUG: status = 'Permission denied, please try again. '# DEBUG: status = 'Permission denied, please try again. '# DEBUG: status = 'Permission denied, please try again.

vbox
() автор топика
Ответ на: комментарий от vbox
'# DEBUG: status = 'ssh: connect to host 10.211.1.2 port 22: No route to host
'# DEBUG: status = 'Permission denied, please try again.
'# DEBUG: status = 'Permission denied, please try again.
'# DEBUG: status = 'Permission denied, please try again.

Так у тебя по сути нет ниодного успешного соединения. Работает правильно.

KennyMinigun ★★★★★
()

status=$(ssh ... echo ok)

Это какой-то лютый треш. Почему не так? Псевдокод:

if ssh user@host true; then
  echo ok
else
  echo error
else

anonymous
()
Ответ на: комментарий от anonymous

Почему не так?

Он там детектит специфичную ошибку (‘‘Permission denied’’). Зачем – вот Это уже вопрос (проверка фаерволла?).

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

man 1 ssh EXIT STATUS ssh exits with the exit status of the remote command or with 255 if an error occurred.

Узнаем код статуса для ‘‘Permission denied’’ или других интересных случаев и проверяем на эти значения. А сравнение текстового вывода разносортных разноверсионных ssh-серверов и shell'ов - это точно лютый треш.

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