
저는 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'
물론 공간이 없어도 작동합니다.)
보다: