ssh是一种安全的传输模式
git要求推送代码的用户是合法的,所以每次推送时候都要输入密码,
用以验证你是否为合法用户,为了省去每次都要输入密码的步骤,采用ssh公钥,密钥
也就是你说的sshkey来验证你是否为合法用户
在你的电脑生成了一个唯一的ssh公钥和私钥,公钥放到git上面,当你推送的时候,git就会
匹配你的私钥是否跟工蜂网页上面的公钥是配对的,正确就认为你是合法的,允许推送。
sshkey可以理解为是你的身份标识,放在git上面表明你是这个项目的一个开发人员,但是别
人是可以截获的,你本机的私钥别人就无法截获,sshkey就可以保证每次传输都是安全的。
注意:这边的公钥和私钥是两个不同的钥匙串。私钥放在自己手里(机器里),公钥放到git网页上,比如工蜂
1、创建公钥文件
$ ssh-keygen -t ed25519 -C "企业微信名@tencent.com"
这边的"ed25519"只是默认的文件名,不代表任何意义
这边会生成两个文件 #这里我文件名用的是id_rsa,等同于前面的命名ed25519
此处的id_rsa就是私钥,留在我自己手里的
id_rsa.pub是公钥,稍后参照文档将这个上传至工蜂页面
注意事项:
此处的公私钥,和机器是完全对应的。毫无关联。只要成对就行。别扯什么以前能用没问题,该重新生成的就得重弄
//很多用户沿用旧的秘钥,但是仍然报错的。有可能是用户的私钥或者公钥其中一方丢失。必须保证秘钥的转移是成对的。否则就得重新生成了
2、创建config及添加config内容
创建config
$ touch config
## 创建一个config文件
$ chmod 600 config
## 太宽松的权限会被git认为是错误,缩写权限为600
$ vim config
## 编辑config文件并把第3步中内容添加在config文件
此处科普一下关于chmod 600的含义:
Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。
chmod xxx 是用来加载文件权限的。
权限设置:
[rwxX]
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
将权重转为数字,后续可用数字来代表权限。
r=4 , w=2 , x=1
另外chmod 后面的三个数字分别代表三个不同角色的权限
按顺序是User、Group、Other的权限
完整写法应该是
chmod u=权限,g=权限,o=权限
比如:
//设置所有人可以读写及执行:
chmod 777 //等价于chmod u=rwx,g=rwx,o=rwx
此处的7,代表r+w+x=4+2+1=7
三个7代表三者权限
chmod 600 //等价于chmod u=rw,g=没权限,o=没权限
我们常用的就是这个,尤其是devcloud中,由于有很多个不同的用户在一台机器中。
设置600才能保证仅有自己能用到
添加config文件内容
Host git.woa.com
HostName git.woa.com
//上面两句都是写生效的域名的。所以一台服务器连多个Git,包括github,git工蜂,gitee的时候,就得写这个来指向
User git
Port 22
//因为devcloud里的ssh_config里会默认ssh是36000端口连接,得改回这个,工蜂是22端口。可以参考咱们的文档:https://iwiki.woa.com/pages/viewpage.action?pageId=410396231
HostkeyAlgorithms +ssh-rsa
IdentityFile /root/.ssh/id_ed25519
//上面这句是指向本地私钥文件路径,有一个openssh等级太高导致我们rsa私钥失效的问题就通过添加这句解决的,参考文档:https://iwiki.woa.com/pages/viewpage.action?pageId=1161815658
注意:使用 ssh 请在 Git bash 命令行执行,在系统命令行下执行会读不到key。
1. 使用 ssh clone 报错:ssh: connect to host git.woa.com port 36000: Connection timed out
解决方法:修改~/.ssh/config 将36000注释掉就走22端口。
同理还会有其他端口报错,都是可以在这边指定的
2. 报错 :Permission denied (publickey).fatal: The remote end hung up unexpectedly
可能成因1:出现这个报错的原因是 ssh 没有配置正确,或者使用 ssh 链接但是 ssh key 没有添加到git的帐号设置中。
解决方法:检查 ssh 的配置,将 ssh key 添加到git的帐号设置中.
可能成因2:openssh-7.0p1 开始默认不支持dsa密钥,openssh-8.8p1 开始不再接受低版本设备的rsa密钥(
ssh-keygen
指令能生成密钥不代表就能使用),比如MacOS
解决方法:使用别的加密方式(如上文用到的ed25519),重新生成并添加ssh key到git的帐号设置中; 如果本地的openssh高于或等于8.6p,并且原本的rsa密钥不方便替换,可通过在~/.ssh/config里添加
PubkeyAcceptedAlgorithms +ssh-rsa
来兼容
(注:低版本的openssh不支持PubkeyAcceptedAlgorithms,如果误加会导致Bad configuration option的报错,ssh同样会不可用。所以这里优先推荐更换成ed25519密钥)
其实就还是因为之前的私钥不被接受了。最妥善的处理方法就还是重新生成,走一遍这个ssh流程,这样添加的config也被认了
4. 报错: Bad owner or permissions on xxx/.ssh/config
问题成因:config文件权限不对。
解决方法:chmod 644 ~/.ssh/config(将config文件权限改为644)。
详情含义见前方#此处科普一下关于chmod 600的含义
5. 使用ssh clone时总是报错使用另外的key值去操作:
解决方法:删掉config文件全部内容,或者相关的内容(确定跟某个key值相关的内容),重新添加一遍key。
用户.ssh如果有多个key,有一个是有效的却没有用,那就可能是因为没有指定正确的路径
这里的重写。大概率是因为重写的时候参考教程,更正了路径
6. 使用ssh clone时还是提示输入密码:
解决方法:ssh方式不能在外网以及StaffWifi中使用,检查自己网络。
网络根本无法链接上GIT服务端,就会报这个来着。要不然再排查下git代理.gitconfig中有没有,或者系统有没有设代理
跟端口已经不一样了,这个是无法Ping通的
7. 报错:sign_and_send_pubkey: signing failed: agent refused operation:
问题原因:ssh的私钥key没有被添加到ssh-agent中。
解决方法:在客户端机器上运行命令
ssh-add
, 添加SSH key到SSH的agent中.然后可以用命令
ssh-add -l
(同样也是在客户端机器执行)查看实际是否添加成功。
根据前面的ssh简介所说,
ssh 推荐的登录方式是使用私钥登录。但是如果生成私钥的时候,设置了口令/密码(passphrase),每次登录时需要输入口令也很麻烦。可以通过 ssh-agent 来管理私钥,把私钥加载进内存,之后便不用再输入密码。
9. 报错:Unable to negotiate with xxx port 22: no matching host key type found. Their offer: ssh-rsa
问题原因:本地的openssh版本较高(大于等于8.8p), 高版本ssh客户端不接受服务端的ssh-rsa公钥。一般通过
ssh -vT git.woa.com
可看到打印的openssh版本
解决方法:参考上文的 ~/.ssh/config 配置,加上
HostkeyAlgorithms +ssh-rsa
这里其实跟报错2,还有报错5有点像的感觉?因为都是rsa文件不能被认证到。添加允许ssh-rsa的权限即可
要不然,再走一边流程,生成,加入config文档这样子?基本能解决大部分问题
额外补充一个:SSH连接方式自动断掉的梗
用ssh推送会莫名断掉的问题
ssh push的话底层会做一些的逻辑,push时间超过10min客户端就会超时了 如需使用ssh推送,需要拆分推送
临时解决方案:
使用http方式可以了。
主要问题:SSH强制超时,
ssh连接超时问题解决方案:
1.修改server端的etc/ssh/sshd_config
ClientAliveInterval 60 #server每隔60秒发送一次请求给client,然后client响应,从而保持连接
ClientAliveCountMax 3 #server发出请求后,客户端没有响应得次数达到3,就自动断开连接,正常情况下,client不会不响应
2.修改client端的etc/ssh/ssh_config添加以下:(在没有权限改server配置的情形下)
ServerAliveInterval 60 #client每隔60秒发送一次请求给server,然后server响应,从而保持连接
ServerAliveCountMax 3 #client发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,server不会不响应