Это походит на состояние состязания и рассмотрение Вашего сценария, я думаю, что вижу где.
От моего понимания у Вас есть сценарий, который содержит следующие 2 строки (среди других):
ssh-keygen -f ~/.ssh/known_hosts -R $IP
ssh-keyscan $IP >> ~/.ssh/known_hosts
И Вы затем запускаете тот сценарий многократно.
Эта последовательность событий может объяснить Вашу проблему:
~/.ssh/known_hosts
формовать ssh-keygen -R
команда. В этой точке ssh-keygen
команде считали целый файл в память, таким образом, это может удалить целевую строку.ssh-keyscan
и выписывание строки в файл.ssh-keygen
процесс (тот от шага № 1) начинает выписывать файл, но потому что он считал файл перед законченным шагом № 2, файл, который он выписывает, не содержит строку тот добавленный шаг № 2. Таким образом, строка от шага № 2 вытерта.ssh
, только ключ хоста не находится в known_hosts
из-за проблемы, упомянутой на шаге № 3. Таким образом, ssh подвешивает желание, чтобы пользователь подтвердил ключ. Больше детали:
Программы Backgrounded не могут читать из терминала, пытаясь сделать так результаты в той программе, отправляемой SIGTTIN. Однако в Вашем strace, это показывает программу, получая SIGTTOU. Обычно фоновые программы могут записать в терминал без проблемы, однако OpenSSH явно включает названную установку терминала tostop
который приводит к этому поведению. Идя еще больше, OpenSSH имеет обработчик сигналов на SIGTTOU (среди других), который приводит к коду OpenSSH, входящему в бесконечный цикл, пока Вы не приносите процесс в forground (в которой точке он может отобразить подсказку, и прекращать сообщаться).
Как Вы хотите пойти о решении, это - другой вопрос.
flock
утилита можно использовать), и заблокируйте known_hosts
файл перед теми 2 строками, и затем разблокировал после того, как они будут сделаны. StrictHostKeyChecking=no
. Вы уже побеждаете цель known_hosts
файл с теми 2 строками сценария, таким образом, Вы могли бы также просто отключить его в целом.Извлеките \;
в конце:
grep -rl string1 ./ | xargs sed -i '' s/string1/string2/g