Intereting Posts
Быстрое изменение значений переменных среды в .bash_profile Получите «дату», чтобы понять временную фразу другого языка Как может временный код mac «b» быть «n / a»? Linux: позволяет пользователю прослушивать порт ниже 1024 разрешение отклонено при выполнении двоичного файла, несмотря на привилегию «rwx» и пользователь root Как удалить пробелы из переменных оболочки? Как выполнить повторную команду k'th в конвейере? в linux 2.6.34 ядро ​​или более старую версию, которые отправляют scsi cmd, чтобы открыть дверь при нажатии кнопки извлечения cdrom? Пространства для переменных в сценарии bash Systemd – как служба может определить первый запуск с момента запуска? Почему мы не можем выполнять список команд как пользователь без sudo? Как создать действие «Выключить экран»? Не удается SSH клонировать сервер EC2 из общедоступной сети интерактивное развертывание PHP PHP В чем разница между путём и каталогом?

Как избавиться от "\ r" a конец строки, исходящей из конвейера в bash

#!/bin/bash sourcenode=$1 destnode=$2 path1=/root/test ssh root@"${sourcenode}" -t "echo "${path1}" | xargs -IDIR find DIR " | while read line do ssh root@"${sourcenode}" -t "stat -c "%a" $line | xargs -IDIR ssh root@"${destnode}" chmod DIR $line" done 

Предполагается, что этот сценарий будет копировать только разрешения между двумя удаленными машинами: источником и пунктом назначения. На исходной и целевой машинах есть папка ( /root/test/ ) с несколькими файлами. По какой-то причине в первой строке это добавляет \r в конце. Я попробовал несколько вещей, чтобы избавиться от него, но безрезультатно.

Я получаю эту ошибку.

 Pseudo-terminal will not be allocated because stdin is not a terminal. stat: cannot stat `/root/test\r': No such file or directory 

О, дорогой, тройной трубопровод ssh с петлей и бесполезными xargs, вы нашли худший способ сделать это.

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

Более того, echo ${path1} | xargs echo ${path1} | xargs совершенно лишний, просто запустите find ${path1} , в xargs случае у вас есть только одна строка ввода для xargs . То же самое касается вторых xargs . Конечно, вы можете все find . Пытаться:

 ssh root@"${sourcenode}" "find ${path1} -printf 'chmod %m \"f\"\n'" 

И передайте это в следующую команду ( НЕ в локальную петлю bash, а подайте ее непосредственно в ssh для destnode).