ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Ubuntu 上使用 ssh-add 永久添加私钥? [关闭]

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为 Stack Overflow 的主题。 3年前关闭。改进这个问题

我有一个受密码保护的私钥,可以通过 SSH 访问服务器。

我有 2 台 linux (ubuntu 10.04) 机器,并且 ssh-add 命令的行为在它们中都不同。

在一台机器上,一旦我使用“ssh-add .ssh/identity”并输入我的密码,密钥就会被永久添加,即每次我关闭计算机并再次登录时,密钥已经被添加。

在另一个中,我每次登录时都必须添加密钥。

据我记得,我对两者都做了同样的事情。唯一的区别是密钥是在永久添加的密钥上创建的。

有谁知道如何将它永久添加到另一台机器上?

代理应该只是临时的;但是您可能在两台机器之一的 ~/.bashrc 中的某处有 ssh-add 命令

d
daminetreg

一种解决方案是通过将密钥文件添加到您的 ~/.ssh/config 文件中来强制永久保留密钥文件:

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

如果您在 ~/.ssh 目录中没有“配置”文件,那么您应该创建一个。它不需要root权限,所以很简单:

nano ~/.ssh/config

...并根据您的要求输入上面的行。

为此,该文件需要具有 chmod 600。您可以使用命令 chmod 600 ~/.ssh/config

如果您希望计算机上的所有用户都使用密钥,请将这些行放入 /etc/ssh/ssh_config 并将密钥放入所有人都可以访问的文件夹中。

此外,如果您想设置特定于一台主机的密钥,您可以在 ~/.ssh/config 中执行以下操作:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

当您有许多身份而服务器不会因为您首先尝试错误的身份而拒绝您时,这具有优势。只会尝试特定的身份。


配置文件的权限应为 600。chmod 600 config
我必须为每次推送、获取或克隆输入密码,我该如何避免这种情况?
请改用 ssh-add ~/.ssh/gitHubKey,它会记住您的密钥密码。我提出的解决方案是在重新启动后永久设置它。
这个答案太好了, ssh-add 不应该存在。当您可以永久编辑配置文件时,谁想要一个“临时”修复问题并意外中断的命令。
此解决方案不使用 ssh-agent。 - 有区别吗?是的,你不能通过代理转发来转发他们的身份。
t
totas

我通过使用 ssh-add 的 -K 选项在 Mac OSX (10.10) 上解决了这个问题:

ssh-add -K ~/.ssh/your_private_key

对于 macOS 10.12 及更高版本,您需要额外编辑 ssh 配置,如下所述:https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain


对于想要永久设置它的人来说,这是一个更好的答案
因此这一点:“在Mac OSX(10.10)上”......
这对我不起作用(在 OSX 10.12.4 上)
根据 macOS High Sierra 上的 man ssh-addssh-add -K 会将密码保存到钥匙串中,重新启动后,只需使用 ssh-add -A,它不需要您输入密码。
OP 专门寻求有关 ubuntu 的帮助,该帖子已被此帖子所掩盖。stackoverflow.com/a/37256434/5109177 要求将其移至特定于 mac 的线程会很迂腐吗? [这些需要额外费用吗? :*)]
A
Aaron

在 Mac OS X Lion 下,这并没有为我解决同样的问题。我最终添加了:

ssh-add ~/.ssh/id_rsa &>/dev/null

对于我的 .zshrc (但 .profile 也可以),这似乎已经修复了它。

