파일 루프에서 SSH를 사용할 때 이상한 출력

파일 루프에서 SSH를 사용할 때 이상한 출력

이 스크립트는 여러 줄이 포함된 파일을 읽는 데 사용되며, 각 줄은 탭으로 구분된 배열을 포함합니다. 이러한 배열 요소를 매개변수로 사용하는 sudo 권한으로 일부 원격 명령을 실행하고 싶습니다. 다음은 예제 스크립트입니다:

while IFS=$'\t' read -r -a line
do
  echo ${line[0]}
  ssh -tty -o StrictHostKeyChecking=no ${line[0]} 'sudo echo ${line[1]}; sudo echo ${line[2]}' 
done < nodes.txt

다음은 샘플 입력 파일입니다.

rivervm-1       dc2     rack1
rivervm-2       dc2     rack2
rivervm-3       dc2     rack3
rivervm-4       dc2     rack4

출력은 각각 새 줄에 12개의 변수여야 합니다. 그러나 이것이 내가 얻는 것입니다:

rivervm-1
rivervm-2   dc2 rack2
rivervm-3   dc2 rack3
rivervm-4   dc2 rack4

Connection to rivervm-1 closed.

어떤 아이디어가 있나요?

답변1

첫째, ssh명령은 입력(에서 nodes.txt)을 먹고 추가합니다 < /dev/null. a를 추가하면 &동일한 효과가 나타납니다. 왜냐하면 이를 ssh백그라운드에 배치하면 표준 입력에서 분리되기 때문입니다.

둘째, Kusalananda가 알 수 있듯이 변수 ${line[1]}${line[2]}는 작은따옴표 안에 있기 때문에 대체되지 않습니다.

답변2

@Kusalananda의 의견과 관련하여 쉘은 작은 따옴표로 변수를 확장하지 않습니다. 이것은 echo내부가 ssh작동하지 않는 이유를 설명합니다. 작은따옴표를 큰따옴표로 바꾸면 출력은 다음과 같습니다.

rivervm-1
rivervm-2   dc2 rack2
rivervm-3   dc2 rack3
rivervm-4   dc2 rack4
dc2
rack1
Connection to rivervm-1 closed.

그러나 Rivervm-1에서만 명령을 실행하고 나머지는 실행하지 않습니다.

해결책을 찾았습니다. ssh 명령 끝에 "&"를 추가하세요. 이것이 왜 작동하는지 설명해줄 수 있는 사람이 있나요? 감사해요!

관련 정보