某些Unix命令在通过使用JSch的Java执行时(即使启用了setPty)也会以“… not found”失败

我正在创build一个android应用程序,将命令发送到设备上的linuxterminal。 当使用“ls”命令时,我能够得到正确的输出,但是当我使用“ifconfig”或“iwconfig”时,设备不会给出任何输出。 使用Tera Term,我已经validation了这些命令的工作。 我试过包括((ChannelExec)channel).setPty(true); 为了解决这个问题,terminal仍然看不到命令​​。 添加这行代码还会将“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; } } 

当我input时,我的android应用程序在其活动中会收到一个空string

iwconfig的

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

灰:iwconfig:未find
退出状态:127

我得到了类似的结果

使用ifconfig

((ChannelExec)channel).setPty(true);输出“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 / ifconfigls命令?

Solutions Collecting From Web of "某些Unix命令在通过使用JSch的Java执行时(即使启用了setPty)也会以“… not found”失败"

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

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

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

 which ifconfig 

对于类似的问题,请参阅某些Unix命令在通过Java使用JSch执行时发生“… not found”失败 。