目录

无法Push代码到Github???

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

0x1、问题描述

前些日子折腾了一个618自动做任务的jio本,随手写了两篇文章:

《节约"阳寿"——某电商618活动自动化》 《破大防!这个开源库,竟能让APP日常任务自动化变得如此简单》

因为代码写得乱而且有BUG,所以仓库虽然建了,代码却久久未上传,不过好像真的有人需要,恰逢今天没啥事,索性整理Push一波。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b6c9a783cda94d23a900f81a73220660~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

和往常提交代码一样,git add、git commit 然后添加远程仓库地址,准备push:

1
2
git remote add origin git@github.com:coder-pig/CPAuto.git
git push -u origin main

但却没有预期中的push成功:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/afe0400fc599466cb60c76fa148feadd~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

这TM咋回事?

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cd01f69779704f05bad7fadf74d1d228~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

前不久写的权限库上传没这个问题啊?换成https协议试试:

1
2
git remote set-url origin https://github.com/coder-pig/CPAuto.git
git push -u origin main

同样没有预期中的成功:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/10c7f99fac10484291043f88a68f261e~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

???

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/373b1d34b58e4fcd910ef753be4b4d44~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

可能需要 代理?终端键入下述命令启用一波:

1
2
set http_proxy=http://127.0.0.1:7890
set https_proxy=http://127.0.0.1:7890

在此push,弹出登录弹窗:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6b49ba9c037e4f99935dd9e7141b1ad7~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

键入账号密码,点击登录:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0d5be74455664eeb9cb169f6494ef6cf~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

又得输一遍?反复确认账号密码没错后,我又输了一遍:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b2393d109b7d4596968bcb900c076ecf~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

又报错了,简单翻译下原因:

对密码身份验证的支持已于2021年8月13日移除,请改用个人 访问令牌

后面还贴了一个官方的解释:Token authentication requirements for Git operations

大概意思:为了安全,取消账号密码身份验证,而使用令牌(Token)的身份验证,它有这些好处:

  • 唯一: 令牌特定于 GitHub,可以按使用或按设备生成;
  • 可撤销:可以随时单独撤销令牌,而无需更新未受影响的凭据;
  • 有限 : 令牌可以缩小范围以仅允许用例所需的访问;
  • 随机:令牌不需要记住或定期输入的更简单密码可能会受到的字典类型或蛮力尝试的影响;

然后:SSH密钥的方式还是保留的,至于我采用这种方式push不成功及如何解决,等下会说。

好的,先来生成一波Github Token~


0x2、生成Github Token

打开Github,点击自己的头像,依次点击 SettingsDeveloper SettingsPersonal access tokensGenerate new token

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c231de1c01eb4558a7ddd5770430c25a~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

接着填Token描述、选有效期,勾选Token的作用域:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e40cef90009144b8a9a61d66b44ee5e1~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

确认无误后,点击底下的 Generate token 生成Token:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d34f6070cb6a4d95b480e72b4b992929~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

然后是生成的Token:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3d79b8b20eed4305b979e1cde65f0ed7~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

注意保存好Token!!!页面刷新后你就再也看不到它了,当然实在忘记了,删掉再新建一个也是可以的~

接着命令行修改下远程仓库的地址,加上这个token:

1
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git

如我的仓库:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d3e4109ce31d47a3bebb35520edefcac~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

此时再Push:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a553df9f745e4631b21ee623dcbb35f9~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

成功~

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/871fd014a4c14c50a371b40a15fc6ea8~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image


0x3、SSH密钥

生成与配置SSH KEY具体步骤可见:《7.SSH Key避免每次push重复输入账号密码》,就不复述了。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/96a968c73e864e49b6c3f3333e081daa~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

本地和Github上都有这个密钥,但是就是不能Push,而且我发现旧项目也不能Push了,明明三周前还Push过一次的。网上一堆文章教你建个没卵用的config,也是醉了,只能自己排查一下了…

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1018e6d6bbee4f15a80d476f422bd536~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

问题排查过程

使用ssh -v打印出详细日志:

1
ssh -vT git@github.com

日志打印结果如下:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/be31910516a248fd83d75244a75d7e0a~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

我擦?127.0.0.1,怎么指向本机地址了?ping一下:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/68a0d41faa084ce0a9aa3fcd51f48fe7~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

看下 hosts 文件,并没有隐射这个地址,ipconfig/flushdns 刷新了DNS缓存,再ping也是这样。

百度了一波,很多人提到了 运营商DNS污染,用站长工具的DNS查询了一下:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/12f0beb4070b46bcb0374e803a068e21~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

卧槽?该不会那么恶心吧?本地 ipconfig/all 找到使用的DNS服务器地址:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2841f0dbf4964f1f8ed03c1d8be69811~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

接着使用 nslookup 域名 DNS服务器地址 看下能否解析:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/64ad3c840060445fa6b3cbf94fc07c35~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

呵呵,果真如此,估计是最近有什么日子,所以一刀切,知道了原因,解决方法就来了~

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d47d1f421d4e4ed58a3eab579150271a~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image


解法一:修改DNS指向

控制面板网络和Internet网络链接

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c0fe8f3449744f57a5876da788fbba4e~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

右键属性,找到 Internet 协议版本4(TCP/IPv4)属性,勾选使用下面的DNS服务器地址:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f94240457afe4389979508aae1d40c19~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

