명령 실패(sshpass)로 인해 Bash 스크립트가 종료됩니다.

명령 실패(sshpass)로 인해 Bash 스크립트가 종료됩니다.

SSH를 통해 서버 목록에 대한 작업을 수행해야 합니다.

sshpass를 사용하고 있는데 작업이 실패할 수 있지만 몇 번 발생해야 하며 스크립트는 계속 계속되어야 합니다.

#!/bin/bash

while read address; do
    echo -n "$address "
    sshpass -p password ssh -o StrictHostKeyChecking=no user@$address 'ls /path/to/some/dir'
done < address-list

그러나 ssh를 통한 첫 번째 호스트에서는 명령이 실패하고 스크립트가 즉시 종료됩니다.

어쨌든 루프가 계속 실행되도록 하려면 어떻게 해야 합니까? 명령 뒤에 종료를 추가해도 문제가 해결되지 않으며 오류 종료 설정을 해제해도 set +e작동하지 않습니다.

답변1

ssh루프는 표준 입력 스트림을 상속하고 가능한 한 많이 읽습니다. 즉, 파일의 나머지 줄을 읽습니다 address-list. ssh파일에서 나머지 줄을 읽고 있으므로 루프는 한 번의 반복만 실행합니다 . 기술적으로 스크립트는 조기에 종료되지 않습니다.실패하다어쨌든, 원하는 대로 되지 않습니다.

이를 방지하려면 다음을 사용하여 표준 입력에서 읽는 것을 ssh -n방지하세요 .ssh

while read address; do
    echo -n "$address "
    sshpass -p password ssh -n -o StrictHostKeyChecking=no "user@$address" 'ls /path/to/some/dir'
done < address-list

ssh이 방법으로 실행하면 원격 호스트에서 시작된 일부 프로그램에 데이터를 전달할 수 있지만 발견한 대로 루프가 제대로 작동하지 못하게 됩니다.

관련 정보