秘钥登录服务器执行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);
}
}
}
要是觉得对你有帮助,并且解决了你的问题,麻烦请高抬你发财的贵手,在评论给我个赞即可。。。
EOF
本文作者:久曲建的测试窝 本文链接:https://www.cnblogs.com/longronglang/p/8192190.html 关于博主:评论和私信会在第一时间回复。或者直接私信我。 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力! 优秀不够,你是否无可替代
软件测试交流QQ群:721256703,期待你的加入!!
欢迎关注我的微信公众号:软件测试君