xargs управляют результатами в sed:;: Никакой такой файл или каталог

Это походит на состояние состязания и рассмотрение Вашего сценария, я думаю, что вижу где.

От моего понимания у Вас есть сценарий, который содержит следующие 2 строки (среди других):

ssh-keygen -f ~/.ssh/known_hosts -R $IP
ssh-keyscan $IP >> ~/.ssh/known_hosts

И Вы затем запускаете тот сценарий многократно.

Эта последовательность событий может объяснить Вашу проблему:

  1. Один из сценариев открывается ~/.ssh/known_hosts формовать ssh-keygen -R команда. В этой точке ssh-keygen команде считали целый файл в память, таким образом, это может удалить целевую строку.
  2. Другой сценарий только что закончил работать ssh-keyscan и выписывание строки в файл.
  3. Первый сценарий ssh-keygen процесс (тот от шага № 1) начинает выписывать файл, но потому что он считал файл перед законченным шагом № 2, файл, который он выписывает, не содержит строку тот добавленный шаг № 2. Таким образом, строка от шага № 2 вытерта.
  4. Второй сценарий идет для выполнения ssh, только ключ хоста не находится в known_hosts из-за проблемы, упомянутой на шаге № 3. Таким образом, ssh подвешивает желание, чтобы пользователь подтвердил ключ.

Больше детали:
Программы Backgrounded не могут читать из терминала, пытаясь сделать так результаты в той программе, отправляемой SIGTTIN. Однако в Вашем strace, это показывает программу, получая SIGTTOU. Обычно фоновые программы могут записать в терминал без проблемы, однако OpenSSH явно включает названную установку терминала tostop который приводит к этому поведению. Идя еще больше, OpenSSH имеет обработчик сигналов на SIGTTOU (среди других), который приводит к коду OpenSSH, входящему в бесконечный цикл, пока Вы не приносите процесс в forground (в которой точке он может отобразить подсказку, и прекращать сообщаться).

Как Вы хотите пойти о решении, это - другой вопрос.

  • Одно решение состояло бы в том, чтобы добавить блокировку (существует a flock утилита можно использовать), и заблокируйте known_hosts файл перед теми 2 строками, и затем разблокировал после того, как они будут сделаны.
  • Другое решение состояло бы в том, чтобы добавить ssh опцию StrictHostKeyChecking=no. Вы уже побеждаете цель known_hosts файл с теми 2 строками сценария, таким образом, Вы могли бы также просто отключить его в целом.
3
16.08.2014, 00:04
1 ответ

Извлеките \; в конце:

grep -rl string1 ./ | xargs sed -i ''  s/string1/string2/g
1
27.01.2020, 21:31

Теги

Похожие вопросы