#!/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
답변1
아, 루프와 쓸모없는 xargs가 있는 삼중 SSH 파이프, 당신은 지금까지 발견한 최악의 접근 방식을 가지고 있습니다.
당신이 \r
보는 것은 파이프를 통과하는 개행 문자의 나머지 부분인 것 같습니다. 이 옵션을 제거해야 합니다 -t
. 이것이 문제의 원인일 수 있습니다. 가상 터미널에 표시되는 출력은 일반 스트림과 다릅니다.
또한 echo ${path1} | xargs
완전히 중복되므로 실행되는 동안 find ${path1}
입력 와이어는 하나만 있습니다 xargs
. 두 번째 것도 마찬가지 입니다 xargs
. 물론 모든 것을 넣을 수 있습니다 find
. 노력하다:
ssh root@"${sourcenode}" "find ${path1} -printf 'chmod %m \"f\"\n'"
그리고 이를 다음 명령에 입력합니다(아니요로컬 bash 루프에 들어가지만 ssh는 대상 노드에 직접 연결됩니다).