SSH를 통한 원격 for 루프

SSH를 통한 원격 for 루프

내 스크립트에는 다음이 있습니다

for server in ${servers[@]}; do
    echo ${server}
    ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done

그러나 이것은 작동하지 않습니다. 이상하게도 $I 금액에 대한 반품 라인이 표시됩니다. 따라서 10개의 파일이 있으면 10개의 빈 줄이 표시됩니다.

답변1

로컬 셸은 ${i}큰따옴표( ) "안의 내용을 해석하므로 이 명령의 결과는 다음과 같습니다.

ssh [email protected] "for i in /tmp/foo* ; do echo; done"

작은따옴표( ')만 사용하면 문제가 사라집니다.

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'

답변2

방금 이 문제를 발견했습니다. 제공된 솔루션은 작동하지만 ssh 이전에 반복할 배열을 생성하는 로컬 셸에서 변수를 추출하는 경우에는 그다지 효율적이지 않습니다. 조금 혼란스러운 점은 처음에는 $를 이스케이프한다는 것입니다.

"for i in /tmp/foo* ; do echo \${i}; done"

이는 호출하는 ssh 쉘이 아닌 로컬 구성에서 이스케이프됩니다.

답변3

또한 목록에서 포트를 가져오기 위해 위의 답변을 업데이트했습니다.

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done

관련 정보