是否必须每次添加ssh-add

首先我得说和 ssh 相关的一切机制的确比较复杂,很容易让人晕头转向,如果你想彻底掌握这个知识体系就必须系统的学习一下相关的知识。所以 first thing first,我推荐一本书给你,不妨抽时间把它一劳永逸了:

SSH, The Secure Shell,这本书的第一版有中文的。

接着说你的这个特定的问题。

你首先得了解一件事:ssh-add 这个命令不是用来永久性的记住你所使用的私钥的。实际上,它的作用只是把你指定的私钥添加到 ssh-agent 所管理的一个 session 当中。而 ssh-agent 是一个用于存储私钥的临时性的 session 服务,也就是说当你重启之后,ssh-agent 服务也就重置了。

如果是为了永久记住对应的私钥是哪个,我们不能依赖 ssh-agent 服务。能依赖什么则取决于以下哪些方案适合你的使用场景。

使用某种安全的秘钥管理机制

你没有在问题里描述你所使用的操作系统,所以我以我日常使用的 Mac OS X 为例。Mac 系统内置了一个Keychain 的服务及其管理程序,可以方便的帮你管理各种秘钥,其中包括 ssh 秘钥。ssh-add 默认将制定的秘钥添加在当前运行的 ssh-agent 服务中,但是你可以改变这个默认行为让它添加到 keychain 服务中,让 Mac 来帮你记住、管理并保障这些秘钥的安全性。

你所要做的就是执行下面的命令:

$ ssh-add -K [path/to/your/ssh-key]

之后,其他的程序请求 ssh 秘钥的时候,会通过 Keychain 服务来请求。下面的截图里你可以看到我当前的机器上 Keychain 为我管理的有关 ssh 的秘钥,这其中包括我自己生成的四个,以及 Github Client App 自己使用的一个——前者几个都是供 ssh 相关的命令所使用,而后者则指明了仅供 Github.app 这个应用程序使用。 另外,它们都是 login keychains 也就是只有当前用户登录之后才会生效的,换了用户或是未登录状态是不能使用的,这就是 Keychain 服务所帮你做的事情。

如何使用多个 ssh 秘钥并对应不同的应用程序?

这个问题也是我没有完全吃透的,按照某些资料描述,做了以上的工作之后,应用程序应该能够自动匹配适用的 ssh 秘钥了。但是在我学习的过程中也遇到过非得手动指定的情况(那个时候我还不了解 Keychain 的作用,都是手动去 ssh-add 的),于是另外一种机制可以帮你解决这个问题,即 ssh config

一言蔽之,ssh config 就是一个配置文件,描述不同的秘钥对应的设置——包括主机名、用户名、访问策略等等。

以下我截取了本地配置的两个片段:

这两段配置分别对应 Github 和 Coding 这两个服务所使用的秘钥。第一行的 Host 只是一个名字,第三行的Hostname 才是对应的真实地址,但是两者最好保持一致,这样不用在脑袋里转换。

用这样的配置,当我 git clone https://github.com/user/repo 的时候,id_rsa 秘钥会被使用,当我git clone https://coding.net/user/repo 的时候,很显然 nightire 秘钥会被使用。

当然,此配置不局限于 Git,所有底层使用 SSH 的应用和命令都会遵照配置文件的指示来找到对应的私钥。

回到本节开始的话题,我相信有了 Keychain 做管理应该是不需要这个配置文件的,但是我还没有机会去做测试。目前的环境一切正常,等到我换新机器重新配置环境的时候我会试一试看。

关于 Host 和 Hostname 的对应关系,如果 Hostname 是域名则最好保持一致。但是这里有两个诀窍:
1. 如果同一域名下有两个不同的配置怎么办?
以 Github 为例,如果我有两个账户,一个个人的,一个组织的,并且要使用不同的秘钥,那么我可以这么写:

这里 Host 后面对应的是 Github 的两个用户名,也就是 github.com/nightire 和 github.com/very-geek
2. 如果域名是数字 IP,是否可以简化呢?
Host 可以帮助你把对应的 IP 变成好记的名字。比如说我在公司内部配置了 Git Server(基于 gitolite 或 Gitlab 或任何工具),正常的访问地址是:git://xxx.xxx.xxx.xxx:repo.git,如下的配置则可以帮你把它简化成:git.visionet:repo.git

非常有用。

有没有简单点的办法?

有。如果 ssh-add 已经可以满足你的要求(除了启动以后还要再来一遍以外),那么你完全可以用脚本自动化这件事。简单地把你输入的 ssh-add 命令的内容写进 .bashrc 或 .bash_profile(或其他任何你使用的 shell 环境配置文件)中去,这样只要你打开终端,就等于自动做了这件事情。

不过如我之前所说,这个机制是依赖 ssh-agent 服务的,并且只能在终端下有效。而用 Keychain 机制的话,是整个系统内都有效的(包括不依赖终端的应用程序)并且无需开启 ssh-agent 服务。

