仅当字符串中存储多个参数时 ssh 才会失败

仅当字符串中存储多个参数时 ssh 才会失败

我正在 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'当然,没有空间也可以。)

看:

相关内容