前言
最近在搞一个迭代,发现开发环境的持续集成有些地方可以优化,但需要动到前端基础镜像; 而搞完基础镜像准备用起来的时候,问题就冒出来了。本着不能半途而废的态度,搞起~~
问题
这边是用Jenkins做持续集成的,用了pipeline语法,所以一般出错都能比较快速感知到某个阶段凉了~
排查
报错信息就那么点,那就逐句分析~~
1. deploy_devopment.sh
这是在devops上某个阶段会调用这个脚本去做一些事情,源码大体如下
脚本做了这么一些事情,就是用私钥去链接远端服务器。成功后然后判定是否安装了一些工具集,再推过去,失败就直接退出
2. Pseudo-terminal will not be allocated because stdin is not a terminal.
其次映入眼帘的这句话,就是 唯一能快速感知的信息了。。搜索引擎翻了一遍,基本都是说什么不是一个标准终端运行
加-tt
来模拟终端。。具体就是这样
# 增加-t -t参数来强制伪终端分配,即使标准输入不是终端。
ssh -tt user1@host1 -p 9527
复制代码
但是,毫无意义。。。只能继续排查
3. Host key verification failed.
意思很直白,链接域的密钥校验不通过。不科学啊。。逆向推测一下。。
情况1: 不升级镜像底层(alpine版本)正常运行(镜像也安装了openssh),构建也如期进行。 情况2: 升级镜像底层(安装openssh),构建密钥就过不去了。。。
结合密钥过不去,那问题很大概率应该就是出现在openssh的版本了。。 Alpine Linux Apk查询: pkgs.alpinelinux.org/packages
版本跨了一个大版本,那妥妥的是破坏性更新导致的啊!!! 问了下我们的运维小伙伴,我们开发环境目前用的是那种算法加密的!(收到的答复就是:rsa);
为了二次确认,用ssh -v
和现有的密钥去尝试链接远端服务器,输出的日志里面就很清晰的说明了
# ssh -v -p port user@host
OpenSSH_8.8p1, OpenSSL 1.1.1o 3 May 2022
debug1: Reading configuration data /etc/ssh/ssh_config
-------跳过------
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa_sk type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256@libssh.org
-------重点来了------
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Next authentication method: publickey
debug1: Offering public key: /root/.ssh/id_rsa RSA SHA256:In8kvJ1yVExAGJCUrEaJlLme0w2Kbnkjh90GvB3XkvE
debug1: send_pubkey_test: no mutual signature algorithm
复制代码
看上面的log说是没有匹配的签名算法,接下来就是翻changelog了。。 www.openssh.com/txt/release…
解决姿势
配置文件增加域启动配置
我这边直接打到docker内,省去所有from该基础镜像的都需要手动配置一遍;
代码语言:javascript复制RUN mkdir ~/.ssh && echo $'Host *n
StrictHostKeyChecking non
PubkeyAcceptedKeyTypes ssh-rsan
HostKeyAlgorithms= ssh-rsan
UserKnownHostsFile=/dev/nulln'
> ~/.ssh/config
复制代码
会话添加参数
代码语言:javascript复制# openssh版本不是太高的,可以直接用参数指定会话算法
ssh -oHostKeyAlgorithms=-ssh-rsa user@host
# 比较新的openssh需要启动该算法,默认是不启用的,
# PubkeyAcceptedKeyTypes= ssh-rsa
复制代码
总结
有不对之处请指出,会及时修正,谢谢阅读