秘钥登录服务器执行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); } } }
要是觉得对你有帮助,并且解决了你的问题,麻烦请高抬你发财的贵手,在评论给我个赞即可。。。
优秀不够,你是否无可替代
软件测试交流QQ群:721256703,期待你的加入!!
欢迎关注我的微信公众号:软件测试君

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库