我有一个包含所有文件和 SSH 配置的项目id_rsa
,其中包含如下条目:
Host projectname-server-1
User root
Hostname 26.139.18.47
IdentityFile ./certificates/server-1/id_rsa
这个想法是,用户可以从他们的主要 SSH 配置文件中包含此配置,如下所示:
Include /home/myname/path-to-project/ssh-config
然后只需运行ssh projectname-server-1
即可连接到服务器。
问题是这仅当我在目录中时才有效/home/myname/path-to-project
。
有没有办法指定相对于配置文件位置的路径?
答案1
我不相信存在这样的“当前目录”变量。
这ssh_config(5) - Linux 手册页 列出了可能有帮助的语法:
文件名可以使用波浪号语法来指代用户的主目录或以下转义字符之一:(
%d
本地用户的主目录)、%u
(本地用户名)、%l
(本地主机名)、%h
(远程主机名)或%r
(远程用户名)。
答案2
听起来你想要的是一种将ssh
项目的所有配置和变量存储在项目目录中的方法,以及相对于包括ssh 配置文件,而不是当前路径。
简短的回答是不- 据我所知,ssh_config
包含的行为类似于C
#include
- 您可以将它们视为将引用的文件扩展到当前文件中。
话虽如此,你还是可以通过一些可扩展的方式,以一定程度的惯例来实现这一点——我个人对很多ssh
配置都进行了版本控制,我最好的建议是这样的:
在项目根目录下,将配置ssh
存储在一个目录下
my_project/
├── _config.yml
├── _ssh_config
│ └── server-1
│ ├── id_rsa
│ └── server-1.config
└── src
3 directories, 3 files
server-1.config
这样写:
Host projectname-server-1
User root
Hostname server-1.example.com
# Our identity file is found in folder under ~/.ssh
IdentityFile ~/.ssh/config.d/server-1/id_rsa
~/.ssh/
在新建文件夹下,config.d
mkdir -p ~/.ssh/config.d
要引用项目特定的 ssh 文件,你可以将你的文件符号链接my_project/_ssh_config/server-1
到config.d
ln -s path/to/my_project/_ssh_config/server-1 ~/.ssh/config.d/server-1
更新您的Include
指令~/.ssh/config
:
# Relative "Include" paths are assumed to be relative to ~/.ssh/
Include config.d/server-1/server-1.config
现在,你~/.ssh
看起来是这样的:
.ssh/
├── config
└── config.d
└── server-1 -> /path/to/my_project/_ssh_config/server-1/
├── id_rsa
└── server-1.config
2 directories, 3 files
这种方法的好处是,您可以轻松地将其扩展到server-2
、3、4 等,或其他项目。只需符号链接path/to/server-x
到config.d
,您就可以在用户级使用 glob 来Include
处理它:
Include config.d/**/*.config
我认为将ssh
密钥存储在项目中听起来很不合常规,可能很危险,而且不是特别有用。如果您的目标是配置的可移植性,我建议对私钥的路径进行例外处理。