이 스크립트는 여러 줄이 포함된 파일을 읽는 데 사용되며, 각 줄은 탭으로 구분된 배열을 포함합니다. 이러한 배열 요소를 매개변수로 사용하는 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 명령 끝에 "&"를 추가하세요. 이것이 왜 작동하는지 설명해줄 수 있는 사람이 있나요? 감사해요!