注意:我不是新手,我已经这样做了无数次,但由于某种原因,今天它决定不工作。
尝试通过 SSH 连接到 github 或尝试克隆存储库时,我不断收到 Permission denied (publickey).
错误消息,即使在重新制作 ssh 密钥并将其添加到我帐户中的“SSH 密钥”之后也是如此。
这是我今天尝试做十次但没有成功的事情:
使用 ssh-keygen 创建密钥。使用 Gedit 或 Notepad++ 打开 ~/.ssh/id_rsa.pub 并复制内容。转到 github.com 上的帐户设置 转到 SSH 密钥 单击添加密钥按钮。给钥匙一个标题 把钥匙粘贴到钥匙箱里。保存密钥(输入我的 github 密码进行验证)。
而现在,当我尝试执行 ssh github.com
时,它就行不通了......到底是什么?我现在是太累了还是我错过了什么?
这是 ssh -vvv github.com
的输出
OpenSSH_5.9p1, OpenSSL 1.0.0f 4 Jan 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Connecting to github.com [207.97.227.239] port 22.
debug1: Connection established.
debug3: Incorrect RSA1 identifier
debug3: Could not load "/home/trusktr/.ssh/id_rsa" as a RSA1 public key
debug1: identity file /home/trusktr/.ssh/id_rsa type 1
debug1: identity file /home/trusktr/.ssh/id_rsa-cert type -1
debug1: identity file /home/trusktr/.ssh/id_dsa type -1
debug1: identity file /home/trusktr/.ssh/id_dsa-cert type -1
debug1: identity file /home/trusktr/.ssh/id_ecdsa type -1
debug1: identity file /home/trusktr/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.1p1 Debian-5github2
debug1: match: OpenSSH_5.1p1 Debian-5github2 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug2: fd 3 setting O_NONBLOCK
debug3: load_hostkeys: loading entries for host "github.com" from file "/home/trusktr/.ssh/known_hosts"
debug3: load_hostkeys: found key type RSA in file /home/trusktr/.ssh/known_hosts:16
debug3: load_hostkeys: loaded 1 keys
debug3: order_hostkeyalgs: prefer hostkeyalgs: ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-rsa
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug2: kex_parse_kexinit: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-rsa,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-dss-cert-v01@openssh.com,ssh-dss-cert-v00@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-dss
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-256-96,hmac-sha2-512,hmac-sha2-512-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-256-96,hmac-sha2-512,hmac-sha2-512-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa,ssh-dss
debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr
debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: none,zlib@openssh.com
debug2: kex_parse_kexinit: none,zlib@openssh.com
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: mac_setup: found hmac-md5
debug1: kex: server->client aes128-ctr hmac-md5 none
debug2: mac_setup: found hmac-md5
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug2: dh_gen_key: priv key bits set: 122/256
debug2: bits set: 510/1024
d ebug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
debug3: load_hostkeys: loading entries for host "github.com" from file "/home/trusktr/.ssh/known_hosts"
debug3: load_hostkeys: found key type RSA in file /home/trusktr/.ssh/known_hosts:16
debug3: load_hostkeys: loaded 1 keys
debug3: load_hostkeys: loading entries for host "207.97.227.239" from file "/home/trusktr/.ssh/known_hosts"
debug3: load_hostkeys: found key type RSA in file /home/trusktr/.ssh/known_hosts:16
debug3: load_hostkeys: loaded 1 keys
debug1: Host 'github.com' is known and matches the RSA host key.
debug1: Found key in /home/trusktr/.ssh/known_hosts:16
debug2: bits set: 497/1024
debug1: ssh_rsa_verify: signature correct
debug2: kex_derive_keys
debug2: set_newkeys: mode 1
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug2: set_newkeys: mode 0
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /home/trusktr/.ssh/id_rsa (0x14cce60)
debug2: key: trusktr@rocketship (0x14ce2b0)
debug2: key: /home/trusktr/.ssh/id_dsa ((nil))
debug2: key: /home/trusktr/.ssh/id_ecdsa ((nil))
debug1: Authentications that can continue: publickey
debug3: start over, passed a different list publickey
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/trusktr/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug1: Offering RSA public key: trusktr@rocketship
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/trusktr/.ssh/id_dsa
debug3: no such identity: /home/trusktr/.ssh/id_dsa
debug1: Trying private key: /home/trusktr/.ssh/id_ecdsa
debug3: no such identity: /home/trusktr/.ssh/id_ecdsa
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).
ssh-add
添加密钥。是你做的吗?
%HOME%
?无论如何,ssh -vvv github.com
会有所帮助:stackoverflow.com/questions/6018551/… 和 stackoverflow.com/questions/922210/…
GitHub ssh setup 提到测试您的 GitHub 连接:
$ ssh -T git@github.com
在 ssh uri syntax 之后(也在“this answer”中说明)。
但你做到了:
ssh github.com
(没有任何用户)。在这种情况下,ssh 会恢复到 SCP syntax,它依赖于带有“github.com
”部分的 ~/.ssh/config
文件来列出:
用户
主机名
(以及可选的公钥位置,但默认情况下它会尝试 ~/.ssh/id_rsa.pub)
要将其更改为常规 SSH URL,请不要直接编辑 .git/config 文件,如下所示。
使用 command git remote set-url
:
git remote set-url origin git@github.com:username/repo.git
我有一个类似的问题,github 没有使用我的 SSH 密钥。我总是必须输入我的用户名和密码。
我一直在查看 .git/config,在 [remote "origin"] 下有:
url = http://github.com/path/to/repository
或者
url = https://github.com/path/to/repository
我把线改成
url = ssh://git@github.com/path/to/repository
然后它起作用了。
git remote
,它将列出您的所有远程存储库。就我而言,它是 origin
2. git remote remove <remote name that you found>
3. git remote add origin git@github.com:username/repository-name.git
--set-upstream origin master
创建配置文件 (~/.ssh/config
) 后,它起作用了。这就是我必须放入的内容:
Host github.com
User git
Port 22
Hostname github.com
IdentityFile ~/.ssh/id_rsa
TCPKeepAlive yes
IdentitiesOnly yes
感谢@VonC 在评论中将我带到那里。
我不明白为什么我以前从来不需要这个。
sshCommand
。但我可以使用这种技术来指定我想使用的 IdentityFile
。
config
文件指向错误的 ssh 密钥,这提醒我删除它大声笑
如果它适用于其他存储库,但不是一个特定的,那么您可能使用了错误的远程 URL (即 https
而不是 git@github.com
)
首先,仔细检查您的 git ssh 连接是否正常: ssh -T git@github.com 如果正常,请检查您的远程: git remote -v 它将显示如下内容: origin https://github.com/username/ repo(fetch) origin https://github.com/username/repo(push) 如果遥控器以 https 开头,则需要更改此 url: git remote set-url origin git@github.com:usertname /repo.git
转至 here 了解更多详情。
.git
!
这对我有用:
git remote set-url origin git@github.com:<YOUR-USERNAME>/<YOUR-REPOSITORY>.git
更改 <> 中的项目并运行命令,然后尝试 git push。
Github.com 在 managing remote repositories 上的页面帮助了我。
从 github 复制克隆地址时,我在 Windows 中遇到了一些奇怪的行尾问题。
注意 git 之前的额外字符。它没有出现在我的控制台中。它是看不见的。
git clone git@github.com:user/repo.git ./docker
Cloning into './docker'...
Warning: Permanently added the RSA host key for IP address '140.82.XXX.X' to the list of known hosts.
\302\226git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
我花了一段时间才注意到响应中 git 之前的 \302\226
。看到这一点后,我在 git@ 之前退格并确保那里只有一个空格并且它有效。
ssh-agent
已停止。您可能需要通过在 git bash 中运行命令 `eval "$(ssh-agent -s)"` 来启动 ssh-agent。然后,您可以通过运行命令 ssh-add ~/.ssh/*
再次将所有 ssh 密钥添加到 ssh-add
GitHub 最近对所有密钥进行了审核。转到 the key section of your account 重新批准它。
对于 ssh,您需要更改 url。打开 git 配置文件并将 url 更改为
url = git@github.com:username/repository.git
使用 Git for Windows 从 Windows 7 迁移到 Windows 10 时,我遇到了类似的问题。
我有我公司的 Gitlab 的 SSH 密钥,在我的旧计算机上运行,并在 Windows cmd 或 Git Bash 中使用这个 ssh 命令运行良好(将 git.my_server.com 替换为 Git 服务器域) - 所以我的 Windows 是能够使用密钥,但用于 Windows 的 Git 不能:
ssh -T git@git.my_server.com
(显示:“欢迎来到 GitLab,@my_username!)。但是,当尝试使用 git 克隆、推送或拉取时,我收到“权限被拒绝(公钥)”错误消息。
我最初找不到 Git 使用的 SSH 密钥的位置/环境,因此我尝试使用 Git Bash 将 ssh 密钥复制/粘贴到此环境中:
从 Windows 开始菜单(不是从目录)打开 Git Bash。输入 pwd 我后来发现这会返回你的 ssh 密钥的位置。在我的情况下,这返回了“/u/”,它是在我的 Windows 帐户中安装为“U:\”的网络驱动器。键入 cd .ssh,然后键入 dir。这可能会列出您当前存在的 id 文件,例如 id_rsa 和 id_rsa.pub。我删除了这些文件,因为我不再需要它们(如果您在安装中成功使用了其他 SSH 密钥,您可能想跳过此步骤,例如其他 Git 服务器): rm id_rsa rm id_rsa.pub 创建一个新的 id_rsa 文件(如果您有一个现有的 id_rsa 文件,您也可以使用其他名称,例如 id_rsa_gitlab_my_username 或类似名称。将 .pub 添加到此名称作为公钥):vi id_rsa 并按键盘上的“i”切换到文本插入模式.现在复制您的私钥文件的内容(我在 C:\Users\my_windows_username.ssh\id_rsa 中有我的,并使用 Notepad++ 复制了完整的内容,Windows 记事本也可以正常工作)。按键盘上的 Escape 退出文本插入模式,然后输入“:”和“x”,然后按 Enter 保存文件。对公钥文件重复此操作。如果您使用多个 SSH 密钥或为 id_rsa 文件使用其他名称,您还应该创建一个“配置”文件或复制现有配置文件的内容:vi config(再次,按“i”,插入文本,按“: ', 'x',然后 Enter。)我的文件如下所示(使用您的服务器、用户和 SSH 文件名):#SCC Gitlab Host git.my_server.com HostName git.my_server.com User git IdentityFile ~/.ssh/ id_rsa
现在我的 Git for Windows 能够再次毫无问题地推送、拉取和克隆。
首先,试试这个(根据需要更改您的电子邮件地址)
ssh-keygen -t rsa -b 4096 -C "you@yourdomain.com"
如果您使用 Cygwin 创建,可能会对主目录感到困惑,这对我来说就是这样,因为我指的是(复制到 GitHub)来自不同目录的旧/不正确的密钥。因此,如果您发生这种情况,请在创建密钥后执行以下操作:
$ explorer .
这将弹出一个 Windows 资源管理器窗口,显示您的完整/绝对路径。那是我看到〜目录实际上是我的Cygwin目录的时候
C:\Program Files\cygwin64\home\{your_username}\.ssh
然后我可以复制我的私人 SSH 密钥并粘贴到 GitHub 中,然后进行克隆等。然后就可以工作了。
我在 Gnome 上遇到了类似的问题。配置没问题,但没有将密钥添加到 ssh-agent。重新启动就可以了。 Gnome Keyring 使用它自己的 ssh-agent。
就我而言,这是因为我有 2 个用户,他们都有一个 SSH 密钥。第一个经过身份验证的不是我需要的。所以我从中删除了 SSH 密钥。
此命令帮助我了解正在使用哪个用户,因为它的输出:
ssh -T git@github.com
另一个可能的原因是权限。
这个周末我在一台新笔记本电脑上遇到了同样的问题,即使我的 ssh 密钥已经在 Github 中多年了,我也无法推送到 github。
您的 ~/.ssh/
目录的权限应为 700
,您的 id_rsa
和 id_rsa.pub
应为 600
当我将密钥复制到新笔记本电脑时,我的权限过于宽松。
更多信息:https://help.ubuntu.com/community/SSH/OpenSSH/Keys
您需要编辑远程 URL 设置,只需按照以下步骤操作:
打开终端。将当前工作目录更改为您的本地项目。列出您现有的遥控器以获取您要更改的遥控器的名称。
$ git remote -v
使用 git remote set-url 命令将远程的 URL 从 HTTPS 更改为 SSH。将 USERNAME 和 REPOSITORY 更改为您的。
$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
验证远程 URL 是否已更改。
$ git remote -v
验证新的远程 URL
现在将显示:
来源 git@github.com:USERNAME/REPOSITORY.git(获取) 来源 git@github.com:USERNAME/REPOSITORY.git(推送)
在此之后,您将永远不会发现 Permission denied (publickey
) 并且您的推送将运行正常。
在 .git/config 我改变了
[remote "origin"]
url = https://path/to/the/repo.git
至
[remote "origin"]
url = git@github.com:path/to/the/repo.git
它开始工作没有任何问题。此外,如果您之前在设置 SSH 密钥之前克隆了您的项目,重新克隆将解决问题。确保您的本地存储库与远程存储库保持同步。
ssh://git@github.com:port/repo.git
。如果你不使用ssh://
方案,那么它是一个 SCP 语法,其中端口是单独指定的。