如何在 SSH 配置文件中使用变量

如何在 SSH 配置文件中使用变量

我想用它$HOME来替换/Users/Me我的 ssh 配置文件

Host MyHost
    HostName 192.168.1.1
    IdentitiesOnly yes
    User me
    IdentityFile "/Users/Me/.ssh/id_rsa"

但我得到了no such identity: $HOME/.ssh/id_rsa: No such file or directory

答案1

至少在我的 Debian 10 系统上,ssh_config(5)手册页显示:

论点身份文件可以使用波形符语法来引用用户的主目录或 TOKENS 部分中描述的令牌。

因此,$HOME您可以IdentityFile将该行写为:

IdentityFile "~/.ssh/id_rsa"

或作为:

IdentityFile "%d/.ssh/id_rsa"

环境变量语法 ( ${HOME}) 支持仅在配置项中提及IdentityAgent,而不是在IdentityFile.根据OpenSSH 发行说明OpenSSH 8.4 版本(2020-09-27 发布)中添加了环境变量语法支持CertificateFileControlPath以及IdentityFile配置关键字,Debian 10 只有 7.9 版本(向后移植了最新的安全修复程序)。

因此,在撰写本文时,除非您使用的是非常新的 Linux 发行版,否则您的 OpenSSH 版本可能太旧,无法支持使用${HOME}SSH 配置文件中的语法。

答案2

ssh 配置文件中的一些关键字支持环境变量,但大多数不支持。幸运的是 IndentyFile 就是其中之一。

您需要使用${HOME}而不是$HOME在文件中。

您还可以使用tokens, 例如%d来引用主目录。这是由 记录的man ssh_config

答案3

补充一下,借助-Fssh 的选项(自定义配置文件),我们还可以做两件事,特别是当这些变量在古老但无处不在的 CentOS 7 中不起作用时。当一个节点没有主目录时,这一点很重要(但 $HOME 指向一个不存在的地方)。例如,在 HTCondor 集群中,$_CONDOR_SCRATCH_DIR 是您的家,而不是 $HOME。 ETC。

文件路径可以是相对的,因此可以cd进入您想要的目录并使用相对路径。

ssh -F relative_ssh.config servername

第二个是扩展使用envsubst

FOO=1 BAR=2 envsubst < in_file > out_file

然而,与许多 Singularity 容器一样,这个命令ssh在精简系统(yum/apt-get install utils-linux或者yum/apt-get updateSingularity 构建)中不存在。

最后,显而易见的 PSA:将 ssh 密钥和配置存储在远程服务器/集群/计算机中是危险的。切勿将它们留在共享空间中,除非您 100% 坚信没有人在安装卷的任何计算机上拥有 sudo 权限。 OBfuScAt1on 可以提供帮助(例如,没有人会查看名为 的文件夹),但实际上使用(存在于准系统上)crash-dump-Aug23对 tarball 进行加密。openssl

相关内容