当前位置:   article > 正文

jsch session(ssh)_jsch.addidentity

jsch.addidentity

异常: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文件,没有该文件则创建
  • 1

附录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);
}
  • 1
  • 2
  • 3
  • 4
  • 5

案例代码:添加私钥存放路径

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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

校验 私钥是否能正确登录,可使用命令校验 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 【镜像名】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/665146
推荐阅读
相关标签
  

闽ICP备14008679号