java - JSch 无法运行命令,它是别名并返回 KSH : not found

标签 java shell ssh jsch

我正在尝试通过 JSch 运行命令。我可以运行标准命令,例如 ls 。但如果我需要运行我们的命令,比如 abc <param>它重新运行我

ksh: abc: not found

我尝试使用((ChannelExec)channel).setPty(true); ,但还是不行。

我的 channel 设置如下所示:

Channel channel=session.openChannel("exec");
((ChannelExec)channel).setPty(true);

((ChannelExec)channel).setCommand(fullCommand);

channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);

InputStream in=channel.getInputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
    while(in.available()>0){
        int i=in.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;
    }
    try{Thread.sleep(1000);}catch(Exception ee){}
}

如何使我的自定义命令和别名与 JSch 一起使用?

最佳答案

最简单的方法是制作自定义“命令”脚本而不是别名(或函数)。脚本适用于所有 shell 模式、所有 shell,以及非 shell 事物,例如 find xargs nohup Nice

如果您必须有别名,并且考虑到您正在使用 pty,则应该可以在交互模式下显式运行 ksh。对于如您所示的(非常)简单的命令,您只需使用“ksh -i -c abc”作为命令,并确保别名位于~/.kshrc中>。 (ksh 允许非登录 rc 使用 envvar ENV 位于其他位置,但出于安全考虑,通常会禁止或限制通过 ssh 传递 envvar。)但是,如果您需要带有参数的更复杂的命令,特别是如果它们 (需要)包含空格或特殊字符,如引号、美元符号、反引号或反斜杠,确定使用什么作为 -c 参数,从而导致 ksh 执行正确的命令可能会变得相当困难,特别是如果您还需要在 Java 源中将其表达为字符串文字(即不是来自文件、数据库或 envvar 等)。

关于java - JSch 无法运行命令,它是别名并返回 KSH : not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56283908/

相关文章:

bash - 命令的交换律

java - 如何在 Netbeans IDE 6.5 的 JSP 页面中集成 JFrame(Swing 控件)?

bash - 在控制台上显示持久状态消息

java - 单击按钮即可编辑整行

ruby-on-rails - 在 Capistrano 任务中启动后台进程

java -version 不适用于 SSH

git - 无法在 Windows 8 嵌入式上通过 git bash chmod SSH key

user-interface - 通过 ssh 进行简单的基于 GUI 的 gdb 调试

java - JAX-RS 响应生成器生成的 JSON 实体不正确

Java - Enumerable.Cast() 像 C#?