最后 Keychain 服务不是只有 Mac 才有的,我刚才搜索了一下,Windows 和 各种 Linux 都有对应的机制,不过我没用过,只能以 Mac 为例了。了解了这些概念,相信你可以自己查得到具体的方法。

时间: 2024-08-24 23:19:23

是否必须每次添加ssh-add的相关文章

git 添加ssh认证到github

由于本地到远程github上用ssh比较方便,不需要每次都输入用户名密码,所以下面记录一下本地仓库与远程github怎么添加ssh加密. 一.创建SSH KEY.先看一下你C盘用户目录下有没有.ssh目录,有的话看下里面有没有id_rsa和id_rsa.pub这两个文件,有就跳到下一步,没有就通过下面命令创建 $ ssh-keygen -t rsa -C "[email protected]"   然后一路回车.这时你就会在用户下的.ssh目录里找到id_rsa和id_rsa.pub这

为github帐号添加SSH keys(Linux和Windows)

文章转自:https://blog.cofface.com/archives/406.html/2 一.Linux增加ssh keys方法: 使用git clone命令从github上同步github上的代码库时,如果使用SSH链接(如我自己的cofface_recovery项目:[email protected]:cofface/cofface_recovery.git),而你的SSH key没有添加到github帐号设置中,系统会报下面的错误:Permission denied (publi

github入门:设置添加ssh key<转>

转自:http://blog.csdn.net/binyao02123202/article/details/20130891 很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地.然而,为什么绝大多数人会使用https url克隆呢? 这是因为,使用https url克隆对初学者来说会比较方便,复制https url 然后到 git Bash 里面直接用clone命令克隆到本地就好了.而使用 SSH url 克隆却需要

GitHub设置添加SSH

1.创建一个新的repository: github:repository name 和本地创建的git名最好一样 本地:创建文件夹,在文件夹执行命令:git init 2.检查是否已经存在文件id_rsa 或 id_rsa.pub,对外只提供pub(公开)文件: 在终端执行命令: cd ~/.ssh ls 3.如果已经存在,创建一个 SSH key: 在终端执行命令: ssh-keygen -t rsa -C "[email protected]" "[email prot

为github帐号添加SSH keys

使用git clone命令从github上同步github上的代码库时,如果使用SSH链接(如我自己的beagleOS项目:[email protected]:DamonDeng/beagleOS.git),而你的SSH key没有添加到github帐号设置中,系统会报下面的错误: Permission denied (publickey). fatal: The remote end hung up unexpectedly 这时需要在本地创建SSH key,然后将生成的SSH key文件内容

github设置添加SSH(转载自:破男孩)

注:本文来源于 破男孩 博客(http://www.cnblogs.com/ayseeing/p/3572582.html)能切实解决问题. 很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地.然而,为什么绝大多数人会使用https url克隆呢? 这是因为,使用https url克隆对初学者来说会比较方便,复制https url 然后到 git Bash 里面直接用clone命令克隆到本地就好了.而使用 SSH ur

在GitHub多个帐号上添加SSH公钥

GitHub后台可以添加多个SSH Keys,但是同一个SSH Keys只能在添加在一个帐号上(添加时提示“Key is already in use”).理由很容易想到,SSH公钥使用时相当于用户名密码,不可能两个不同的帐号使用同一个用户名密码.要想在多个GitHub帐号上添加公钥,就要在本地生成多个SSH Keys,每个GitHub帐号对应一个不同的SSH Keys.步骤如下:1.生成一个新的SSH KEY [email protected]:~$ ssh-keygen -t rsa -C

(诊断)为GitHub添加SSH key时出现“Could not open a connection to your authentication agent”错误的应对方案(转)

在为windows 环境下的github账户添加SSH key时,需要在Git Bash执行如下命令: 第一步:检查已有的SSH keys $ ls -al ~/.ssh 第二步:生成新的SSH key $ ssh-keygen -t rsa -C "[email protected]" # Creates a new ssh key, using the provided email as a label # Generating public/private rsa key pai

github设置添加SSH Keys

每次配置都得上网查,这次又配置SSH Keys,正好记下来,省得以后配置再查了. 一.https 和 SSH 的区别: 1.前者可以随意克隆github上的项目,而不管是谁的:而后者则是你必须是你要克隆的项目的拥有者或管理员,且需要先添加 SSH key ,否则无法克隆. 2.https url 在push的时候是需要验证用户名和密码的:而 SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的. 二.配置过程 1.在

(转)github设置添加SSH

很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地.然而,为什么绝大多数人会使用https url克隆呢? 这是因为,使用https url克隆对初学者来说会比较方便,复制https url 然后到 Git Bash 里面直接用clone命令克隆到本地就好了.而使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH key . 因此,如果你想要使用 SSH url 克隆的话,你必须是这个项目的拥有者.否则你是