我有一把私钥,用密码保护,用于通过SSH访问服务器。
我有两台Linux(Ubuntu 10.04)机器,它们的ssh-add命令行为不同。
在其中一台机器上,一旦我使用“ssh-add .ssh/identity”并输入密码,密钥就会被永久添加,即每次我关闭计算机并再次登录时,密钥已经添加。
在另一台机器上,我必须每次登录时都添加密钥。
据我所记,我在两台机器上都做了同样的事情。唯一的区别是密钥是在被永久添加的那台机器上创建的。
有人知道如何在另一台机器上永久添加密钥吗?
我有一把私钥,用密码保护,用于通过SSH访问服务器。
我有两台Linux(Ubuntu 10.04)机器,它们的ssh-add命令行为不同。
在其中一台机器上,一旦我使用“ssh-add .ssh/identity”并输入密码,密钥就会被永久添加,即每次我关闭计算机并再次登录时,密钥已经添加。
在另一台机器上,我必须每次登录时都添加密钥。
据我所记,我在两台机器上都做了同样的事情。唯一的区别是密钥是在被永久添加的那台机器上创建的。
有人知道如何在另一台机器上永久添加密钥吗?
一个解决方案是通过将关键文件添加到您的~/.ssh/config
文件中,强制使它们永久保存。
IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer
如果您在~/.ssh目录中没有'config'文件,则应创建一个。它不需要root权限,所以只需执行以下操作:
nano ~/.ssh/config
根据您的需求输入上述行,为此工作,文件需要具有chmod 600权限。 您可以使用命令 chmod 600 ~/.ssh/config
进行操作。
如果您希望计算机上的所有用户都使用该密钥,则将这些行放入/etc/ssh/ssh_config
文件中,将密钥放在所有人都可以访问的文件夹中。
此外,如果您想将密钥设置为特定主机,则可以在您的〜/ .ssh / config
中执行以下操作:
Host github.com
User git
IdentityFile ~/.ssh/githubKey
当你有多个身份时,这种方法的优点在于服务器不会因为你先尝试错误的身份而拒绝你。只有特定的身份会被尝试。
chmod 600 config
- generalopinionssh-add ~/.ssh/gitHubKey
代替,这将记住您的密钥密码。我提出的解决方案是在重新启动后永久设置它。 - daminetreg在 macOS 10.10 上,我通过在 ssh-add
命令中使用 -K
标志解决了那个问题:
ssh-add -K ~/.ssh/your_private_key
对于 macOS 10.12 及更高版本,您还需要按照此处描述的方法编辑您的 ssh 配置文件:https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
在较新版本的 macOS 中,您需要使用 --apple-use-keychain
标志代替 -K
,因为 -K
已被弃用:
ssh-add --apple-use-keychain ~/.ssh/your_private_key
man ssh-add
,ssh-add -K
将把密语保存到钥匙串中,在重启后,只需使用 ssh-add -A
,无需输入您的密语。 - DawnSong这并没有解决在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/)
ForwardAgent yes
添加到我的.ssh/config
中)非常好地解决了这个问题。事实证明,它只需要ssh-add &>/dev/null
,因为ssh-add
的默认行为似乎是添加它在您的.ssh
文件夹中找到的密钥。 - Aaron@TNick -K
命令可以将密钥添加到 macOS 的钥匙串中,这些密钥可用于身份验证外部服务器。该问题的发布者通过 SSH 隧道连接到远程服务器。但实际上仍然只是连接到远程服务器。 A-[SSH 隧道]->B 我所处的情况是我在远程服务器上,但希望身份验证使用我本地系统中的凭据。 A <-[身份验证]-**B**-[连接]->C 因此,-K
命令并没有实际帮助我的情况,但对于另一个问题来说是个好解决方案。 - Aaron只需添加钥匙链,就像在Ubuntu快速提示中引用的那样:https://help.ubuntu.com/community/QuickTips
什么是Keychain
使用keychain管理ssh密钥,而不是经常启动ssh-agent和ssh-add。要安装keychain,可以点击此处,也可以使用Synaptic进行操作或从命令行使用apt-get命令。
命令行
另一种安装该文件的方法是打开终端(应用程序->附件->终端)并输入:
sudo apt-get install keychain
编辑文件
жЋҐдё‹жќҐпјЊж‚Ёеє”иЇҐе°†д»Ґдё‹иЎЊж·»еЉ е€°${HOME}/.bashrcж€–/etc/bash.bashrcдёпјљ
keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
.
是 source
的别名。 - Brad Solomonssh-add
。我发现那些被永久添加的密钥在~/.ssh
中既有私钥又有公钥,而那些在每个会话中被忘记的密钥只有私钥在~/.ssh
目录中。因此解决方法很简单:在执行ssh-add
之前,你应该将私钥和公钥一起复制到~/.ssh
中。我尝试了@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
的输出存储在一个变量中以提高性能(至少我认为它可以提高性能 :))。注意:我使用的是Linux,此代码已放置在我的~/.bashrc
文件中 - 如果您使用的是Mac OS X,则应将其添加到.zshrc
或.profile
。编辑:正如评论中@Aaron指出的那样,.zshrc
文件用于zsh
shell - 因此,如果您没有使用它(如果您不确定,则大多数情况下,您正在使用bash
),则此代码应放置在.bashrc
文件中。.zshrc
是用于 zsh
shell,我使用它代替 bash
。如果你在 Mac OS X 上使用的是默认的 bash
,那么对应的文件名也是 .bashrc
。 - Aaronssh-add -l
不会输出密钥文件名。因此,在执行完ssh-add -l
命令后,可以使用返回码echo $?
来决定是否添加密钥。 - Bharat G如上所述评论中由generalopinion提到,配置文件的权限应为600。
chmod 600 config
我使用两个id_rsa密钥来运行Ubuntu系统,一个用于个人,另一个用于工作。
ssh-add指令会记住一个密钥(个人密钥),但每次都会忘记公司的那个密钥。
通过比较这两个密钥的差异,我发现我的个人密钥权限为400,而公司的密钥权限为600。其中公司密钥有u+w权限。
将公司密钥的用户写入权限去掉(设置为u-w或设置为400)即可解决我的问题。现在ssh-add能够记住这两个密钥了。
对于使用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来实现。
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)"