• java 远程调用 shell


    import java.io.BufferedReader;

    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.Properties;
    import java.util.Scanner;
    import java.util.Vector;

    import org.apache.log4j.Logger;

    import com.ecSolutions.ssm.persistence.SshConfiguration;
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.UserInfo;

    /**
    * @author hadoop
    *
    */
    public class VersouSshUtil {

    private ChannelSftp channelSftp;

    private ChannelExec channelExec;

    private Session session = null;

    private int timeout = 60000;

    private static final Logger LOG = Logger.getLogger(VersouSshUtil.class);

    public VersouSshUtil(SshConfiguration conf) throws Exception
    {
    LOG.info("尝试连接到....host:" + conf.getHost() + ",username:" + conf.getUsername() + ",password:" + conf.getPassword() + ",port:" + conf.getPort());
    JSch jsch = new JSch(); // 创建JSch对象
    session = jsch.getSession(conf.getUsername(), conf.getHost(), conf.getPort()); // 根据用户名,主机ip,端口获取一个Session对象
    session.setPassword(conf.getPassword()); // 设置密码
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config); // 为Session对象设置properties
    session.setTimeout(timeout); // 设置timeout时间
    session.connect(); // 通过Session建立链接
    }
    //远程调用shell
    public ArrayList<String> runcommand(String command) {
    File tmpfile = new File(System.getProperty("java.io.tmpdir")+"_cli_output_.log");
    tmpfile.deleteOnExit();
    ArrayList<String> results = new ArrayList<String>();
    try {
    Channel channel=session.openChannel("shell");
    channel.setInputStream(new ByteArrayInputStream(command.getBytes()));
    channel.setOutputStream(new FileOutputStream(tmpfile));
    channel.connect();
    Thread.sleep(10000);
    channel.disconnect();
    session.disconnect();
    Scanner readtmpfile = new Scanner(tmpfile);
    String rtnline;
    while(readtmpfile.hasNext()) {
    rtnline = readtmpfile.nextLine();
    results.add(rtnline);
    System.out.println(rtnline);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return results ;
    }

    public void runCmd(String cmd, String charset)
    {
    Channel channel = null;
    try {
    //创建sftp通信通道
    channel = (Channel) session.openChannel("shell");
    channel.connect(1000);
    //获取输入流和输出流
    InputStream instream = channel.getInputStream();
    OutputStream outstream = channel.getOutputStream();
    //发送需要执行的SHELL命令,需要用 结尾,表示回车
    String shellCommand = cmd;
    // shellCommand="ls ";
    shellCommand=cmd+" ";
    outstream.write(shellCommand.getBytes());
    outstream.flush();
    Thread.sleep(1000);
    //获取命令执行的结果
    if (instream.available() > 0) {
    byte[] data = new byte[instream.available()];
    int nLen = instream.read(data);
    if (nLen < 0) {
    throw new Exception("network error.");
    }
    //转换输出结果并打印出来
    String temp = new String(data, 0, nLen,charset);
    System.out.println(temp);
    }
    outstream.close();
    instream.close();
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    session.disconnect();
    channel.disconnect();
    }
    }

    public void runCmd_old(String cmd, String charset , String filepath) throws Exception
    {
    ChannelSftp channelSftp = (ChannelSftp)session.openChannel( "sftp" );
    Channel channel = (Channel) session.openChannel("shell");
    channelSftp.connect();
    channelSftp.setFilenameEncoding( charset );

    UserInfo uInfo= new localUserInfo();
    session.setUserInfo(uInfo);
    channelExec = (ChannelExec)session.openChannel("exec");
    channelExec.setInputStream(null);
    channelExec.setErrStream(System.err);
    channelExec.setCommand(cmd);
    //channelExec.run();
    channelExec.connect();
    InputStream in = channelExec.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charset.forName(charset)));
    String buf = null;
    while ((buf = reader.readLine()) != null)
    {
    System.out.println(buf);
    }
    reader.close();
    channelExec.disconnect();
    channelSftp.disconnect();
    }

    public void close()
    {
    session.disconnect();
    }

    public class localUserInfo implements UserInfo {
    String passwd;

    public String getPassword() {
    return passwd;
    }

    public boolean promptYesNo(String str) {
    return true;
    }

    public String getPassphrase() {
    return null;
    }

    public boolean promptPassphrase(String message) {
    return true;
    }

    public boolean promptPassword(String message) {
    return true;
    }

    public void showMessage(String message) {

    }
    }
    }

  • 相关阅读:
    WPF自定义控件
    NPOI设置Excel单元格字体、边框、对齐、背景色
    关于StreamReader.ReadToEnd方法
    ASP.NET Core Web多语言项目
    docker与虚拟机的区别
    C# Task.Run 和 Task.Factory.StartNew 区别
    MVC的SignalR例子
    深圳游玩攻略
    一个域名下多个Vue项目
    Linq的执行效率及优化
  • 原文地址:https://www.cnblogs.com/leiyf/p/5849185.html
Copyright © 2020-2023  润新知