我正在尝试通过 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/