当前位置: 首页 > 知识库问答 >
问题:

使用jsch ssh在shell中逐个执行ssh命令

刘建中
2023-03-14

我试图在unix中使用JSCHSSH类(com.jcraft.jsch)执行一些工具。我的工具有一个选择菜单。我需要转到工具所在的文件夹,执行它并选择请求的选项。在每个命令之后,(cd,execute,…)我希望检查输出并检查状态代码(0/1)。我有下面的代码按预期执行它,但在这段代码中,我找不到一种方法来检查每个命令后的输出。

Session session = _getConnectedSession(); 
Channel channel = session.openChannel("shell");
channel.connect();

InputStream is = channel.getInputStream();
BufferedReader dataIn = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream());  

// send ls command to the server  
enter code here dataOut.writeBytes("cd tools; run tool\n");  
dataOut.writeBytes("4\r\n");  // option 4 in the tool
dataOut.writeBytes("4\r\n");  // then, option 4 in the tool
dataOut.writeBytes("6\r\n");  // then, option 6 in the tool
dataOut.writeBytes("n\r\n");  // then, option n in the tool
dataOut.flush();
String line = dataIn.readLine();

while ((line = dataIn.readLine()) != null) {
    System.out.println(line);
}

if(channel.isClosed()){
    system.out.println("exit-status: "+channel.getExitStatus());       
}

dataIn.close();  
dataOut.close();  
channel.disconnect();  
session.disconnect();

我无法找到一种方法,但我怎么能分开的命令,并打印他们一个接一个(在同时循环),而不是像我上面所做的。

我尝试将所有命令拆分为两个块,如下所示,但它只打印并执行第一个块(在第一个while循环之前):

// First bulk of commands
enter code here dataOut.writeBytes("cd tools; run tool\n");  
dataOut.writeBytes("4\r\n");  // option 4 in the tool
dataOut.writeBytes("4\r\n");  // then, option 4 in the tool
dataOut.flush();

String line = dataIn.readLine();
while ((line = dataIn.readLine()) != null) {
    System.out.println(line);
}

// Second bulk of commands
dataOut.writeBytes("6\r\n");  // then, option 6 in the tool
dataOut.writeBytes("n\r\n");  // then, option n in the tool
dataOut.flush();
line = dataIn.readLine();
while ((line = dataIn.readLine()) != null) {
    System.out.println(line);
}


if(channel.isClosed()){
    system.out.println("exit-status: "+channel.getExitStatus());       
}

我做错什么了吗?

共有1个答案

张嘉佑
2023-03-14

首先,您没有设置输出流,要检查最后执行的命令的退出状态,您必须使用

"$?" - 如果为0,则最后执行的命令成功,否则为失败。

下面的代码段允许您发出命令并读取该命令的响应代码

                ss=new StringBuilder("ls | echo $?");
                ss.append("\n");
                FileWriter fw = new FileWriter("comm.txt");
                BufferedWriter bw = new BufferedWriter(fw);
                bw.write(ss.toString());
                bw.flush();
                fw.close();
                bw.close();
                InputStream is=new FileInputStream("comm.txt");
                OutputStream os=new FileOutputStream("outs.txt");   
                channel.setInputStream(is);
                channel.setOutputStream(os);
                Thread.sleep(1000);
                channel.connect();
                System.out.println("connected");
                f.dispose();
                getApplication();

在上面的代码中,我使用“comm.txt”作为输入流,“outs.txt”作为输出流。可以使用Scanner类更改stringBuilder对象的内容。

ls|回声$?"

如果ls成功执行,则将生成0,否则为非零值。此值可以签出。txt文件。

如果内容不完整。txt文件为0。命令执行正确,否则无法正确执行。您必须编写代码才能从输出中读取内容。txt文件。

如果你想要完整的代码,你可以看到我的项目

github

在该文件中,请参阅“Cloud.java”文件以获取完整代码。

 类似资料:
  • 问题内容: 我正在编写一个脚本来自动化Python中的某些命令行命令。目前,我正在打电话: 但是我需要在远程计算机上运行一些命令。手动地,我将使用ssh登录,然后运行命令。我将如何在Python中自动执行此操作?我需要使用(已知)密码登录到远程计算机,所以我不能只使用,我想知道是否应该使用一个模块? 问题答案:

  • 问题内容: 我使用的朋友服务器仅允许一个用户从SSH登录,因此通常我只是以该用户身份登录,然后执行更改帐户的操作。我想使用Python自动执行一些无聊的工作,但是我遇到了问题。显然,我首先尝试过的Paramiko模块为每个命令调用了一个shell,所以这是不可能的。后来我尝试使用克服它,但是仍然失败了(我想是因为更改用户也会更改shell)。 之后,我发现了有关Fabric模块的信息,但最好的办法

  • 问题内容: 我正在寻找在Go中执行shell命令,并在程序中以字符串形式获取结果输出。我看到了Rosetta Code 版本: 但这并不能以我可以通过编程方式访问的方式捕获实际的标准或错误-那些仍会打印到常规的stdout / stderr。我看到使用Pipe作为out或err可以在其他地方提供帮助,但是没有如何执行此操作的示例。有任何想法吗? 问题答案: 该答案不代表Go标准库的当前状态。请查看

  • 我有一个案例,我想问我可以解决与Spring壳。我有一个Main.jar应用程序,它有几个部署在Wildly服务器上的Spring任务。在我的例子中,我不能停止或重新部署main.jar,因为必须不停地提供服务。

  • 你可以不离开gdb,直接执行shell命令,比如: (gdb) shell ls 或 (gdb) !ls 这里,"!"和命令之间不需要有空格(即,有也成)。 特别是当你在构建环境(build目录)下调试程序的时候,可以直接运行make: (gdb) make CFLAGS="-g -O0" 详情参见 gdb手册

  • 问题内容: 我在ShoreTel语音开关上遇到问题,并且尝试使用Paramiko跳入并运行一些命令。我认为问题可能是,ShoreTel CLI给出的提示与标准Linux不同。它看起来像这样: Python是否仍在期待它,还是我还缺少其他东西? 我认为这可能是一件时事,所以我将它们放在命令之间。似乎仍然没有采取。 从成功执行此代码中,我期望的级别是1。这意味着当我通过SSH进入东西时,我会看到那些H