(如此处建议:http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/


我认为这比我提出的解决方案更好,因为 ssh-add 使用可以记住受保护私钥的密码的身份验证代理,因此您无需在每次尝试进行身份验证时都键入它。您提出的解决方案的另一个优点是,如果您有很多密钥,ssh 客户端不会提出与您尝试连接的服务器无关的密钥,实际上它只会提供用于该服务器的密钥,并且不会t 导致服务器拒绝连接,因为达到 MaxAuthTries,同时尝试 ssh/config 中列出的所有密钥。
谢谢@daminetreg。我的特殊问题是需要在开发机器上访问 gitosis 而不将我的私钥转移给它。此解决方案(以及将 ForwardAgent yes 添加到我的 .ssh/config)出色地解决了该问题。事实证明,它可能只是 ssh-add &>/dev/null,因为 ssh-add 的默认行为似乎是添加它在 .ssh 文件夹中找到的键。
我的理解是 Mac OS 中有一个 -K 开关:stackoverflow.com/questions/1909651/…
@TNick -K 将密钥添加到 OS X 的钥匙串,OS X GUI 使用该钥匙串对外部服务器进行身份验证。 Q 中的海报正在通过 SSH 隧道连接,但仍只是连接到远程服务器。 A-[SSH Tunnel]->B 我的情况是我在远程服务器上,但希望身份验证针对我的家庭系统上的凭据。 A <-[Auth]-B-[Connect]->C 所以 -K 实际上并没有帮助,但对于另一个 Q 来说是一个很好的解决方案。
linux或ubuntu的等效命令是什么?我得到 unknown option -- K(我承认我不知道为什么我什至需要这样做......)
C
Christian Saiki

只需添加钥匙串,如 Ubuntu 快速提示 https://help.ubuntu.com/community/QuickTips 中所述

什么

可以使用钥匙串来管理您的 ssh 密钥,而不是不断地启动 ssh-agent 和 ssh-add。要安装钥匙串,您只需单击此处,或使用 Synaptic 来完成这项工作或从命令行 apt-get。

命令行

另一种安装文件的方法是打开终端(Application->Accessories->Terminal)并输入:

sudo apt-get install keychain

编辑文件

然后,您应该将以下行添加到您的 ${HOME}/.bashrc 或 /etc/bash.bashrc:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh

出于好奇,第二个命令究竟做了什么?这只是打开当前用户的权限?
.source 的别名
步骤够吗?为什么文件 ~/.keychain/uname -n-sh 存在?
id_dsa 是什么?我搜索了这个页面,只在这个答案和 another 中看到了这一点,但在 original question 中没有看到。这只是像 id_rsa 这样的另一个键,因为正在设置 2 个键吗?
我很好奇钥匙串是否保存了 ssh 密钥密码以及它是如何做到的。这些密码短语保存在哪里?
N
Nikola Ivanov Nikolov

我尝试了@Aaron 的解决方案,但它并不适合我,因为每次我在终端中打开一个新标签时,它都会重新添加我的密钥。所以我对其进行了一些修改(请注意,我的大多数密钥也受密码保护,因此我不能只将输出发送到 /dev/null):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

它的作用是检查 ssh-add -l(列出所有已添加的键)的输出以查找特定键,如果未找到,则使用 ssh-add 添加它。

现在,当我第一次打开我的终端时,我被要求输入我的私钥的密码,并且在我重新启动(或注销 - 我没有检查)我的计算机之前不会再次询问我。

因为我有一堆键,所以我将 ssh-add -l 的输出存储在一个变量中以提高性能(至少我猜它会提高性能:))

PS:我在 linux 上,这段代码进入了我的 ~/.bashrc 文件 - 如果你在 Mac OS X 上,那么我假设你应该将它添加到 .zshrc.profile

编辑:正如@Aaron 在评论中指出的那样,.zshrc 文件是从 zsh 外壳中使用的 - 所以如果你不使用它(如果你不确定,那么很可能你正在使用bash),此代码应转到您的 .bashrc 文件。


.zshrc 用于 zsh shell,我使用它来代替 bash。如果您在 Mac OS X(默认)上使用 bash,那么它也应该是 .bashrc
ssh-add -l之后的返回码echo $?可以用来决定是否添加key。我使用 bash 的 linux 机器,ssh-add -l 不会输出密钥文件名。返回代码始终有效。
N
NShiny

我在 Ubuntu 16.04 上遇到了同样的问题:一些密钥是永久添加的,而另一些密钥我必须在每个会话中执行 ssh-add。我发现永久添加的密钥在 ~/.ssh 中具有私钥和公钥,而在每个会话中忘记的密钥在 ~/.ssh 目录中只有私钥。所以解决方案很简单:您应该在执行 ssh-add 之前将 both 私钥和公钥复制到 ~/.ssh

