SSH를 통한 원격 for-loop


12

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

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

그러나 작동하지 않습니다. 이상하게도, $ I 금액의 리턴 라인이 보입니다. 따라서 10 개의 파일이 있으면 10 개의 빈 줄이 나타납니다.


GNU Parallel의 --sshlogin 옵션 도 살펴보십시오 .
Sebastian

답변:


19

지역 쉘 ${i}은 큰 따옴표 ( ") 내로 해석 하므로 명령은

ssh user@some.serv.er "for i in /tmp/foo* ; do echo; done"

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

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

1

이 문제를 조금만 겪어 보았을 때 주어진 해결책은 로컬 쉘에서 변수를 가져 오는 경우 너무 효과적이지 않지만 ssh 전에 반복 할 배열을 만듭니다. 조금 더 지저분한 것은 처음에 $를 벗어나는 것입니다.

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

호출 된 ssh 쉘이 아닌 로컬 구문 내에서 이스케이프 처리합니다.


0

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

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.