加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

秘钥登录服务器执行shell脚本

发布时间:2020-12-15 06:39:42 所属栏目:Java 来源:网络整理
导读:做自动化的时候,有时候避免不了要和服务器有互动,刚巧碰上一个项目,需要执行命令才能完成本次测试。 昨天遇到的是秘钥形式的,只有秘钥和用户名,百度找了许久也没有思路,(能账号密码登录服务器的还简单些),后来看到一篇博文,受到启发,把他的代码改

做自动化的时候,有时候避免不了要和服务器有互动,刚巧碰上一个项目,需要执行命令才能完成本次测试。

昨天遇到的是秘钥形式的,只有秘钥和用户名,百度找了许久也没有思路,(能账号密码登录服务器的还简单些),后来看到一篇博文,受到启发,把他的代码改了又改,结果还真行了

代码如下:

import com.jcraft.jsch.*;
import org.slf4j.LoggerFactory;
 java.io.BufferedReader;
 java.io.IOException;
 java.io.InputStream;
 java.io.InputStreamReader;
 java.nio.charset.Charset;
 java.util.Properties;

/**
 * @author 
 *    秘钥形式登录服务器执行shell脚本操作
 */
public class ExecuteShellWithKey {

    
     * slf4j
     */

    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ExecuteShellWithKey.);
    private Session session;

    
     * 远程连接Linux 服务器 执行相关的命令
     *
     * @param keyFile    秘钥文件
     *  userName   用户名
     *  passphrase 重置后密码
     *  host       主机ip
     *  cmd        执行shell调用命令
     * @throws JSchException
     *  IOException
     */
    void runShell(String keyFile,String userName,String passphrase,String host,String cmd) {
        if (!connect(keyFile,userName,passphrase,host)) {
            return;
        }
        ChannelExec channelExec = null;
        BufferedReader reader = ;
        try {
            channelExec = (ChannelExec) session.openChannel("exec");
            channelExec.setCommand(cmd);
            channelExec.setInputStream();
            channelExec.setErrStream(System.err);
            channelExec.connect();
            InputStream in = channelExec.getInputStream();
            reader = new BufferedReader(new InputStreamReader(in,Charset.forName("UTF-8")));
            String buf = ;
            StringBuffer sb = new StringBuffer();
            while ((buf = reader.readLine()) != ) {
                sb.append(buf);
                // 输出每个命令执行后,返回数据
                logger.info(sb.toString());
            }
        } catch (JSchException e) {
            e.printStackTrace();
        }  (IOException e) {
            e.printStackTrace();
        } finally {
             {
                if (reader != ) {
                    reader.close();
                }
            }  (IOException e) {
                e.printStackTrace();
            }
            if (channelExec != ) {
                channelExec.disconnect();
            }
            if (null != session) {
                session.disconnect();
            }
        }
    }

    
     * 连接到指定的HOST
     *
     *  keyFile
     *  userName
     *  passphrase
     *  host
     *  JSchException
     boolean connect(String keyFile,String host) {
         创建JSch对象
        JSch jsch =  JSch();
         引入秘钥文件       
            jsch.addIdentity(keyFile);
             根据用户名,主机ip,端口获取一个Session对象
            session = jsch.getSession(userName,host,22);
            UserInfo ui =  MyUserInfo(passphrase);
            session.setUserInfo(ui);
             设置密码
            session.setPassword(passphrase);
            Properties config =  Properties();
            config.put("StrictHostKeyChecking","no");
             为Session对象设置properties
            session.setConfig(config);
            int timeout = 60000000;
             设置timeout时间
            session.setTimeout(timeout);
             通过Session建立链接
            session.connect();
        }  (JSchException e) {
            e.printStackTrace();
            logger.error("connect error !"return false;
        }
        true;
    }

    class MyUserInfo implements UserInfo {
        private String passphrase = ;

        public MyUserInfo(String passphrase) {
            this.passphrase = passphrase;
        }

         String getPassphrase() {
             String getPassword() {
            ;
        }

         promptPassphrase(String s) {
             promptPassword(String s) {
             promptYesNo(String s) {
             showMessage(String s) {
            logger.info(s);
        }
    }
}

?

要是觉得对你有帮助,并且解决了你的问题,麻烦请高抬你发财的贵手,在评论给我个赞即可。。。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读