首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java expectj通过跳转框执行linux命令

Java expectj通过跳转框执行linux命令
EN

Stack Overflow用户
提问于 2018-02-06 15:29:33
回答 1查看 115关注 0票数 0

我需要自动化一些linux控制台任务。这些框可以通过基于ssh密码的身份验证来访问。

我有我的本地机器(A)。一个linux跳箱(B)。和一个linux生产箱(C)。方框"C“只能从跳转方框进入。跳转框和生产框没有java或Expect模块。因此,我选择在本地机器"A“上执行自动化。

我尝试使用下面的方法通过框"B“在框"C”上执行命令。但它并没有起作用。

代码语言:javascript
复制
spawn.send("ssh " + strDestinUser + "@" + strDestinHost + " \"echo hello world | awk '{print \$1}'\"" + "\n");
spawn.expect("password:");
spawn.send(strDestinPass + "\n");

我的完整代码块如下

代码语言:javascript
复制
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.security.Security;
import java.util.Properties;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import expectj.ExpectJ;
import expectj.Spawn;
import expectj.TimeoutException;

public class App {

    public static void main(String[] args) {
        App objApp = new App();

        String strJumpHost = "127.234.123.12";
        String strJumpUser = "root_jump";
        String strJumpPwd = "passforjump";

        objApp.sshExecPassword(strJumpHost, strJumpUser, strJumpPwd);
    }

    public void sshExecPassword(String host, String USERNAME, String PASSWORD) {
        App objApp = new App();
        int port = 22;
        try {

            JSch jsch = new JSch();

            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");

            Session session = jsch.getSession(USERNAME, host, port);
            session.setConfig(config);
            session.setConfig("PreferredAuthentications", "keyboard-interactive,password"); // Skip
                                                                                            // kbros
                                                                                            // authentication

            Security.insertProviderAt(new BouncyCastleProvider(), 1);
            session.setPassword(PASSWORD);
            session.connect();

            Channel channel = session.openChannel("shell");

            objApp.expectExec(channel);

            session.disconnect();

            System.out.println("Script completed");

        } catch (Exception e) {
            System.out.println("SSH connection failed");
            final StringWriter sw = new StringWriter();
            final PrintWriter pw = new PrintWriter(sw, true);
            e.printStackTrace(pw);
            System.out.println(sw.getBuffer().toString());
            System.exit(0);
        }
    }

    public void expectExec(Channel channel) {
        App objApp = new App();

        try {
            ExpectJ ex = new ExpectJ(30);
            Spawn spawn = ex.spawn(channel);

            String strDestinUser = "destin_user";
            String strDestinPass = "destin_pass";

            String strDestinHost = "127.45.23.12";

            spawn.send("cd /var/www/html/poc/" + "\n");
            spawn.send("ssh " + strDestinUser + "@" + strDestinHost + "" + "\n");
            spawn.expect("password:");
            spawn.send(strDestinPass + "\n");
            spawn.send("sh /var/www/html/poc/expect.sh" + "\n");
            spawn.send("\n");
            spawn.send("exit\n");

            spawn.send("ssh " + strDestinUser + "@" + strDestinHost + " \"echo hello world | awk '{print \$1}'\"" + "\n");
            spawn.expect("password:");
            spawn.send(strDestinPass + "\n");
            spawn.send("\n");
            spawn.send("exit\n");

            String lsResults = spawn.getCurrentStandardOutContents();

            objApp.writeFile(lsResults);

            String[] lsRows = lsResults.split("\r\n");
            for (int i = 0; i < lsRows.length; i++) {
                System.out.println(i + ":" + lsRows[i]);
            }

            spawn.send("exit\n");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }

    public void writeFile(String strContent) {
        File fout = new File("out.txt");
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(fout);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
        try {
            bw.write(strContent);
            bw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

如何通过跳线盒"B“执行linux命令来生产"C”盒?以及如何获得输出到java变量?

EN

回答 1

Stack Overflow用户

发布于 2019-06-07 20:57:31

你的问题很老了,但我宁愿使用端口转发通过B打开从您的机器A到C的隧道。这可以通过使用Session.setPortForwardingL来完成,然后通过SSHing打开到您的本地端口的到C的“直接”连接,并通过此连接发送命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48637646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档