Java 无法从命令获取响应(使用JSch)
我正在尝试从通过ssh发送的命令中获取响应。我使用jschlib进行连接。已建立连接,但未从发送的命令获得响应Java 无法从命令获取响应(使用JSch),java,android,jsch,Java,Android,Jsch,我正在尝试从通过ssh发送的命令中获取响应。我使用jschlib进行连接。已建立连接,但未从发送的命令获得响应 public void openSSH( String username, String password, String hostname, int port) throws Exception { JSch jsch = new JSch(); Session session = jsch.
public void openSSH(
String username,
String password,
String hostname,
int port) throws Exception {
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, 22);
this.session = session;
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
}
public String runCommand(String command) throws Exception {
// SSH Channel
ChannelExec channelssh = (ChannelExec) session.openChannel("exec");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream in = channelssh.getInputStream();
channelssh.setOutputStream(baos);
// Execute command
channelssh.setCommand(command);
channelssh.connect();
System.out.println("Unix system connected...");
byte[] tmp = new byte[1024];
while (true){
while (in.available() > 0) {
Log.v("running", "line"); // won't work
int i = in.read(tmp, 0, 1024);
if (i < 0) {
break;
}
String line = new String(tmp, 0, i);
System.out.println("Unix system console output: " +line);
channelssh.disconnect();
}
}
}
private class AsyncTaskOne extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
try {
openSSH("login", "pass", "10.10.10.80", 22 );
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
protected void onPostExecute(Boolean value) {
if (value) {
try {
runCommand("ls -llh");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public-void-openSSH(
字符串用户名,
字符串密码,
字符串主机名,
int端口)引发异常{
JSch JSch=新的JSch();
Session Session=jsch.getSession(用户名、主机名、22);
this.session=会话;
session.setPassword(密码);
//避免要求钥匙确认
Properties prop=新属性();
道具放置(“检查”、“否”);
session.setConfig(prop);
session.connect();
}
公共字符串runCommand(字符串命令)引发异常{
//SSH通道
ChannelExec channelssh=(ChannelExec)session.openChannel(“exec”);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
InputStream in=channelssh.getInputStream();
channelssh.setOutputStream(baos);
//执行命令
channelssh.setCommand(命令);
channelssh.connect();
System.out.println(“Unix系统已连接…”);
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
Log.v(“running”、“line”);//不起作用
inti=in.read(tmp,0,1024);
if(i<0){
打破
}
字符串行=新字符串(tmp,0,i);
System.out.println(“Unix系统控制台输出:”+行);
channelssh.disconnect();
}
}
}
私有类AsyncTaskOne扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(Void…params){
试一试{
openSSH(“登录”、“通过”、“10.10.10.80”、22);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回true;
}
受保护的void onPostExecute(布尔值){
如果(值){
试一试{
runCommand(“ls-llh”);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
}
请检查您的输入流是否可用。据我所知,问题是您的输入流不可用;I don’我不会给你任何东西
InputStream in = channelssh.getInputStream();
// channelssh.setOutputStream(baos);
评论这一行,看看这里是否真的有什么东西。
另外,您如何确定您已连接?
设置命令的正确方法如下,请执行以下操作:
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);