使用 Jsch 通过 SSH 连接到我的 Raspberry Pi 并且关机命令不起作用...
Using Jsch to SSH to my Raspberry Pi and Shutdown command not working...
希望有人能告诉我我做错了什么。
我正在编写一个小型 android 应用程序来向 SSH 服务器发送命令。我在一个单独的方法中有以下代码,该方法在自己的线程上运行,我将用户名、服务器和命令传递到该线程中。
我发送了一个命令,它在屏幕上显示了一个 toast,显示了该命令的输出。现在代码可以在我的运行 SSH 服务器的 windows 机器上运行。它也适用于(某种程度上)我的 raspberry pi。但是,如果我向 pi 发送 "pwd;" 之类的命令,我会返回当前目录。凉爽的。如果我发送 "sudo touch /media/MYUSBSTICK/testfile" 它将在指定的路径中创建一个文件。如果我发送 "ls /" 我会得到根目录中所有内容的列表。 "sudo ls /" 也有效。
但是...如果我发送 "sudo shutdown -h now",甚至只是 "shutdown" 作为命令使用完全相同的代码,我什么也得不到。它似乎没有执行,我的输入缓冲区中什么也得不到。如果我从直接与 Pi 连接的 SSH 客户端执行此操作,则此操作有效。我试过 "sudo halt" ,这也什么也没做,什么也没返回。
为什么有些命令有效而有些却无效?我在这里遗漏了一些明显的东西吗?我的代码中有明显的错误吗?
谢谢
自然
我有一些特别之处
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, server, 22);
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect(10000);
ChannelExec channel=(ChannelExec) session.openChannel("exec");
BufferedReader in=new BufferedReader(new InputStreamReader(channel.getInputStream()));
channel.setCommand(command); //could be "pwd;" or "sudo shutdown -h now"
channel.connect();
String msg=null;
String wholemessage = "";
while ((msg = in.readLine()) != null) {
wholemessage += msg + "\n";
}
Thread.sleep(8000);
channel.disconnect();
session.disconnect();
final String thereturnresult = wholemessage;
final String tempcommand = command;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), thereturnresult ,Toast.LENGTH_SHORT).show();
}
});
}
好的,我自己解决了这个问题。
诀窍是使用 channel.getErrStream() 捕获错误数据,然后一切就清楚了...
希望这对某人有所帮助。
希望有人能告诉我我做错了什么。
我正在编写一个小型 android 应用程序来向 SSH 服务器发送命令。我在一个单独的方法中有以下代码,该方法在自己的线程上运行,我将用户名、服务器和命令传递到该线程中。
我发送了一个命令,它在屏幕上显示了一个 toast,显示了该命令的输出。现在代码可以在我的运行 SSH 服务器的 windows 机器上运行。它也适用于(某种程度上)我的 raspberry pi。但是,如果我向 pi 发送 "pwd;" 之类的命令,我会返回当前目录。凉爽的。如果我发送 "sudo touch /media/MYUSBSTICK/testfile" 它将在指定的路径中创建一个文件。如果我发送 "ls /" 我会得到根目录中所有内容的列表。 "sudo ls /" 也有效。
但是...如果我发送 "sudo shutdown -h now",甚至只是 "shutdown" 作为命令使用完全相同的代码,我什么也得不到。它似乎没有执行,我的输入缓冲区中什么也得不到。如果我从直接与 Pi 连接的 SSH 客户端执行此操作,则此操作有效。我试过 "sudo halt" ,这也什么也没做,什么也没返回。
为什么有些命令有效而有些却无效?我在这里遗漏了一些明显的东西吗?我的代码中有明显的错误吗?
谢谢
自然
我有一些特别之处 try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, server, 22);
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect(10000);
ChannelExec channel=(ChannelExec) session.openChannel("exec");
BufferedReader in=new BufferedReader(new InputStreamReader(channel.getInputStream()));
channel.setCommand(command); //could be "pwd;" or "sudo shutdown -h now"
channel.connect();
String msg=null;
String wholemessage = "";
while ((msg = in.readLine()) != null) {
wholemessage += msg + "\n";
}
Thread.sleep(8000);
channel.disconnect();
session.disconnect();
final String thereturnresult = wholemessage;
final String tempcommand = command;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), thereturnresult ,Toast.LENGTH_SHORT).show();
}
});
}
好的,我自己解决了这个问题。
诀窍是使用 channel.getErrStream() 捕获错误数据,然后一切就清楚了...
希望这对某人有所帮助。