SSH Shell 命令中的 ‐‐(双破折号)是什么意思?
ssh example@server1.example.com --
这里的双“ -- ”(双破折号)有什么作用?为什么在这个 shell 命令中使用它,为什么不直接使用ssh example@server1.example.com语法?这里的--是什么意思?
本快速教程介绍了 shell 和 ssh 命令中双破折号的用法。但首先,让我们看看它的作用以及何时可能需要它。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 终端 |
类别 | Linux shell 脚本 |
先决条件 | 打击/KSH |
操作系统兼容性 | AIX • Alma • Alpine • Amazon Linux • Arch • BSD • Debian • Fedora • FreeBSD • HP-UX • Linux • macOS • Mint • NetBSD • OpenBSD • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu • Unix • WSL |
预计阅读时间 | 4 分钟 |
“ --”(双破折号)是什么意思?
双破折号“ --”表示“命令行标志结束”。它告诉 ssh 或任何其他有效的 shell 命令不要尝试解析命令行选项后面的内容。当您使用 gcutil ssh vmNameHere python 包装器时,您将看到以下内容。它将显示并执行 ssh 如下:
此语法确保您可以在远程服务器上运行命令而无需 ssh 解析它们:
上述语法告诉 ssh 不要尝试解析命令行选项后的和。这确保 command1 将接受和(或)作为命令行参数。
$ ssh -o UserKnownHostsFile=/dev/null \
-o CheckHostIP=no \
-o StrictHostKeyChecking=no \
-i /Users/vivek/.ssh/google_compute_engine -A -p 22 \
example@server1.example.com --
$ ssh example@server1.example.com -- command1 --arg1 --arg2
--arg1--arg2----arg1--arg2-opt1
shell 命令中的双破折号是什么意思?
换句话说,--shell 命令中的 (双破折号) 表示选项的结束,并使得 Unix 或 Linux 命令无法进一步处理选项。
## safe examples ## ssh example@server1.example.com -- --commandName --arg1 --arg2
这种行为主要由 ssh 命令定义和处理,而不是由 bash/ksh/csh/sh/fish 或任何其他 Unix shell 定义和处理。许多其他 Linux 和 macOS 命令也是如此。
什么时候需要它?
现在您已经对双破折号有了更多的了解,并且特定的 Unix 命令仅支持它。遗憾的是,并非所有 Linux 命令都支持双破折号语法和功能。那么什么时候需要它呢?例如,您无法使用cat 命令--file创建或查看名为或的文件,请运行:-f
## This should fail ## cat --file cat -f
相反,尝试传递双破折号“ --”来指示cat 命令不要尝试解析命令行选项后面的内容:
## This should work ## cat -- --file cat -- -f
让我们尝试删除名为“ ”的文件--file:
rm --file # fail # rm -- '--file' # works
您可以按如下方式将选项传递给 rm 命令:
rm -v -i -- '--file' rm -f -v -i -- '--f'
--Linux、macOS 或类 Unix OS 下“ ”(双破折号)是什么意思?
Shell 脚本示例
我们可以使用如下的 lxc 命令来更新由 LXD 提供支持的 Linux 容器,如下所示:
lxc exec bash-wiki -- apt update lxc exec bash-wiki -- apt -y upgrade lxc exec nginx-proxy \ --env DEBIAN_FRONTEND=noninteractive \ -- sh -c "/usr/bin/apt-get update && /usr/bin/apt-get -y upgrade"
并非所有命令都支持--语法
需要注意的是,并非所有命令都支持--语法,并且它不适用于所有 Unix 或 Linux 命令。例如:
/usr/bin/echo -- -n echo -- --test
来自 bash文档:
除非另有说明,本节中记录的每个内置命令都接受以 accepts 开头的选项,以-表示--选项的结束。:、true、false和test/[内置命令不接受选项,也不会进行--特殊处理。 exit、logout、return 命令、break 命令、continue 命令、let 命令和 shift 命令内置命令接受和处理以 开头的参数,-而不需要--。 其他接受参数但未指定为接受选项的内置命令将以 开头的参数解释为-无效选项,并需要--阻止这种解释。
结论
我们解释了双破折号 ( --) 在 shell 命令或使用 ssh 执行的命令中的作用。第一个不是选项参数的--命令行参数应被视为表示选项结束的分隔符。任何后续参数都应被视为操作数,即使它们以 ' ' 或 ' ' 字符开头。这是一个安全功能,但我们也知道并非所有 Linux/Unix 命令都支持此类选项。您可能还想阅读以下有用的教程:---
通过输入以下 man 命令或 help 命令来查看内部命令,请务必阅读 bash 手册页:
$ man bash
$ man ssh
$ man rm
$ help :
$ help echo
$ help printf
$ help let
$ help exit
$ help logout