![如何在 SSH 配置文件中使用变量](https://linux22.com/image/188992/%E5%A6%82%E4%BD%95%E5%9C%A8%20SSH%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F.png)
我想用它$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 发布)中添加了环境变量语法支持CertificateFile
,ControlPath
以及IdentityFile
配置关键字,Debian 10 只有 7.9 版本(向后移植了最新的安全修复程序)。
因此,在撰写本文时,除非您使用的是非常新的 Linux 发行版,否则您的 OpenSSH 版本可能太旧,无法支持使用${HOME}
SSH 配置文件中的语法。
答案2
ssh 配置文件中的一些关键字支持环境变量,但大多数不支持。幸运的是 IndentyFile 就是其中之一。
您需要使用${HOME}
而不是$HOME
在文件中。
您还可以使用tokens
, 例如%d
来引用主目录。这是由 记录的man ssh_config
。
答案3
补充一下,借助-F
ssh 的选项(自定义配置文件),我们还可以做两件事,特别是当这些变量在古老但无处不在的 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 update
Singularity 构建)中不存在。
最后,显而易见的 PSA:将 ssh 密钥和配置存储在远程服务器/集群/计算机中是危险的。切勿将它们留在共享空间中,除非您 100% 坚信没有人在安装卷的任何计算机上拥有 sudo 权限。 OBfuScAt1on 可以提供帮助(例如,没有人会查看名为 的文件夹),但实际上使用(存在于准系统上)crash-dump-Aug23
对 tarball 进行加密。openssl