当前位置: 首页 > 面试题库 >

JSch:有没有办法将用户环境变量公开给“ exec”通道?

拓拔富
2023-03-14
问题内容

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

在下面添加我的课程代码:`public class SecureShell {

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();
}

}`


问题答案:

由于您没有打开交互式外壳,因此不会设置环境变量。但是,可以将bash命令与–login一起使用(有关更多详细信息,请参见man
bash)以获取所需的结果。

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


 类似资料:
  • 问题内容: 在Unix上,是否有任何方法可以使一个进程更改另一个环境的变量(假设它们都由同一用户运行)?一般的解决方案是最好的,但如果不是,那么一个孩子是另一个孩子的特殊情况呢? 编辑:如何通过gdb? 问题答案: 通过gdb: 当然,这是一个很讨厌的黑客,应该只在调试场景中进行。

  • 我有一个Postman集合,我正在尝试与newman一起工作,但我的环境变量没有被使用。 请求URL只是{{URL}},然后我有一个同名的环境变量。我正在使用以下命令运行测试: 我可以在报告中看到环境文件被正确读取,并且包含了我想要使用的变量,但请求失败,报告显示请求是“url”:“https://{url}}”,而不是我真正想要的。 当然,请求失败是因为“https://{{url}}”不是有效

  • 问题内容: 我想将背景URL存储在自定义属性(CSS变量)中,并将其与background属性一起使用。但是,当使用字符串作为参数时,我找不到插值的方法。 这是我的示例代码: 我知道可以使用插值函数在Sass或LESS中轻松完成此操作,但我很好奇是否有一种无需任何预处理器的方法。 问题答案: 您可以使用大多数CSS函数执行插值,包括的示例。实际上,插值是自定义属性的主要功能之一。 但是,您不能使用

  • 问题内容: 我开始使用Grunt,并希望将变量传递给我通过exec运行的PhantomJS脚本。我想要做的是为脚本传递URL,以从中获取屏幕截图。任何帮助将不胜感激,谢谢! 达伦 咕script声脚本 screenshot.js 问题答案: 命令行参数可通过模块(Module )访问。第一个始终是脚本名称,然后是后续参数 该脚本将枚举所有参数,并将其写到控制台。 在您的情况下,解决方案是 咕unt

  • 我在Kubernetes集群中有一个服务和RabbitMQ。我想做的是,我希望服务的不同实例(或副本)在启动时声明一个全新的队列。这些队列将绑定到同一个exchange。 我可以在这里放一个最后的变量吗: 本质上,我只需要一种方法,用生成的名称创建一个队列,然后使用@RabbitListener侦听这个队列。

  • 我是一名学生,我想知道是否有一种方法可以将一个变量从它的范围块中取出,用于本地范围?我正在尝试对一个商店进行编码,在那里用户可以选择他们想要购买什么,他们想要购买多少,并给他们同一商品的总付款。现在在块范围之外,我想给出他们购买每件商品的总金额。这是我的代码: 感谢: