无法使用JSch库执行包含变量的Unix命令

时间:2018-02-23 10:42:48

标签: java jsch

我编写了一个Java程序,执行该程序时会打开一个上传向导,用户可以通过该向导选择文件。执行此操作后,所选文件将被传输/上载到Unix框中,进入用户指定并进一步处理的目录。以下是步骤/操作:

  1. 通过上传向导浏览文件
  2. 在此之后,程序将提示创建一个新目录,用户可以将其作为输入的名称
  3. 程序创建一个新目录(源)并将所选文件放在已创建的服务器目录中
  4. 在源中显示传输文件的内容(使用cat命令)
  5. 提示用户创建新目录(目标),将文件从源复制到目标,然后在目标中显示文件的内容,所有这些都使用Linux命令。
  6. 我能够将文件上传到源(步骤3)。但是,第4步和第5步不起作用。这是代码:

    String cmd1 = "cat" + " " + path + s1 + "/" + file;
    System.out.println(cmd1);
    ((ChannelExec)channel).setCommand(cmd1);
    Scanner in2 = new Scanner(System.in);
    System.out.println("Enter d target directory");
    String s = in2.nextLine();
    String path2 = "/e/f/";
    String d = path2 + s;
    String cmd2 = "mkdir" + " " + path2 + s;
    ((ChannelExec)channel).setCommand(cmd2);
    String src = p + "/" + file;
    String cmd3 = "cp" + " " + path + s1 + "/" + file + " " + path2 + s;
    ((ChannelExec)channel).setCommand(cmd3);
    String destpath = d + "/" + file;
    String cmd4 = "cat" + " " + path2 + s + "/" + file;
    

    我无法使程序在命令中使用变量(用于用户输入)。但是,硬编码的字符串就像,例如。 cat /a/b/file似乎能够奏效。

    请问有人在这方面帮助我吗?

2 个答案:

答案 0 :(得分:0)

我认为问题在于变量值(变量d已创建但几乎未使用)和最终/字符。我不知道p值。

我会在执行前为cmd2cmd3添加 println 因为我认为在某些地方会丢失/,或者也许两个/应该只有一个取决于用户输入的内容,并对目录进行一些规范化,以便它们始终具有最终/,或者它们永远不会有,但我想确定无论如何用户输入或参数有,所有目录名称都是一致的。

目录名称,用户输入和最终/总是很痛苦......

答案 1 :(得分:0)

从您的代码段我猜channelChannelExec,这是一个用于发布命令的频道,而像shell一样工作(用例是由shell通道处理,它分配一个伪tty。

在您的情况下,我简化了代码而根本不使用变量。否则,如果你绝对需要它们,你可以:

  • 如果变量已定义为Java程序调用{​​{3}}
  • 如果在目标主机上定义了变量,请确保它位于正确的位置,例如,在生成非交互式SSH会话时获取的文件。一个好地方可能是.bashrc,但你应该查看你的系统文档(也许ChannelExec.setEnv(name, value)