当使用 JSch 通过 Java 执行时,即使启用了 setPty,某些 Unix 命令也会失败并显示“...未找到”

2023-12-14

我正在创建一个 Android 应用程序,它将命令发送到设备上的 Linux 终端。使用“ls”命令时我能够获得正确的输出,但是当我使用“ifconfig”或“iwconfig”时设备不会给我任何输出。使用 Tera Term,我已经验证这些命令确实有效。我尝试过包括((ChannelExec)channel).setPty(true);为了解决这个问题,但是终端似乎仍然无法识别该命令。添加该行代码还会将“ls”命令的输出更改为我无法识别的内容。

这是我的 JSch 代码:

package com.example.riot94.whizpacecontroller;
import android.os.AsyncTask;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
/**
 * Created by riot94 on 1/6/2017.
 */

public class JSchConnectionProtocol extends AsyncTask<String, Void, String>{
    private String host;
    private String user;
    private String password;

    public JSchConnectionProtocol(String h, String u, String p){
        host = h;
        user = u;
        password = p;
    }

    @Override
    protected String doInBackground(String... command) {
        String output = "";
        try{
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            JSch jsch = new JSch();
            Session session=jsch.getSession(user, host, 22);
            session.setPassword(password);
            session.setConfig(config);
            session.setTimeout(10000);
            Log.d("CONNECTION", "Attempting to connect to " + host + " as user: " + user);
            session.connect();
            Log.d("CONNECTION", "Connected to " + host + " as user: " + user);

            Channel channel=session.openChannel("exec");
            ((ChannelExec)channel).setPty(true);
            ((ChannelExec)channel).setCommand(command[0]);
            channel.setInputStream(null);
            ((ChannelExec)channel).setErrStream(System.err);

            output = printOutputAfterXMilliSeconds(channel,1000);

            channel.disconnect();
            session.disconnect();
            Log.d("DONE","DONE");
        }catch(Exception e){
            e.printStackTrace();
        }
        return output;
    }

    private String printOutputAfterXMilliSeconds(Channel channel, int ms) throws IOException, JSchException {
        InputStream in=channel.getInputStream();
        channel.connect();
        String totalOutput = "";
        byte[] tmp=new byte[1024];
        while(true){
            while(in.available()>0){
                int i=in.read(tmp, 0, 1024);
                if(i<0)break;
                String output = new String(tmp, 0, i);
                totalOutput += output;
                Log.d("OUTPUT", output);
            }

            if(channel.isClosed()){
                Log.d("EXIT_STAT","exit-status: "+channel.getExitStatus());
                break;
            }

            try{
                Log.d("PRE-SLEEP","About to sleep");
                Thread.sleep(ms);
                //channel.sendSignal("2");
                Log.d("POST-SLEEP","Slept and woken");
            }catch(Exception ee){
                ee.printStackTrace();
                channel.disconnect();
            }
        }
        return totalOutput;
    }

}

当我输入时,我的 Android 应用程序在其活动中收到一个空字符串

iwconfig

without ((ChannelExec)channel).setPty(true);。有了它,我的输出是:

灰:iwconfig:未找到
退出状态:127

我得到了类似的结果

ifconfig

我的“ls”命令的输出((ChannelExec)channel).setPty(true);:

