wlf2r 2024-04-23 11:18 采纳率: 40%
浏览 19

java ssh 其它用户环境变量问题,导致命令无法执行

java ssh 其它用户环境变量问题,导致命令无法执行
java 如何正确处理,执行的是ifconfig

img

  • 写回答

8条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-23 11:18
    关注

    引自免费微信小程序:皆我百晓生

    在Java中,如果你需要通过SSH连接到另一台机器并执行命令,例如ifconfig,并且遇到由于目标机器上的环境变量设置问题而导致命令无法执行的问题,可以尝试以下步骤解决:

    首先,确保你的Java应用程序已经包含了合适的库来支持SSH操作。一个常用的库是JSch(http://www.jcraft.com/jsch/)。如果你的项目使用Maven管理依赖项,可以在pom.xml文件中添加如下依赖:

    <dependencies>
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.55</version>
        </dependency>
    </dependencies>
    

    接下来,编写一个方法来创建SSH会话,并执行命令。这里是一个示例代码:

    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Properties;
    
    public class SSHExecutor {
    
        public static void executeCommand(String host, String username, String password, String command) {
            try {
                JSch jsch = new JSch();
                Session session = jsch.getSession(username, host, 22);
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);
    
                session.setPassword(password);
                session.connect();
    
                Channel channel = session.openChannel("exec");
                ((ChannelExec) channel).setCommand(command);
    
                OutputStream inputToServer = channel.getOutputStream();
                InputStream outputFromServer = channel.getInputStream();
    
                channel.connect();
    
                // 如果你需要设置环境变量,可以通过以下方式添加到命令前
                // 注意:这种方式可能会有安全风险,因为命令可能被注入攻击
                // 这里只是一个示例,实际应用中应谨慎处理用户输入
                StringBuilder envVariables = new StringBuilder();
                // 添加环境变量,例如:envVariables.append("PATH=$PATH:/usr/local/bin\n");
    
                // 将环境变量写入服务器
                if (!envVariables.toString().isEmpty()) {
                    inputToServer.write(envVariables.toString().getBytes());
                    inputToServer.flush();
                }
    
                // 再次发送命令
                inputToServer.write((command + "\n").getBytes());
                inputToServer.flush();
    
                byte[] tmp = new byte[1024];
                while (true) {
                    while (outputFromServer.available() > 0) {
                        int i = outputFromServer.read(tmp, 0, 1024);
                        if (i < 0) break;
                        System.out.print(new String(tmp, 0, i));
                    }
                    if (channel.isClosed()) {
                        System.out.println("exit-status: " + channel.getExitStatus());
                        break;
                    }
                    Thread.sleep(1000);
                }
    
                channel.disconnect();
                session.disconnect();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    然后,在你的主程序中调用这个方法:

    public static void main(String[] args) {
        String host = "target_host";
        String username = "target_username";
        String password = "target_password";
        String command = "ifconfig";
    
        SSHExecutor.executeCommand(host, username, password, command);
    }
    

    请将target_hosttarget_usernametarget_password替换为实际的主机名、用户名和密码。

    注意:这种方法可能不适用于所有情况,特别是当目标系统要求特定环境变量设置时,可能需要更深入地了解目标系统的配置。此外,直接在命令中设置环境变量可能存在安全风险,因此在生产环境中应谨慎处理。对于复杂的环境变量需求,建议考虑使用SSH密钥对进行认证,并且在远程服务器上设置正确的环境变量,或者使用脚本语言(如bash)来动态设置环境变量后再执行命令。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月23日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现