여러 인수가 문자열에 저장된 경우에만 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다음과 같이 단일 인수만 있는 경우에는 using을 사용하는 것이 완벽하게 잘 작동합니다.

-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'아마도 에 대한 파서가 공백을 무시하기 때문일 것입니다 -o(공백이 무시되는 방식과 유사함 ssh_config). 똑같이 시도하면 args='-i /path/to/keyfile'파일 이름에 선행 공백을 포함했기 때문에 파일을 찾을 수 없다는 오류가 발생할 가능성이 높습니다. ( args='-i/path/to/keyfile'물론 공간이 없어도 작동합니다.)

보다:

관련 정보