[1;34mGUI[0m                            [1;32mmeter.sh[0m
[1;32mReadme4Gui[0m                     [0;0mmeter_iplist.txt[0m
[1;32mami_concentrator_ETH_20120413[0m  [0;0mmeter_list.txt[0m
[1;32mami_demo_qingjun[0m               [0;0mroute.sh[0m
[1;32mami_festtech[0m                   [1;32mscript.sh[0m
[1;32mami_mac[0m                        [1;32msetGateway.sh[0m
[1;32mami_qingjun[0m                    [1;32mspectrmgmt[0m
[1;32mbootup.sh[0m                      [1;32msystem.sh[0m
[1;32mconcentrator.sh[0m                [1;32mtemp1.sh[0m
[1;32mdisFreq.sh[0m                     [1;32mtest.sh[0m
[1;32mdisLinkQuality.sh[0m              [1;32mtest1.sh[0m

我的“ls”命令的输出没有((ChannelExec)channel).setPty(true);:

GUI
Readme4Gui
ami_concentrator_ETH_20120413
ami_demo_qingjun
ami_festtech
ami_mac
ami_qingjun
bootup.sh
concentrator.sh
disFreq.sh
disLinkQuality.sh
meter.sh
meter_iplist.txt
meter_list.txt
route.sh
script.sh
setGateway.sh
spectrmgmt
system.sh
temp1.sh
test.sh
test1.sh

我不确定我做错了什么,如何解决这个问题,以便我可以获得正确的输出iwconfig/ifconfig and ls命令?


您的服务器/外壳以某种方式配置错误。它没有设置PATH当 shell 会话未启动时正确。这就是为什么ifconfig/iwconfig找不到二进制文件。

修复您的启动脚本以设置PATH在所有情况下都正确。或者使用完整路径ifconfig/iwconfig.

要查找完整路径,请使用 SSH 客户端打开常规 shell 会话并键入:

which ifconfig

对于类似的问题,请参阅当使用 JSch 通过 Java 执行时,某些 Unix 命令会失败并显示“...未找到”.

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

当使用 JSch 通过 Java 执行时,即使启用了 setPty,某些 Unix 命令也会失败并显示“...未找到” 的相关文章

  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 如何使用 Maven 打包并运行具有依赖项的简单命令行应用程序?

    我对 java 和 Maven 都是全新的 所以这可能非常简单 如果我遵循maven2hello world此处的说明 http maven apache org guides getting started maven in Five m
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的

随机推荐

  • Visual C++ Express 如何运行该应用程序?

    我不知道如何在 Visual C Express 中运行应用程序 调试选项就在那里 但是运行应用程序怎么样 我检查了上面的每个按钮 并右键单击了所有可以单击的按钮 但我没有看到运行它的选项 无需调试 我不介意调试 但我丢失了 main 正在
  • 如何从非托管代码使用托管代码?

    如何从本机 C 非托管代码 调用 NET 代码 我想将 NET 代码公开给我的非托管 C 应用程序 然后使用它们 更具体地说 我想从本机 C 调用 C 我知道有很多方法 但你能告诉我每种方法的优缺点吗 顺便问一下 我不想使用 COM 那么现
  • 去除空格/制表符/换行符 - python

    我正在尝试删除 Linux 上 python 2 7 中的所有空格 制表符 换行符 我写了这个 应该可以完成这项工作 myString I want to Remove all white t spaces new lines n and
  • 尝试对 Django 应用进行 dockerize,Docker 找不到 ft2build.h

    我是 Docker 新手 我正在尝试对 Django 应用程序进行 dockerize 但是当我运行时docker build t sometag 我收到以下错误 9 23 05 Preparing metadata setup py st
  • 接收离线消息mqtt

    我使用 mosquitto 作为代理 使用 paho python 作为客户端 我正在尝试让订阅者接收离线消息 为此我做了以下更改 固定客户端 ID 服务质量级别 2 但是 订阅者仍然无法接收消息 有什么帮助吗 谢谢 拉胡尔 为了让您的客户
  • R 中的分层对数秩检验用于计算流程表单数据?

    背景 在 4 年的半年随访时间中 患者可能会切换到不同的药物组 为了解决这个问题 我将生存数据转换为计数过程形式 我想比较药物组 A B 和 C 的生存曲线 我正在使用扩展的 Cox 模型 但想要对每个风险函数进行成对比较或进行分层对数秩检
  • 在 R 中为 xml2::xml_text() 设置 XML_PARSE_HUGE 选项

    我读过这个问题在 R 中解析 XML 文件 gt 1 MB 这个答案似乎只适用于原来的XMLR 中的包 如何设置此选项xml2 这是我正在运行的代码 library xml2 library magrittr rawXML lt read
  • 我需要为特定的用户代理编写一个网络爬虫

    我需要编写一个网络爬虫 并且希望能够使用已知的用户代理进行爬网 例如 我希望我的爬虫充当iphone来爬取某个网站的移动站点 然后使用Mozilla PC代理再次爬取 等等 这样 我就能够抓取每种 类型 的网站 移动和 PC 但是 我还希望
  • C#中有“之间”函数吗?

    谷歌不明白 Between 是我正在寻找的函数的名称 并且没有返回任何相关内容 例如 我想仅通过一次操作检查 5 是否在 0 到 10 之间 目前尚不清楚 一次操作 是什么意思 但是不 我知道没有运算符 框架方法来确定某个项目是否在范围内
  • equals 方法适用于对象吗?如果是这样,怎么办?

    我有一个动物园程序 动物园里有爬行动物的分支动物亚群 当我执行 equals 方法时 主程序将编译并运行 我很困惑 如果我比较对象而不是专门比较 int 或 String java 如何知道使用 equals 方法 public class
  • 在Android中启动Activity清除顶部

    我的堆栈中有以下活动 A B C D 我想重新启动 B 以获得此堆栈 A B 其中 B 是一个新的 B 实例 不是接收 onNewIntent 回调的旧实例 我该怎么做 顺便说一句 我正在使用 intent setFlags Intent
  • 某些项目无法导入,因为它们已存在于 Eclipse 中的工作区错误

    我正在尝试导入我和我的同事一直在处理的项目 并在选择 导入 然后 导入现有项目 然后单击存档文件 然后单击下一步后不断收到此错误 出现这个错误 有些项目无法导入 因为它们已经存在于 工作区 取消选中 将项目复制到工作区 复选框 然后单击 刷
  • PresentModalViewController:animated 上的不同转换:

    我提出了一个模态视图控制器 它是一个标签栏控制器 里面有一个导航控制器 问题是我的第一个视图有黑色背景 我希望新视图有白色背景 这意味着我要么必须拥有具有透明背景的模态视图控制器 直到其显示白色背景时完成 向上滑动 动画 要么我必须将导航控
  • C# 中#region 和#endregion 有什么用?

    给我一个例子 如果我使用或不使用这个块 我可以实现什么目标 起始区域后面的名称有什么用 region MyClass definition Some code endregion 没有 技术 理由使用 Region 它唯一做的就是提供一种折
  • Java SGML 到 XML 的转换?

    有谁知道将 SGML 转换为 XML 的方法或库 编辑 为了澄清 我必须在 Java 中进行转换 并且我不能使用 SP 解析器或相关的 SX 工具 似乎普遍的共识是 没有现有的库可以在 Java 中执行 SGML 工作 当然 经过几天毫无结
  • 为什么我们不能在 setTimeout 上调用并应用?

    为什么我们不能调用并应用 setTimeout var obj window setTimeout call obj callback delay it throws error stating illegal invocation 使用起
  • 致命:此操作必须在工作树中运行[重复]

    这个问题在这里已经有答案了 当我尝试更改分支时出现此错误 也许我会在以下位置提供一些命令信息 path to git repo 根据命令 git branch 我得到以下输出 V1 5 V2 0 master 当我尝试命令时 git che
  • PHP自动下载文件而不提示保存或打开文件

    我有一个函数 用于从非公共目录下载文件 下载部分工作正常 只是它之前没有提示用户并允许用户选择位置或只是简单的打开 我使用以下代码 file L APP BILAGOR GET f finfo new finfo FILEINFO MIME
  • 如何从命令行覆盖 `project.build.finalName` Maven 属性?

    我有以下由 Maven 3 0 4 运行的普通 pom
  • 当使用 JSch 通过 Java 执行时,即使启用了 setPty,某些 Unix 命令也会失败并显示“...未找到”

    我正在创建一个 Android 应用程序 它将命令发送到设备上的 Linux 终端 使用 ls 命令时我能够获得正确的输出 但是当我使用 ifconfig 或 iwconfig 时设备不会给我任何输出 使用 Tera Term 我已经验证这