문자열에 여러 매개변수가 저장된 경우에만 ssh가 실패합니다.

문자열에 여러 매개변수가 저장된 경우에만 ssh가 실패합니다.

저는 Raspberry Pi OS(Debian 12 Bookworm 기반)에서 bash 스크립트를 작성하고 있습니다. 스크립트는 다음과 같은 작업을 시도합니다.

ssh "$args" "$user"@"$ip" 'command'

내가 아는 한 이것은 표준 관행입니다. 하지만 $args다음과 같은 여러 매개변수가 포함된 경우를 발견했습니다 .

-v -i /path/to/keyfile -o StrictHostKeyChecking=yes

그런 다음 실행

ssh "$args" "$user"@"$ip" 'echo "Success in logging into $HOSTNAME"'

ssh는 종료 상태와 함께 다음을 반환합니다 255.

unknown option --
 usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] 
            [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
            [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
            [-i identity_file] [-J [user@]host[:port]] [-L address]
            [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
            [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
            [-w local_tun[:remote_tun]] destination [command [argument ...]]

$args그러나 성공을 사용하는 대신 콘텐츠만으로 동일한 명령을 실행하면 $args상태가 종료됩니다 0.

ssh -v -i /path/to/keyfile -o StrictHostKeyChecking=yes "$user"@"$ip" 'echo "Success in logging into $HOSTNAME"'

다시 말하면 $args매개변수가 하나만 있을 때 를 사용하는 것이 매우 효과적입니다.

-o StrictHostKeyChecking=yes

여기서 무슨 일이 일어나고 있는 걸까요? 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까? 두 개 이상의 인수( in 가 두 번 발생 ) 가 있을 때만 이에 대해 불평하기 때문에 무언가가 구문 분석하고 뭔가를 제거하는 것 unknown option --같습니다 .$args-$args

답변1

(중복으로 마무리해야 할 것 같지만 어쨌든 구체적인 상황을 설명해 보겠습니다.)

참조 확장은 다음을 "$args"생성합니다.하나매개변수가 있으므로 실제로 실행 중입니다 ssh "-v -i /path/to/keyfile -o StrictHostKeyChecking=yes" .... 공백과 대시는 더 유용한 경우에 스택 옵션이 작동하는 방식과 유사하게 옵션 문자로 처리됩니다. 예를 들어 -abc대시는 유효한 옵션이 아니므로 불만 사항이 발생합니다.

ssh "$args"이것이 작동하는 것 같다 면 args='-o StrictHostKeyChecking=yes'아마도 for 에 대한 파서가 -o공백을 무시하기 때문일 것입니다( in 에 대한 공백을 무시하는 방법과 유사 ssh_config). 같은 방법으로 시도해 보세요 args='-i /path/to/keyfile'. 파일 이름에 선행 공백을 포함했기 때문에 파일을 찾을 수 없다는 오류가 발생할 수 있습니다. ( args='-i/path/to/keyfile'물론 자리가 없습니다.)

바라보다:

관련 정보