确定后,再次Push就可以了:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e74ffdaabd3e4e67935fadb356c3ef3f~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

除了114.114.114.114、8.8.8.8 外,还有这些公用的DNS服务器可供选择:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 腾讯 DNS:(DNSPOD)
IPv4地址:
119.29.29.29
182.254.116.116
IPv6地址:
2402:4e00::

# 阿里DNS:
IPv4地址:
223.5.5.5
223.6.6.6
IPv6地址:
2400:3200::1
2400:3200:baba::1

# 百度DNS:
ipv4:180.76.76.76
ipv6:2400:da00::6666

解法二:修改Hosts

windows系统,依次打开:C:\Windows\System32\drivers\etc,添加github.com解析,如:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/28c86d4130f7429392dac14e9ba39b0e~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

键入git pull一下看看:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b070d28b83d3427cb22bf5f81e8b31e4~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

可以,如果DNS失效了,可以替换方法一种的DNS,也可以到站长之家DNS解析那里Copy,如果设置后没生效,可以在终端键入 ipconfig/flushdns 刷新下DNS缓存。附:群里的热心小伙分享的hosts,取需~

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
140.82.114.26                 alive.github.com
140.82.114.25                 live.github.com
185.199.108.154               github.githubassets.com
140.82.112.21                 central.github.com
185.199.108.133               desktop.githubusercontent.com
185.199.108.153               assets-cdn.github.com
185.199.108.133               camo.githubusercontent.com
185.199.108.133               github.map.fastly.net
199.232.69.194                github.global.ssl.fastly.net
140.82.113.3                  gist.github.com
185.199.108.153               github.io
140.82.112.4                  github.com
192.0.66.2                    github.blog
140.82.112.6                  api.github.com
185.199.108.133               raw.githubusercontent.com
185.199.108.133               user-images.githubusercontent.com
185.199.108.133               favicons.githubusercontent.com
185.199.108.133               avatars5.githubusercontent.com
185.199.108.133               avatars4.githubusercontent.com
185.199.108.133               avatars3.githubusercontent.com
185.199.108.133               avatars2.githubusercontent.com
185.199.108.133               avatars1.githubusercontent.com
185.199.108.133               avatars0.githubusercontent.com
185.199.108.133               avatars.githubusercontent.com
140.82.114.9                  codeload.github.com
52.217.168.41                 github-cloud.s3.amazonaws.com
52.217.194.89                 github-com.s3.amazonaws.com
52.216.93.147                 github-production-release-asset-2e65be.s3.amazonaws.com
52.216.93.147                 github-production-user-asset-6210df.s3.amazonaws.com
52.217.202.113                github-production-repository-file-5c1aeb.s3.amazonaws.com
185.199.108.153               githubstatus.com
64.71.144.211                 github.community
23.100.27.125                 github.dev
140.82.113.21                 collector.github.com
13.107.42.16                  pipelines.actions.githubusercontent.com
185.199.108.133               media.githubusercontent.com
185.199.108.133               cloud.githubusercontent.com
185.199.108.133               objects.githubusercontent.com

解法三:代理设置

前两种方法适合没有代理的,作为一个面向Google编程的开发仔,基本人手必备一个代理~

详细配置与相关问题,可以参见stackoverflow上的:《Connect with SSH through a proxy》

修改 ~/.ssh/config 文件,没有的话新建一个,按需添加代理配置,以读者Windows + Clash (socks5)为例:

1
2
3
4
5
ProxyCommand connect -S 127.0.0.1:7890 -a none %h %p

Host *github.com
   HostName github.com
   User git

此时再ssh -T,就可以了~

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1423a13a88bf495cb7f4ece85123165d~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

附:Windows平台没有nc命令,MAC、Linux平台上设置命令如下:

1
2
3
4
5
# socks5
ProxyCommand nc -v -x 127.0.0.1:1086 %h %p

# HTTP代理,需要brew install socat
ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=1087

SSH代理配置非常简单,顺带也提下 Https代理配置 相关:

只对Github代理 (推荐)

1
2
3
4
5
# http代理
git config --global http.https://github.com.proxy http://127.0.0.1:58591

# socks代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:7890

② 全局设置 (不推荐)

1
2
3
4
5
6
7
#使用http代理 
git config --global http.proxy http://127.0.0.1:58591
git config --global https.proxy https://127.0.0.1:58591

#使用socks5代理
git config --global http.proxy socks5://127.0.0.1:7890
git config --global https.proxy socks5://127.0.0.1:7890

③ 取消代理

1
git config --global --unset http.proxy git config --global --unset https.proxy

0x4、小结

本节先描述了代码无法Push到Github上的问题,并进行了排查和解决,中途发现 Github为了安全,已于2021年8月13日取消账号密码身份验证,而使用令牌(Token)的身份验证,阐述了如何创建和使用这个Token。紧接着发现 运营商DNS污染(真TM坑) 导致ssh github指向本机地址(127.0.0.1)的问题,并提供了 改DNS改Hosts代理设置 的解决方案。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/554802783b3a499e892b41ac97dbe633~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

有同样情况的童鞋赶紧试试吧,本文应该能帮您解决这个问题,如果还不行可在评论区提出,一起探讨,感谢~