내 스크립트에는 다음이 있습니다
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