持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
0x1、问题描述
前些日子折腾了一个618自动做任务的jio本,随手写了两篇文章:
《节约"阳寿"——某电商618活动自动化》 《破大防!这个开源库,竟能让APP日常任务自动化变得如此简单》
因为代码写得乱而且有BUG,所以仓库虽然建了,代码却久久未上传,不过好像真的有人需要,恰逢今天没啥事,索性整理Push一波。
和往常提交代码一样,git add、git commit 然后添加远程仓库地址,准备push:
1
2
|
git remote add origin git@github.com:coder-pig/CPAuto.git
git push -u origin main
|
但却没有预期中的push成功:
这TM咋回事?
前不久写的权限库上传没这个问题啊?换成https协议试试:
1
2
|
git remote set-url origin https://github.com/coder-pig/CPAuto.git
git push -u origin main
|
同样没有预期中的成功:
???
可能需要 代理?终端键入下述命令启用一波:
1
2
|
set http_proxy=http://127.0.0.1:7890
set https_proxy=http://127.0.0.1:7890
|
在此push,弹出登录弹窗:
键入账号密码,点击登录:
又得输一遍?反复确认账号密码没错后,我又输了一遍:
又报错了,简单翻译下原因:
对密码身份验证的支持已于2021年8月13日移除,请改用个人 访问令牌
后面还贴了一个官方的解释:Token authentication requirements for Git operations
大概意思:为了安全,取消账号密码身份验证,而使用令牌(Token)的身份验证,它有这些好处:
- 唯一: 令牌特定于 GitHub,可以按使用或按设备生成;
- 可撤销:可以随时单独撤销令牌,而无需更新未受影响的凭据;
- 有限 : 令牌可以缩小范围以仅允许用例所需的访问;
- 随机:令牌不需要记住或定期输入的更简单密码可能会受到的字典类型或蛮力尝试的影响;
然后:SSH密钥的方式还是保留的,至于我采用这种方式push不成功及如何解决,等下会说。
好的,先来生成一波Github Token~
0x2、生成Github Token
打开Github,点击自己的头像,依次点击 Settings
→ Developer Settings
→ Personal access tokens
→ Generate new token
:
接着填Token描述、选有效期,勾选Token的作用域:
确认无误后,点击底下的 Generate token
生成Token:
然后是生成的Token:
注意保存好Token!!!页面刷新后你就再也看不到它了,当然实在忘记了,删掉再新建一个也是可以的~
接着命令行修改下远程仓库的地址,加上这个token:
1
|
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
|
如我的仓库:
此时再Push:
成功~
0x3、SSH密钥
生成与配置SSH KEY具体步骤可见:《7.SSH Key避免每次push重复输入账号密码》,就不复述了。
本地和Github上都有这个密钥,但是就是不能Push,而且我发现旧项目也不能Push了,明明三周前还Push过一次的。网上一堆文章教你建个没卵用的config,也是醉了,只能自己排查一下了…
问题排查过程
使用ssh -v打印出详细日志:
日志打印结果如下:
我擦?127.0.0.1
,怎么指向本机地址了?ping一下:
看下 hosts
文件,并没有隐射这个地址,ipconfig/flushdns
刷新了DNS缓存,再ping也是这样。
百度了一波,很多人提到了 运营商DNS污染
,用站长工具的DNS查询了一下:
卧槽?该不会那么恶心吧?本地 ipconfig/all
找到使用的DNS服务器地址:
接着使用 nslookup 域名 DNS服务器地址
看下能否解析:
呵呵,果真如此,估计是最近有什么日子,所以一刀切,知道了原因,解决方法就来了~
解法一:修改DNS指向
控制面板 → 网络和Internet → 网络链接:
右键属性,找到 Internet 协议版本4(TCP/IPv4)属性,勾选使用下面的DNS服务器地址:
确定后,再次Push就可以了:
除了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解析,如:
键入git pull一下看看:
可以,如果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,就可以了~
附: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、代理设置 的解决方案。
有同样情况的童鞋赶紧试试吧,本文应该能帮您解决这个问题,如果还不行可在评论区提出,一起探讨,感谢~