jsch session(ssh)

异常: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 【镜像名】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值