淘先锋技术网

首页 1 2 3 4 5 6 7

SSH简介:SSH链接方式是啥?

ssh是一种安全的传输模式

git要求推送代码的用户是合法的,所以每次推送时候都要输入密码,

用以验证你是否为合法用户,为了省去每次都要输入密码的步骤,采用ssh公钥,密钥

也就是你说的sshkey来验证你是否为合法用户

在你的电脑生成了一个唯一的ssh公钥和私钥,公钥放到git上面,当你推送的时候,git就会

匹配你的私钥是否跟工蜂网页上面的公钥是配对的,正确就认为你是合法的,允许推送。

sshkey可以理解为是你的身份标识,放在git上面表明你是这个项目的一个开发人员,但是别

人是可以截获的,你本机的私钥别人就无法截获,sshkey就可以保证每次传输都是安全的。

注意:这边的公钥和私钥是两个不同的钥匙串。私钥放在自己手里(机器里),公钥放到git网页上,比如工蜂

解析一下我们文档中的ssh配置步骤

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 <filename>是用来加载文件权限的。
权限设置:
[rwxX]
    r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
将权重转为数字,后续可用数字来代表权限。
r=4 , w=2 , x=1

另外chmod 后面的三个数字分别代表三个不同角色的权限
按顺序是User、Group、Other的权限
完整写法应该是
chmod u=权限,g=权限,o=权限 <filename>
比如:


//设置所有人可以读写及执行:
chmod 777 <file>  //等价于chmod u=rwx,g=rwx,o=rwx <filename>
此处的7,代表r+w+x=4+2+1=7
三个7代表三者权限

chmod 600 <file>  //等价于chmod u=rw,g=没权限,o=没权限 <filename>
我们常用的就是这个,尤其是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不会不响应