赞
踩
异常:com.jcraft.jsch.JSchException: Auth cancel分析
1.用户不能进行远程登录,比如CentOS6,默认root不能进行远程登录
2.linux服务器的配置文件 /etc/ssh/sshd_config 中 GSSAPIAuthentication 的值是 yes
解决方案:
1.在路径 /etc/ssh/sshd_config 文件中,PermitRootLogin yes 把这一行注释取消掉,也就是允许root远程登录。
2.在 /etc/ssh/sshd_config 中 将GSSAPIAuthentication 修改为 no, 或者在java代码中增加 session.setConfig(“userauth.gssapi-with-mic”, “no”),同时不要忘了 session.setConfig(“StrictHostKeyChecking”, “no”);
3.如果想加快SSH的登录的速度,可以把路径 /etc/ssh/sshd_config 文件中 UseDNS yes 修改为 no
4.重启sshd服务,service sshd restart
该问题以上方式都不成功,试过的方法:1.将id_rsa用putty工具转为ppk格式(putty使用0.62版本时发现不能加载id_rsa文件;换用0.77版本可以加载),该方法并没有解决问题;2.使用ssh-keygen -p -f /root/.ssh/id_rsa -m PEM命令,将openssh私钥转成rsa的,也未解决;3.可能为服务器上解密方式和私钥加密方式不一致导致,OpenSSH版本不对,服务器没有对应的加密算法,我的解决方法:GitHub下载最新JSch源码编译,替换原来低版本JSch包,解决了问题
参考: https://www.cnblogs.com/exmyth/p/14779241.html
引用com.jcraft.jsch
使用私钥登录时,准备工作:
1.检查服务器是否支持免密登录
cat /etc/ssh/sshd_config | grep Pubkey
输出 PubkeyAuthentication yes 则表示支持免密
如果PubkeyAuthentication是 no ,则改为 yes并运行service sshd restart生效
2.ssh-keygen -t rsa -m PEM -C “your.email@example.com” -b 4096 【-C 是给你的密钥设置注释,你不想设置为邮箱,设置成别的也行】
在/root/.ssh 目录中会生成私钥【id_rsa】和公钥【id_rsa.pub】两个文件
使用“密码更改”模式转换现有密钥:ssh-keygen -p -f /root/.ssh/id_rsa -m PEM
3.复制id_rsa.pub 中的公钥到 /root/.ssh/authorized_keys文件,没有该文件则创建
附录ssh-keygen命令参数解释
-b:指定密钥长度;
-e:读取openssh的私钥或者公钥文件;
-C:添加注释;
-f:指定用来保存密钥的文件名;
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;
-t:指定要创建的密钥类型。
案例代码:添加私钥字符串
JSch.addIdentity(String name, byte[] prvkey, byte[] pubkey, byte[] passphrase) 该方式加载私钥字符串,我没试验成功
jsch.addIdentify("myconn",readPrivateKey(strKey),null,null);
byte[] readPrivateKey(strKey){
strKey = strKey.replace("-----BEGIN RSA PRIVATE KEY-----", "-----BEGIN RSA PRIVATE KEY-----\r\n").replace("-----END RSA PRIVATE KEY-----", "\r\n-----END RSA PRIVATE KEY-----");
return strKey.getBytes(StandardCharsets.US_ASCII);
}
案例代码:添加私钥存放路径
private Session session; JSch jsch = new JSch(); //pathName为 私钥 存放的 绝对路径 jsch.addIdentify(pathName); MyUserInfo myUserInfo = new MyUserInfo(); Properties conf = new Properties(); conf.put("StrictHostKeyChecking","no"); //账号:username 服务器ip:ip 登陆时端口默认22:ssh_port session = jsch.getSession(username,ip,ssh_port); //登录密码,添加了私钥,改为私钥连接 //session.setPassword(password); session.setConfig(conf); session.setUserInfo(myUserInfo); //连接超时时间 30秒 session.connect(30 * 1000); ChannelExec channelExec = (ChannelExec) session.openChannel("exec"); //command传入的命令 多条命令之间可以用英文分号“;”或 “&&” 连接 channelExec.setCommand(command); //读取 BufferedReader bf = new BufferedReader(new InputStreamReader(channelExec.getInputStream())); channelExec.setErrStream(System.err); channelExec.connect(); while((line = bf.readLine())!=null){ } bf.close(); channelExc.disconnect(); session.disconnect();
校验 私钥是否能正确登录,可使用命令校验 ssh -i id_rsa test@192.xx.xx.xx
容器挂载时加载私钥地址 :
kubectl get po -A -owide | grep nfs
kubectl get nodes -owide
kubectl get deploy -n 【用户】nfs-client-provisioner -oyaml
kubectl get po -n 【用户】 |grep 【服务】
kubectl logs -f -n 【用户】–tail=400 【服务】
kubectl delete po -n 【用户】【服务】
docker images | grep XX
docker build -t 【镜像名】.
docker push 【镜像名】
docker run -t 【镜像名】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。