저는 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'
물론 자리가 없습니다.)
바라보다: