今天在服务器上尝试配置github的ssh密钥,但配置完成后,测试成功
[root@alwaysdayone ~] ssh -T git@github.com
[root@alwaysdayone ~] Hi XXXXXX! You've successfully authenticated, but GitHub does not provide shell access.
但我尝试对修改了的仓库进行push操作发现如下错误
[root@alwaysdayone ~] git push
[root@alwaysdayone ~] Username for 'https://github.com': XXXXXX
Password for 'https://XXXXXX@github.com':
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/XXXXXX/logisim_simple_cpu.git/'
大概意思就是你原先的密码凭证从2021年8月13日
开始就不能用了,必须使用个人访问令牌(personal access token)
,就是把你的密码
替换成token
!
github为什么要把密码换成token
github官方解释:
我们描述了我们的动机,因为我们宣布了对 API 身份验证的类似更改,如下所示:
近年来,GitHub 客户受益于 GitHub.com 的许多安全增强功能,例如双因素身份验证、登录警报、经过验证的设备、防止使用泄露密码和 WebAuthn 支持。 这些功能使攻击者更难获取在多个网站上重复使用的密码并使用它来尝试访问您的 GitHub 帐户。 尽管有这些改进,但由于历史原因,未启用双因素身份验证的客户仍能够仅使用其GitHub 用户名和密码继续对 Git 和 API 操作进行身份验证。
从 2021 年 8 月 13 日开始,我们将在对 Git 操作进行身份验证时不再接受帐户密码,并将要求使用基于令牌(token)的身份验证,例如个人访问令牌(针对开发人员)或 OAuth 或 GitHub 应用程序安装令牌(针对集成商) GitHub.com 上所有经过身份验证的 Git 操作。 您也可以继续在您喜欢的地方使用 SSH 密钥(如果你要使用ssh密钥可以参考)。
配置Token
-
在个人设置页面,找到Setting(参考)
-
选择开发者设置Developer setting
-
选择个人访问令牌Personal access tokens,然后选中生成令牌Generate new token
- 设置token的有效期,访问权限等
- 选择要授予此令牌token的范围或权限。
- 要使用token从命令行访问仓库,请选择repo。
- 要使用token从命令行删除仓库,请选择delete_repo
- 其他根据需要进行勾选
- 生成令牌Generate token
如下是生成的token
注意:
- 记得把你的token保存下来,因为你再次刷新网页的时候,你已经没有办法看到它了。
- 邮件会收到token的信息
- 使用token
之后用自己生成的token登录,把上面生成的token粘贴到输入密码的位置,然后成功push代码!
也可以 把token直接添加远程仓库链接中,这样就可以避免同一个仓库每次提交代码都要输入token了:
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
<your_token>:换成你自己得到的token
<USERNAME>:是你自己github的用户名
<REPO>:是你的仓库名称
Netrc文件配置默认token
然后我们需要将Token与我们本地的Github关联,这里有两种方法,一种是使用Git提供的gh工具,在Debian环境下你可以使用apt直接安装。这里我们使用另外一种。
首先使用vim进入netrc
文件
vim ~/.netrc
打开以后输入如下内容:
machine github.com
login not-used
password ToKen
将ToKen改成你刚刚生成的Token码就可以了,用户名不需要填写。
netrc
是登录协议配置文件,当用户从终端访问ssh、http、ftp的通讯协议Server时Linux会读取netrc里的内容,来验证访问的源是否存在配置种,如果存在则直接从netrc种读取并自动登录。
如果你的电脑上不存在netrc文件,可以创建一个:
touch ~/.netrc
chmod 600 ~/.netrc