我正在 Raspberry Pi OS(基于 Debian 12 Bookworm)上编写 bash 脚本。该脚本尝试做类似的事情
ssh "$args" "$user"@"$ip" 'command'
据我所知,这是标准做法。但是我发现 when$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
但是,仅使用 的内容而不是 using 执行相同的命令$args
会成功并以状态退出0
:
ssh -v -i /path/to/keyfile -o StrictHostKeyChecking=yes "$user"@"$ip" 'echo "Success in logging into $HOSTNAME"'
重申一下,$args
当只有一个参数时, using 效果非常好,例如
-o StrictHostKeyChecking=yes
这里发生了什么?我可以做什么来防止这种情况发生?从unknown option --
看来,有些东西正在解析$args
并从中剥离一些东西,因为它只在有两个或多个参数时才会抱怨这一点(两次出现-
in $args
)?
答案1
(我可能应该将其作为重复项关闭,但无论如何让我们尝试解释特定情况。)
引用的扩展"$args"
产生一参数,所以实际上你正在运行ssh "-v -i /path/to/keyfile -o StrictHostKeyChecking=yes" ...
。其中的空格和破折号被视为选项字符,类似于堆叠选项在更有用的情况下的工作方式,例如-abc
.破折号不是有效选项,因此您会收到投诉。
如果ssh "$args"
似乎适用于args='-o StrictHostKeyChecking=yes'
,那可能是因为解析器 for-o
忽略空格(类似于ssh_config
忽略空格 in 的方式)。尝试同样的操作args='-i /path/to/keyfile'
,您可能会收到文件未找到错误,因为您刚刚在文件名中包含了一个前导空格。 (args='-i/path/to/keyfile'
当然,没有空间也可以。)
看: