단일 BASH 문에서 다음 작업을 수행해야 합니다. 바람직하게는 네 가지 시스템을 A, B, C, D라고 부르겠습니다.
시스템 A는 SSH를 통해 시스템 B 및 시스템 C에 연결할 수 있습니다.
시스템 B는 SSH를 통해 시스템 D에 연결할 수 있습니다.
시스템 A에서 다음 명령을 실행합니다.
ssh systemB "cd folder && (while true; do val1=\$(ssh systemD 'ls directory' | wc -l); val2=$(ssh systemC 'ls directory' | wc -l); echo "\$val1 \$val2"; if (( val1 == 0 && val2 == 0 )); then echo "Done"; break; fi; sleep 5; done;)"
루프가 처음 실행될 때 올바른 파일 개수를 얻는 것 같습니다. 루프가 시작된 후 두 디렉터리의 파일 개수가 변경되면 val1
및 값은 val2
동일하게 유지되는 것으로 나타납니다.
답변1
그렇지 systemB
않다면 거기 ssh
에 systemC
루프를 가질 수 없습니다. 다음에서 구동되어야 합니다 systemA
.
until
val1=$(ssh -J systemB systemD "ls -q directory | wc -l")
val2=$(ssh systemC "ls -q directory | wc -l")
echo "$val1 $val2"
[ "$val1" -eq 0 ] && [ "$val2" -eq 0 ]
do
sleep 5
done
echo Done
반품:
- 게다가 파일 이름 없이 줄 바꿈을 셀 수도 있습니다
-q
.ls
숫자가 0이 아닌지 확인하는 것이라면 여기서는 실제로 문제가 되지 않습니다. wc -l
전체 파일 목록을 전송하지 않으려면 원격으로 카운트( )합니다.- 종료 조건이 무엇인지 더 명확하게 설명하십시오.
- 로
-J systemB
사용systemB
도약주인. 인증은 여전히systemC
자격 증명(Ssh 에이전트 또는 키)을 사용하여 수행됩니다. '를systemA
사용하려면 다음을 실행하세요 .systemB
ssh systemB 'ssh systemD "ls -q directory | wc -l"'
파일 수를 계산하는 대신 첫 번째 일치에서 중지하기 위해 which를 사용할 수 ls | grep -q '^'
있으며 systemD에 파일이 있는 경우 systemC에 대한 sshing을 피할 수도 있습니다.
while
ssh -J systemB systemD "ls -U directory | grep -q \^" ||
ssh systemC "ls -U directory | grep -q \^"
do
sleep 5
done
echo Done
(GNU에 정렬을 건너뛰는 옵션이 ls
있다고 가정하면, 이는 디렉토리에서 파일 이름을 읽을 때 출력을 시작할 수 있음을 의미합니다)-U
ls
SSH 제어 소켓을 사용하면 실행할 때마다 비용이 많이 드는 SSH 연결 및 인증을 피할 수도 있습니다.
답변2
한 줄짜리 코드 대신 아래와 같은 코드를 작성하면 즉시 문제를 확인할 수 있습니다.
ssh systemB "cd folder &&
(while true; do
val1=\$(ssh systemD 'ls directory' | wc -l);
val2=$(ssh systemC 'ls directory' | wc -l);
echo "\$val1 \$val2";
if (( val1 == 0 && val2 == 0 )); then
echo "Done";
break;
fi;
sleep 5;
done;)"
당신은 라인에서 \
누락되었습니다 . 따라서 루프의 일부가 아닌 완료 시 생성됩니다.$
val2
val2
ssh systemB
따라서 이 명령을 시작할 때 $(ssh systemC 'ls directory' | wc -l)
값이 10이면 루프는 다음과 같습니다.
ssh systemB "cd folder &&
(while true; do
val1=\$(ssh systemD 'ls directory' | wc -l);
val2=10;
echo "\$val1 \$val2";
if (( val1 == 0 && val2 == 0 )); then
echo "Done";
break;
fi;
sleep 5;
done;)"