PS: 据我从 Gnome wiki 了解到,我的方法之所以有效,要归功于 gnome-keyring 工具,它是 Gnome 桌面环境的一部分。因此,我的方法可能仅在您使用 Gnome 或基于 Gnome 的 DE 时才有效。


被低估的答案。搜索两个小时后,这解决了我的问题,无需额外的脚本或包。
弗拉金太棒了!伟大的侦探工作。我不认为我会想到这一点。
对我来说,这也是解决方案!您不需要任何其他软件或安装或配置。把两把钥匙都放进去。
虽然这可能可行,但我建议将公钥和私钥放在同一个地方是一个非常糟糕的主意 - 这就像把钥匙留在车里
这对我有用。 @OliverDungey 我同意和不同意。归根结底,除非您将私钥存储在计算机之外(例如闪存驱动器),因为它在您的目录中,另一个 sudo 用户 / root 可以使用 find 命令访问该文件,无论它在哪里。如果您是系统上唯一的人并且拥有强密码,我不认为这是一种风险。
e
erezmta

就我而言,解决方案是:

配置文件的权限应该是 600。 chmod 600 config

正如generalopinion在上面的评论中提到的

无需触摸配置文件内容。


在 Linux Mint 17.1 上对我来说还不够。
我觉得600没有意义。 man ssh 告诉我们 ~/.ssh/config 文件为用户读/写,其他人不可写。
600 仅供用户读写
F
Fholst

我使用两个 id_rsa 密钥运行 Ubuntu。 (一个个人的工作)。 ssh-add 每次都会记住一把钥匙(个人一把)而忘记公司一把。

检查两者之间的差异,我看到我的个人密钥有 400 个权限,而公司的密钥有 600 个权限。 (有 u+w)。从公司密钥中删除用户写入权限(uw 或设置为 400)解决了我的问题。 ssh-add 现在记住这两个键。


R
Robert Siemer

在 Ubuntu 14.04(可能更早,可能仍然)上,您甚至不需要控制台:

启动 seahorse 或启动你找到的搜索“key”的东西

在那里创建一个 SSH 密钥(或导入一个) 无需将密码留空 它提供给您甚至可以将公钥推送到服务器(或更多)

无需将密码留空

甚至可以将公钥推送到服务器(或更多)

您最终将运行 ssh-agent 并加载此密钥,但已锁定

使用 ssh 将通过代理获取身份(即密钥)

在会话期间首次使用时,将检查密码,您可以选择在登录时自动解锁密钥,这意味着登录身份验证将用于包装密钥的密码

您可以选择在登录时自动解锁密钥

这意味着登录身份验证将用于包装密钥的密码

注意:如果您想转发您的身份(即代理转发),请使用 -A 调用您的 ssh 或将其设为默认值,否则您无法在稍后登录到第三台机器的机器上使用该密钥进行身份验证

否则,您无法在稍后登录到第三台机器的机器上使用该密钥进行身份验证


Ubuntu 22.04 仍在使用 seahorse
r
reynoldpj

在“~/.bashrc”中添加以下行为我解决了这个问题。我正在使用 Ubuntu 14.04 桌面。

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"

J
Jaseem Abbas

这对我有用。

ssh-agent /bin/sh
ssh-add /path/to/your/key

L
LawrenceLi

很简单^_^两步

1.yum安装钥匙串

2.将以下代码添加到.bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh

Ubuntu 没有 yum 傻 ;)
f
frederickjh

对于那些使用 Fish shell 的用户,您可以使用以下函数,然后在 ~/.config/fish/config.fish 或在 ~/.config/fish/conf.d/loadsshkeys.fish 的单独配置文件中调用它。它会将所有以 id_rsa 开头的键加载到 ssh-agent 中。

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

如果您希望在打开终端时自动启动 ssh-agent,您可以使用 danhper/fish-ssh-agent 来执行此操作。


谢谢,回购链接现在似乎正在重定向到 github.com/danhper/fish-ssh-agent
谢谢@ElijahLynn!我编辑了我的答案并更新了存储库链接。