LINUX.ORG.RU

[bash] случайный выход из цикла

 


0

1

читаю построчно файл и на каждой итерации должен выполнять некую операцию по ssh на другой машине (на локальной машине). И так вот сегодня появилось не знаю как назвать иначе «не объяснимое поведение»

while read line ; do
	echo $line
	ssh user@127.0.0.1 "echo"
	echo "-----"
done < file.txt

в file.log больше одной строки. Но нданный цикл отрабатывает только одну итерацию для самой первой строки.

если убрать вызов ssh то цикл ровно столько раз сколько строк в файле.

Я понятие не приложу, как вызов ssh приводит к завершению работы цикла, притом выход происходит не сразу после того как отработает ssh, а благополучно дойдет до конца цикла, и не войдет в следующую итерацию.

ssh настроен по открытому ключу поэтому пароль не запрашивается.


> file.log

file.txt

?

P.S. В скриптах полный ноль, просто в глаза бросилось.

anonymous
()

тупой вопрос: а причем здесь file.log, когда чтение идет из file.txt ?
потом, на какой ОС это крутится? с CRLF там в файле всё в порядке?

xydo ★★
()

а если сделать вот так

for line in `seq 1 10`
do
	echo $line
	ssh user@127.0.0.1 "echo"
	echo "-----"
done

то здесь цикл нормально отработает 10 раз.

Cupper
() автор топика
Ответ на: комментарий от Cupper
 while [ $COUNTER -lt 10 ] 
do
    echo $line
    ssh user@127.0.0.1 "echo"
    echo "-----"
    let COUNTER=COUNTER+1
 done 

работает 10 раз.

 cat number.txt | while read line 
do
    echo $line
    ssh user@127.0.0.1 "echo"
    echo "-----" 
    #let COUNTER=COUNTER+1
 done 

работает 1 раз

 user@eprusarw0243:~/New folder/mdm_tester/bin> cat number.txt
1
2 
3 
4 
5 
6 
7 
8 
9 
10


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

была такая мысль что ssh может юзать как то переменную с этим же именем. Но даже если было так то на следующей итерации она все равно должна заполняться новым значением.

Но все равно поменял, и ничего не произошло.

Cupper
() автор топика

>в file.log больше одной строки. Но нданный цикл отрабатывает только одну итерацию для самой первой строки.

строкой называется последовательность символов, которые кончаются на \n. Это в нормальных системах. В маздее строкой называется НЁХ - символы, в конце которых \r\n, или вообще ничего нет.

У вас чем строки кончаются? (man hexdump, man xxd)

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

а что такое xargs ?

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

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

ну, на каждой итерации она выводится, и после вызова ssh она остается неизменной, и файл тоже остается не изменный. И все равно это будет послендяя итерация. Кому не лень попробуйте у себя запустить те примеры которые я привел, какой у вас результат ?

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

плюс стоит добавить после цикла echo 'blah-blah-blah'
если не выведет, значит ssh как-то заставляет завершаться родительский процесс.

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

вот скажи мне если цикл без вызова ssh отрабатывает ровно столько сколько строк в файле, а если вставить вызов ssh то это будет последняя итерация, причем тут «чем заканчивается», яж не говорю что «ой у меня цикл не работает». Я из vim файл писал.

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

после ssh выполнятся все операторы до самого конца цикла, нет ssh не прерывает цикл.

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

не понял как кавычки тут должны сыграть роль ? Но у меня в скрипте все перековычено.

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

получается во вторую итерацию цикл вошел ? тогда это что то другое.

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

но если сделать
ssh user@127.0.0.1 «ls»
то выводится на экран листинг.

стоп, смотри, какие есть ограничения на частоту подключений по ssh. должны быть в /etc/ssh/sshd_config

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

а может ли ssh замещать то что было получено вызовом cat для while ? Это единственно причина которую я вижу, что ssh затирает данные для while

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

>вот скажи мне если цикл без вызова ssh отрабатывает ровно столько сколько строк в файле, а если вставить вызов ssh то это будет последняя итерация, причем тут «чем заканчивается», яж не говорю что «ой у меня цикл не работает». Я из vim файл писал.

а мне файл не видно. выкладывай, скажу.

Может у тебя файле _одна_ строка с моей ТЗ, и с ТЗ bash'а?

А может, действия в ssh читают stdin, а stdin вы сами взяли из файла. Вот у вас первая строка идёт в line, а все остальные в ssh.

drBatty ★★
()
Ответ на: комментарий от xydo
cat number.txt | while read line11 
do
   echo $line11
   ssh user@127.0.0.1 "echo 1"
   ssh user@127.0.0.1 "echo 2"
   echo "-----"
done
echo "++++++++++++++++++++++++++++++++"

все также одна итерация вместо 10, и два вызова ssh без проблем.

Cupper
() автор топика
Ответ на: комментарий от Cupper
user@3:~/New folder/bin> ./run.sh
1
1
2
-----
++++++++++++++++++++++++++++++++

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

>а может ли ssh замещать то что было получено вызовом cat для while ? Это единственно причина которую я вижу, что ssh затирает данные для while

если в ssh у вас read, то так и будет. И если просто в цикле read, тоже

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

может вас просят ввести пароль, а вы вводите 1 2 3 4 5 6 7 8 9 ;)

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

> А может, действия в ssh читают stdin, а stdin вы сами взяли из файла. Вот у вас первая строка идёт в line, а все остальные в ssh.

вот это уже что то боле менее похожее на правду. Тогда мне значит нужно... нужно считать строки из файла в список и уже его прогнать... хм над поискать как списки делать.

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

или же cat сливает остальные строки ssh-у.

короче вот так работает нормально)
ssh user@127.0.0.1 «ls» >/dev/null </dev/null 2>/dev/null

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

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

ничего страшного - фсё фтопку, потоки 1 и 2 в топку, поток 0 из топки. :-)

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

перенаправление stdin, stdout и stderr в файлы. в данном случае используется /dev/null - моделирует черную дыру.

xydo ★★
()
Ответ на: комментарий от xydo
array_lines=()
index=0
cat $PAIR_CONFIG | while read pair_file
do
	is_comment=`expr "$pair_file" : '^\(#\).*'`
	if [ -n "$pair_file" ] && [ -z $is_comment ]
	then
		array_lines[$index]=$pair_file
		let index=index+1
	fi
done

echo ${array_lines[0]} 
echo ${array_lines[1]}

как сделать такое, только правильно. А то после выхода из цикла, массив пустой.

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

ssh жрёт stdin

$ echo "password" | ssh localhost echo 
ksu@localhost's password:

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

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

>как сделать такое, только правильно. А то после выхода из цикла, массив пустой.

введите отладочную печать

вы пишете «если коммент пуст», но у вас он наверное не пуст?

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

этот набор символов меня напрягает и я пока не понимаю его смысл. а к expr уже привык.

НО ВОТ ВАМ БОМБА !!!!!

exec 10<$PAIR_CONFIG
while read pair_file <&10

таки работает так как нужно и не как иначе !! :) нашел на просторах инета.

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

>этот набор символов меня напрягает и я пока не понимаю его смысл. а к expr уже привык.

я просто отрезал #и всё что за ним.

НО ВОТ ВАМ БОМБА !!!!!

угу, угу... я знаю. так тоже можно. плодить потоки.

drBatty ★★
()

man ssh

(на премет -n)

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