루프 동안 bash에서 원격 ls를 실행하는 중에 문제가 발생했습니다.

루프 동안 bash에서 원격 ls를 실행하는 중에 문제가 발생했습니다.

단일 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않다면 거기 sshsystemC루프를 가질 수 없습니다. 다음에서 구동되어야 합니다 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사용하려면 다음을 실행하세요 .systemBssh 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있다고 가정하면, 이는 디렉토리에서 파일 이름을 읽을 때 출력을 시작할 수 있음을 의미합니다)-Uls

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;)"

당신은 라인에서 \누락되었습니다 . 따라서 루프의 일부가 아닌 완료 시 생성됩니다.$val2val2ssh 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;)"

관련 정보