秘钥登录服务器执行shell脚本
做自动化的时候,有时候避免不了要和服务器有互动,刚巧碰上一个项目,需要执行命令才能完成本次测试。
昨天遇到的是秘钥形式的,只有秘钥和用户名,百度找了许久也没有思路,(能账号密码登录服务器的还简单些),后来看到一篇博文,受到启发,把他的代码改了又改,结果还真行了
代码如下:
import com.jcraft.jsch.*;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Properties; /**
* @author
* 秘钥形式登录服务器执行shell脚本操作
*/
public class ExecuteShellWithKey { /**
* slf4j
*/ private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ExecuteShellWithKey.class);
private Session session; /**
* 远程连接Linux 服务器 执行相关的命令
*
* @param keyFile 秘钥文件
* @param userName 用户名
* @param passphrase 重置后密码
* @param host 主机ip
* @param cmd 执行shell调用命令
* @throws JSchException
* @throws IOException
*/
private void runShell(String keyFile, String userName, String passphrase, String host, String cmd) {
if (!connect(keyFile, userName, passphrase, host)) {
return;
}
ChannelExec channelExec = null;
BufferedReader reader = null;
try {
channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setCommand(cmd);
channelExec.setInputStream(null);
channelExec.setErrStream(System.err);
channelExec.connect();
InputStream in = channelExec.getInputStream();
reader = new BufferedReader(new InputStreamReader(in, Charset.forName("UTF-8")));
String buf = null;
StringBuffer sb = new StringBuffer();
while ((buf = reader.readLine()) != null) {
sb.append(buf);
// 输出每个命令执行后,返回数据
logger.info(sb.toString());
}
} catch (JSchException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (channelExec != null) {
channelExec.disconnect();
}
if (null != session) {
session.disconnect();
}
}
} /**
* 连接到指定的HOST
*
* @param keyFile
* @param userName
* @param passphrase
* @param host
* @throws JSchException
*/
private boolean connect(String keyFile, String userName, String passphrase, String host) {
// 创建JSch对象
JSch jsch = new JSch();
try {
// 引入秘钥文件
jsch.addIdentity(keyFile);
// 根据用户名,主机ip,端口获取一个Session对象
session = jsch.getSession(userName, host, 22);
UserInfo ui = new MyUserInfo(passphrase);
session.setUserInfo(ui);
// 设置密码
session.setPassword(passphrase);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
// 为Session对象设置properties
session.setConfig(config);
int timeout = 60000000;
// 设置timeout时间
session.setTimeout(timeout);
// 通过Session建立链接
session.connect();
} catch (JSchException e) {
e.printStackTrace();
logger.error("connect error !");
return false;
}
return true;
} public class MyUserInfo implements UserInfo {
private String passphrase = null; public MyUserInfo(String passphrase) {
this.passphrase = passphrase;
} public String getPassphrase() {
return passphrase;
} public String getPassword() {
return null;
} public boolean promptPassphrase(String s) {
return true;
} public boolean promptPassword(String s) {
return true;
} public boolean promptYesNo(String s) {
return true;
} public void showMessage(String s) {
logger.info(s);
}
}
}
要是觉得对你有帮助,并且解决了你的问题,麻烦请高抬你发财的贵手,在评论给我个赞即可。。。
秘钥登录服务器执行shell脚本的更多相关文章
- Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息
pom.xml jar 包支持 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch& ...
- ssh无秘钥登录
服务器1:172.16.20.136 服务器2:172.16.20.134 在服务器2上输入:ssh-keygen -t rsa (一路回车) scp /root/.ssh/id_ ...
- 在PHP中调用php_ssh实现远程登陆linux服务器并执行shell脚本。
这个功能主要用于在web端利用程序对远程服务器进行操作,通过PHP_ssh执行shell脚本来实现. 首先要安装php_ssh2组件,linux中centos7下有ssh2源,直接安装.window下 ...
- 服务器使用ssh秘钥登录并禁止密码登录
问题: 最近在登录服务器的时候,每次都会有提示999+ falied login等字眼,意思就是自己的服务器密码正在被人暴力破解.想象以下,别人有了你的服务器的root登录密码,那么就可以对你的服务器 ...
- Java实践 — SSH远程执行Shell脚本(转)
原文地址:http://www.open-open.com/lib/view/open1384351384024.html 1. SSH简介 SSH是Secure Shell的缩写,一 ...
- SSH设置秘钥登录
设置 SSH 通过密钥登录 我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器.但是,一般的密码方式登录,容易有密码被暴力破解的问题.所以,一般我们会将 SSH 的端口设置为默 ...
- 配置SSH使用秘钥登录
使用密码远程登录ssh还是有比较大的风险的,比较安全的方法是使用秘钥登录 配置步骤如下 首先生成秘钥 ssh-keygen (直接默认回车也可以,生成的秘钥和公钥默认防止在/root/.ssh/文件 ...
- Java实践 — SSH远程执行Shell脚本
1. SSH简介 SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议.SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接 ...
- linux普通用户免秘钥登录(xshell工具环境)
一.xshell生成密钥 1)工具->新建用户密钥生成向导 2)选择密钥类型.密钥长度(默认即可) 3)生成密钥(生成公钥和私钥) 4)为密钥加密,增加密码(可选),建议加上 5)将公钥保存为文 ...
随机推荐
- Beta冲刺预备
作业链接 Beta冲刺随笔集 github地址 讨论组长是否重选的议题和结论 在Alpha阶段我们由于没有项目经验,很多技术都仅限于书本上的知识,没有真正实践过,所以出现各种各样的问题,在组长的带领下 ...
- Java并发编程之深入理解线程池原理及实现
Java线程池在实际的应用开发中十分广泛.虽然Java1.5之后在JUC包中提供了内置线程池可以拿来就用,但是这之前仍有许多老的应用和系统是需要程序员自己开发的.因此,基于线程池的需求背景.技术要求了 ...
- 【版本管理】自定义git
Git除了可配置user.name和user.email外,实际上,Git还有很多可配置项. 如 $ git config --global color.ui true,让Git显⽰示颜⾊色,会让命令 ...
- TCP 协议连接与关闭的握手
原文链接 http://blog.csdn.net/oney139/article/details/8103223 TCP头部: 其中 ACK SYN 序号 这三个部分在以下会用到,它们 ...
- nginx “403 Forbidden” 错误的原因及解决办法
nginx 的 403 Forbidden errors 表示你在请求一个资源文件但是nginx不允许你查看. 403 Forbidden 只是一个HTTP状态码,像404,200一样不是技术上的错误 ...
- C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现
C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现 来源 http://blog.csdn.net/Virtual_Func/article/details/4975 ...
- eclipse 安装报错
14 11:17:13] ERROR: org.eclipse.equinox.p2.transport.ecf code=1002 Unable to read repository at http ...
- 数位DP学习笔记
数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...
- 前端学习 -- Css -- display和Visibility
display 将一个内联元素变成块元素,通过display样式可以修改元素的类型.可选值: 1 inline:可以将一个元素作为内联元素显示. 2 block: 可以将一个元素设置块元素显示. 3 ...
- 【codevs1245】最小的 N 个和
题目大意:给定两个有 N 个数字的序列,从这两个序列中任取一个数相加,共有 \(N^2\) 个和,求这些和中最小的 N 个. 题解:由于数据量是 10W,必须减少每次选取的决策集合中元素的个数.可以发 ...