通过 JSch shell 执行多个命令

2023-12-23

我试图使用 JSch 库通过 SSH 协议执行多个命令。但我似乎陷入困境,找不到任何解决方案。这setCommand()方法每个会话只能执行单个命令。但我想像Android平台上的connectbot应用程序一样顺序执行命令。到目前为止我的代码是:

package com.example.ssh;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

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

public class ExampleSSH extends Activity {
    /** Called when the activity is first created. */
    EditText command;
    TextView result;
    Session session;
    ByteArrayOutputStream baos;
    ByteArrayInputStream bais;
    Channel channel;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bais = new ByteArrayInputStream(new byte[1000]);
        command = (EditText) findViewById(R.id.editText1);
        result  = (TextView) findViewById(R.id.terminal);
    }

    public void onSSH(View v){
        String username = "xxxyyyzzz";
        String password = "aaabbbccc";
        String host     = "192.168.1.1"; // sample ip address
        if(command.getText().toString() != ""){
            JSch jsch = new JSch();
            try {
                session = jsch.getSession(username, host, 22);
                session.setPassword(password);

                Properties properties = new Properties();
                properties.put("StrictHostKeyChecking", "no");
                session.setConfig(properties);
                session.connect(30000);

                channel = session.openChannel("shell");
                channel.setInputStream(bais);
                channel.setOutputStream(baos);
                channel.connect();

            } catch (JSchException e) {
                // TODO Auto-generated catch block
                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
        else{
            Toast.makeText(this, "Command cannot be empty !", Toast.LENGTH_LONG).show();
        }
    }

    public void onCommand(View v){
        try {
            bais.read(command.getText().toString().getBytes());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        baos = new ByteArrayOutputStream();
        channel.setOutputStream(baos);
        result.setText(baos.toString());

    }
}

该代码似乎已连接到服务器,但我认为输入和输出数组缓冲区存在一些问题,因为根本没有输出。有人可以指导我如何正确处理服务器的输入和输出以获得所需的输出吗?


如果您不必区分各个命令的输入或输出,Aaron 的答案(给出一行中的所有命令,用\n or ;)很好。

如果您必须单独处理它们,或者在前面的命令完成之前不知道后面的命令:您可以打开多个exec-频道 http://epaul.github.com/jsch-documentation/simple.javadoc/index.html?com/jcraft/jsch/ChannelExec.html在同一个会话(即连接)上,一个接着一个(即在前一个会话关闭之后)。每个人都有自己的命令。 (但他们不共享环境,所以cd第一个命令中的命令对后面的命令没有影响。)

您只需小心地拥有Session http://epaul.github.com/jsch-documentation/simple.javadoc/index.html?com/jcraft/jsch/Session.html对象周围,而不是为每个命令创建一个新对象。

另一种选择是外壳通道 http://epaul.github.com/jsch-documentation/simple.javadoc/index.html?com/jcraft/jsch/ChannelShell.html,然后将各个命令作为输入传递到远程 shell(即通过流)。但是,您必须注意不要将一个命令的输入与下一个命令混合(即,只有当您知道这些命令正在做什么,或者您有一个交互式用户可以同时提供该命令的输入和下一个命令,并知道何时使用哪个命令。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 JSch shell 执行多个命令 的相关文章

随机推荐

  • ng-grid 如何在最后一行的列单元格中显示/隐藏按钮

    我有一个 ng grid 表 其中一列 Defs 有一个单元格模板来显示图标 目前图标显示在所有行中 谁能帮助我如何显示 ng grid 中最后一行的图标 我尝试使用ng show last 并没有奏效 scope reasonsGrid
  • Gradle 无法 HEAD https://..pom > 对等点未经过身份验证

    当您从 gradle 2 0 升级到 2 1 时 您可能会看到以下错误 Could not HEAD https jcenter bintray com de undercouch gradle download task 1 0 grad
  • 基于 ASP.NET WebAPI 控制器生成 JS 客户端

    在使用 RESTful API 的现代 Web 项目中 我们经常看到像下面这样的 AJAX 调用散布在我们的 JavaScript 文件中 ajax type POST url myapp baseUrl Api Note data ko
  • 将 JSON 反序列化为类

    服务器返回 JSON 的以下部分 condition or and operand a operator value true not operand b operator
  • Flutter,如何创建嵌入文本的边框?

    有谁知道如何创建顶部带有文本的边框 如下所示 创建帐户 Stack children
  • SKSpriteNode 隐藏在父节点下方

    使用 Swift 和 SpriteKit 我遇到了当将 SKSpriteNode 作为子项添加到另一个 SKSpriteNode 时未显示的问题 相比之下 放置在完全相同位置的 SKLabelNode 确实会出现 does not show
  • Javascript - onerror 事件在 Firefox 中不起作用

    img src 这个非常简单的 onerror 事件处理程序会在找不到图像时隐藏图像 它在 Chrome 中按预期工作 但在 Firefox 中 它什么也不做 这是一个 jsFiddle 您可以尝试在 Chrome 和 Firefox 中运
  • 在flutter中将小部件封装在它自己的类中?

    我正在尝试创建一个tile for my listview 虽然图块在放置在列表视图文件中时可以工作 但我想知道如何封装tile小部件到它自己的类文件中 具体来说 如果tile对象不接受参数 我可以简单地扩展一个无状态小部件并调用build
  • 通过 CSS 属性“transform:scale(0.5)”进行缩放的 Angular CDK 拖放无法按预期工作

    通过 CSS 属性 transform scale 0 5 进行缩放的 Angular CDK 拖放无法按预期工作 如果外层 DIV 按 CSS 属性缩放 变换 比例 0 5 拖动与鼠标指针未正确对齐 一旦标度不等于 1 就会发生这种情况
  • 法拉第超时

    我已经在线搜索了文档和其他地方 似乎无法想出为法拉第设置超时选项的正确方法 有人有答案吗 我试过了 conn FaradayStack build url conn headers user agent AppConfig user age
  • 使用Phantom.js评估,如何获取页面的HTML?

    page evaluate function return document function result console log result next 结果实际上是一个巨大的物体 我不知道该对象的属性和属性 我只想要页面的 HTMLa
  • R 中 3 个分类变量和 1 个连续变量的 SE 点图

    我正在尝试生成一个点图 其中包含具有三个分类变量 mea tre 和 sex 的设计中单个测量值 len 的值 I ve produced a plot that has all I m looking for split across s
  • Google 地图 v3:大尺寸标记

    我需要在地图上显示标记 它运行良好 唯一的问题是它们看起来太小了 如何确保所使用的标记尺寸较大并且几乎在任何缩放状态下都可以看到 为了使图标更大 我绝对建议使图标图像更大 例如 要使用缩小的高分辨率图标修复高 dpi 移动设备上的像素图标
  • 打开 Storyboard 时 Xcode 8 挂起/无响应

    我最近升级到了 Xcode 8 并将我的项目更新到了 Swift 3 一段时间内一切都运行良好 故事板加载一直很慢 即使仍然运行 Xcode 7 并且与 Xcode 8 几乎一样 慢 我一直以为这是因为我使用的是较旧的 2011 年末 Ma
  • git-log 和 git-whatchanged 之间的区别?

    Given 这个答案 https stackoverflow com a 280140 10608另一个问题 以及 鉴于两者的手册页git log http linux die net man 1 git log and git whatc
  • 字符串文字作为方法的参数

    Java 中的任何字符串文字都是类型的常量对象String并存储在字符串文字池中 Will String作为参数传递给方法的文字也存储在String文字池 例如当我们写的时候 System out println Hello OR anyo
  • Bootstrap3 Affix 中的 data-offset-bottom

    我想从我的附加元素中设置 停止 例如投票http 9gag com http 9gag com 它滚动直到其父容器 我为此使用了affix 我发现了 data offset bottom 属性 没有太多记录 div class homepa
  • IE JQuery 就绪功能不起作用

    显然很多人都遇到过这个问题 但我还没有找到有效的解决方案 我有一些代码需要在页面加载后运行 因此我将其粘贴在以下块中 document ready function alert Running initialization initiali
  • 使用端口 80 时 Apache 服务失败(“繁忙”)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何配置 Apache 服务器在端口 80 上运行 我的 Apache 服务在使用端口 80 时失败 它说BUSY 当我将配置中的端口更改
  • 通过 JSch shell 执行多个命令

    我试图使用 JSch 库通过 SSH 协议执行多个命令 但我似乎陷入困境 找不到任何解决方案 这setCommand 方法每个会话只能执行单个命令 但我想像Android平台上的connectbot应用程序一样顺序执行命令 到目前为止我的代