如何使用一个会话同时在JSch中同时使用'exec'和'sftp'通道

时间:2017-05-03 14:32:18

标签: java ssh sftp jsch

以下是代码段

JSch jsch = new JSch();
session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
session.setPassword(SFTPPASS);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
config.put("PreferredAuthentications","publickey,keyboard-interactive,password");
session.setConfig(config);
session.connect();

连接到会话后,我需要切换到root才能复制文件(因为没有启用权限,也没有直接root登录的选项)。

channel = session.openChannel("exec");
((ChannelExec) channel).setCommand("dzdo -iu root");

现在我可以复制文件

channel = session.openChannel("sftp");
channel.connect();

channelSftp = (ChannelSftp)channel;
channelSftp.cd(SFTPWORKINGDIR);

System.out.println("connected successfully");
channelSftp.put(FILETOTRANSFER, SFTPWORKINGDIR);

这里使用“exec”和“sftp”频道,但它对我不起作用。任何帮助如何运行命令,然后使用“sftp”复制文件?

1 个答案:

答案 0 :(得分:1)

您的代码是正确的。但如果你期望" exec"渠道用户切换操作影响" sftp"频道,你错了。渠道在隔离的环境中运行。

唯一的方法就是在高架环境中显式运行SFTP服务器。没有通用的解决方案,有些服务器甚至可能无法实现。

一些参考文献:

通常需要切换用户以自动执行某些操作,这是设计糟糕的标志。您应该直接使用可以访问该任务所需资源的帐户。正确的解决方案是设置专用私钥,仅具有任务所需的权限。