2201_75804946 2024-03-15 19:43 采纳率: 48.9%
浏览 8

通过java用ssh连接树莓派

以下代码,通过java用ssh连接树莓派,获取EditText里的内容,并执行相应的命令,执行ip a ,ifconfig,touch ssh等命令时没有问题,但是运行roscore,或某个launch文件时,没有任何反应,是什么问题


```java
```java
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.testng.annotations.Test;
import java.io.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//import java.security.KeyStore;
//
//import ch.ethz.ssh2.Connection;
 
public class ssh extends AppCompatActivity {
    private Button button;
    private TextView TextView;
    private EditText editText;
    private static String splitStr = "=====================================================";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ssh);
editText=findViewById(R.id.ed);
        button=findViewById(R.id.button1);
        TextView=findViewById(R.id.TextView1);
        shiyan shiyan=new shiyan();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread thread=new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String host="192.168.12.161";
                        int port=22;
                        String userName="ubtu";
                        String password="123456";
                        JSch jsch = new JSch();
                        Session session = null;
                        try {
                          String cc=editText.getText().toString();
                            session = jsch.getSession(userName, host, port);
                            session.setPassword(password);
                            session.setConfig("StrictHostKeyChecking","no");
                            session.setTimeout(6000);
                            session.connect();
                            //建立连接结束
                            //发送指令
                            ChannelExec exec = (ChannelExec) session.openChannel("exec");
                            InputStream in = exec.getInputStream();
                            exec.setCommand(cc);
                            exec.connect();
                            String s = IOUtils.toString(in, "UTF-8");
                            System.out.println("结果:"+s);
                            in.close();
                        } catch (JSchException | IOException e) {
                            e.printStackTrace();
                        }
 
 
                    }
 
                });
                thread.start();
            }
        });
    }
}
 
 


```

  • 写回答

2条回答 默认 最新

  • 关注

    2201_75804946 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    通过分析你提供的代码,有以下几个可能导致无法执行"roscore"或某个"launch"文件的原因:

    1. 代码中的 JSch 库似乎没有问题,你能成功连接树莓派并执行一些命令。
    2. "roscore"和"launch"文件通常需要执行特定的环境配置和依赖项,例如设置ROS_MASTER_URI等。你需要确保你在执行这些命令之前正确设置了这些环境变量。
    3. 可能是执行"roscore"或"launch"文件的路径不正确。你需要指定正确的路径来执行这些命令。你可以尝试使用绝对路径或使用 cd 命令切换到正确的目录。

    针对这些问题,你可以尝试以下解决方案:

    1. 确保你在执行 "roscore" 或 "launch" 文件之前正确设置了ROS的环境变量。例如,使用 export 命令设置 ROS_MASTER_URI 等必要的环境变量。
    2. 确保你在执行 "roscore" 或 "launch" 文件时使用了正确的路径。你可以在树莓派上执行 which 命令来查找 "roscore" 或 "launch" 文件的绝对路径,然后在代码中使用该路径进行执行。
    3. 如果你的 "roscore" 或 "launch" 文件需要特定的工作目录,你可以在代码中使用 cd 命令切换到正确的目录后再执行相关命令。
    4. 确保你在树莓派上运行的账户有足够的权限来执行 "roscore" 或 "launch" 文件。你可以尝试使用 sudo 命令来提升权限。

    修改后的代码示例(修改了部分代码结构):

    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    import org.apache.commons.io.IOUtils;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class ssh extends AppCompatActivity {
        private Button button;
        private TextView textView;
        private EditText editText;
        private static String splitStr = "=====================================================";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_ssh);
            
            editText = findViewById(R.id.ed);
            button = findViewById(R.id.button1);
            textView = findViewById(R.id.TextView1);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Thread thread = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            String host = "192.168.12.161";
                            int port = 22;
                            String userName = "ubtu";
                            String password = "123456";
                            String command = editText.getText().toString();
    
                            try {
                                JSch jsch = new JSch();
                                Session session = jsch.getSession(userName, host, port);
                                session.setPassword(password);
                                session.setConfig("StrictHostKeyChecking", "no");
                                session.setTimeout(6000);
                                session.connect();
    
                                ChannelExec exec = (ChannelExec) session.openChannel("exec");
                                exec.setCommand(command);
                                exec.connect();
    
                                InputStream in = exec.getInputStream();
                                String output = IOUtils.toString(in, "UTF-8");
    
                                System.out.println("结果:" + output);
    
                                in.close();
                                exec.disconnect();
                                session.disconnect();
                            } catch (JSchException | IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
    
                    thread.start();
                }
            });
        }
    }
    

    请注意,这个问题有可能还有其他原因。以上只是一些常见的处理方法,你可以根据需要进行调整和尝试。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月15日

悬赏问题

  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含