java - JSch:有没有办法将用户环境变量暴露给 "exec" channel ?

标签 java ssh jsch

我正在尝试运行使用本地 Linux 逻辑路径的命令,例如 cat $test_dir/test.dat,但是逻辑路径 $test_dir(这是一个用户环境变量)不能通过 ChannelExec 使用。但是当我使用交互式 ChannelShell 时,我能够看到用户变量,命令在交互式 session 中运行良好。我只能从“exec” session 中查看系统级环境变量。甚至可以使用 JSch 库吗?如果可以,我应该如何实现它?如果不行,我应该使用什么库来实现它?

在下面添加我的类(class)代码:

    
    private static final Logger logger = LogManager.getLogger(SecureShell.class);
    
    private String uName;
    private String pWord;
    private String hName;
    private int port;
    
    private Session session = null;
    private Channel channel = null;
    
    /**Create an instance to start and stop the remote shell and execute commands
     * remotely via java.
     * 
     * @param uName
     *          host username 
     * @param pWord
     *          host password
     * @param hName
     *          host name
     * @param port
     *          host port number
     */
    public SecureShell(String uName, String pWord, String hName, int port) {
        this.uName = uName;
        this.pWord = pWord;
        this.hName = hName;
        this.port = port;
    }
    
    /**Create an instance to start and stop the remote shell and execute commands
     * remotely via java.
     * 
     *@param uName
     *          host username 
     * @param pWord
     *          host password
     * @param hName
     *          host name
     */
    public SecureShell(String uName, String pWord, String hName) {
        this.uName = uName;
        this.pWord = pWord;
        this.hName = hName;
        this.port = 22;
    }
    
    /**Start the session with the host.
     * @return
     *      true if the session started successfully, false otherwise
     */
    public boolean startSession() {
        JSch jsch = new JSch();
        try {
            session = jsch.getSession(uName, hName, port);
            
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.setPassword(pWord);
            session.connect();
            
        } catch (JSchException jsche) {
            logger.error(jsche.getMessage());
            return false;
        } 
        
        return true;
    }
    
    /** Execute commands on the host;
     * @param command
     *          command to be executed on the host.
     * @return
     *      status of the execution
     */
    public int execute(String command) {
        
        int status = -1;
        if(session != null && session.isConnected()) {
            try {
                channel = session.openChannel("exec");
                //((ChannelExec)channel).setEnv("LC_XXX", "xxxxxxx");
                ((ChannelExec)channel).setPty(true);
                ((ChannelExec) channel).setCommand(command);
                
                InputStream in = channel.getInputStream();
        
                channel.connect();
                
                 byte[] buffer = new byte[1024];
                 while(true){
                     while(in.available()>0){
                         int i=in.read(buffer, 0, 1024);
                         System.out.print(new String(buffer, 0, i));
                         if(i<0)
                             break;
                    }
                     if(channel.isClosed()){
                         if(in.available()>0) 
                             continue; 
                         status = channel.getExitStatus();
                         break;
                     }
                }
            } catch (JSchException jsche) {
                logger.error(jsche.getMessage());
            } catch (IOException ioe) {
                logger.error(ioe.getMessage());
            } finally {
                if(channel!=null && channel.isConnected())
                    channel.disconnect();
            } 
        }
        
        return status;
    }
    
    /**Stop the session with the remote.
     * 
     */
    public void stopSession() {
        
        if(session!=null && session.isConnected())
            session.disconnect();
    }
    
    public static void main(String[] args) {
        SecureShell ssh  = new SecureShell("user", "password", "hostname");
        ssh.startSession();
        System.out.println(ssh.execute("env"));
        ssh.stopSession();
    }
}

最佳答案

由于您没有打开交互式 shell,因此不会设置您的环境变量。但是,您可以使用带有 --login 的 bash 命令(有关更多详细信息,请使用 man bash)来获得您想要的结果

bash --login -c 'command arg1 ...'"

关于java - JSch:有没有办法将用户环境变量暴露给 "exec" channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46349113/

相关文章:

java - JSch sftp 传输剥离 Windows 行结尾

git - 如何将 ssh 公钥添加到特定的 git 存储库

linux - 是否可以在 linux 中的一系列命令中通过 SSH 从一个终端链接到另一个终端?

c# - 解释 SSH 输出

java - JSch ChannelSftp.ls 抛出空指针

java - Linux 上的 JSCH 抛出 java.awt.HeadlessException

java - 使用 Java 生成 Html 到 PDF

java - 从 Java 添加用户/虚拟主机到 RabbitMQ

java - 签名验证(格式为 PKCS#7)

java - 卡夫卡 -> Spark流 -> Hbase。任务不可序列化错误由 : java. lang.IllegalStateException 引起:作业处于 DEFINE 状态而不是 RUNNING 状态