JSch指令不执行问题
方法:
尝试调换 Channel这个抽象类的实现类中setCommand
方法和connect
方法顺序
示例:
这里我使用的是 ChannelExec这个实现类 , 通过 setCommand
设置操作命令.
如果没有执行, 检查 setCommand
和 connect
的顺序, 先设置cmd命令在连接
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
String command = "sudo mv " + sourceFile + " " + targetFile;
channelExec.setCommand(command);
channelExec.connect();
正确:
// 方法一
channelExec.setCommand(command);
// 方法二
channelExec.connect();
错误:
// 方法一
channelExec.connect();
// 方法二
channelExec.setCommand(command);
原因:
跟一下 connect
方法就可以看到, 这个方法调用了两个方法, 查看 start
public void connect(int connectTimeout) throws JSchException {
this.connectTimeout = connectTimeout;
try {
this.sendChannelOpen();
/
this.start();
/
} catch (Exception var3) {
Exception e = var3;
this.connected = false;
this.disconnect();
if (e instanceof JSchException) {
throw (JSchException)e;
} else {
throw new JSchException(e.toString(), e);
}
}
}
发现是一个抽象方法
public void start() throws JSchException {
}
那么调用的时候是使用子类所实现的start
方法, 找到ChannelExec
类中的start
方法, 截取部分代码, 可以看到 其中有一个参数是this.command
, 到这里其实就可以知道原因了, 需要先通过 channelExec.setCommand(command);
设置指令, 因为在connect中用到了这个参数
public void start() throws JSchException {
Session _session = this.getSession();
try {
this.sendRequests();
Request request = new RequestExec(this.command);
request.request(_session, this);
}
...
}
所以这里的先后顺序就重要了, 而如果反过来那么 command
的值默认是是如下:
byte[] command = new byte[0];
所以就不会执行啦, OK完毕.
坏记性不如烂笔头
🌵