我尝试使用 Apache Nifi 访问 SFTP 源。处理器不包含代理设置。因此,我想在启动时提供代理详细信息作为 JVM 参数。
java.arg.16=-DsocksProxyHost="123.123.123.123"
java.arg.17=-DsocksProxyVersion=5
java.arg.18=-Djava.net.socks.username="MYUSERNAME"
java.arg.19=-Djava.net.socks.password="MYPASSWORD"
java.arg.20=-DsocksProxyPort=1080
这不起作用。我在 github 上的 nifi 代码中找不到显式使用代理的 jsch 的任何实现 https://github.com/apache/nifi/search?utf8=%E2%9C%93&q=jsch&type=
问题是: Jsch 是否在内部使用提供的参数?
最佳答案
NiFi 使用的底层 SFTP 库 Jsch 有自己的代理实现,例如 com.jcraft.jsch.ProxySOCKS5。这些类似乎不使用系统属性,例如 -Duser.name。
相反,代理实例应该从客户端应用程序代码手动传递,这需要 NiFi SFTP 相关处理器的更改。如果以下示例看起来也适合您的环境,那么我建议创建一个 JIRA 票证来请求为 Apache NiFi JIRA 中的 SFTP 处理器添加代理支持.
我编写了一个示例代码来确认 Jsch SFTP 客户端可以使用 SOCKS5 代理。以下代码有效:
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Proxy;
import com.jcraft.jsch.ProxySOCKS5;
import com.jcraft.jsch.Session;
import org.junit.Test;
import java.util.Properties;
import java.util.Vector;
public class TestSFTPProxy {
@Test
public void test() throws Exception {
final JSch jsch = new JSch();
Session session = jsch.getSession("ftp-user", "ftp-server-host");
final Properties properties = new Properties();
properties.setProperty("StrictHostKeyChecking", "no");
properties.setProperty("PreferredAuthentications", "publickey,password,keyboard-interactive");
session.setConfig(properties);
Proxy proxy = new ProxySOCKS5("proxy-host", proxy-port);
proxy.setUserPasswd("proxy-user", "proxy-password");
session.setProxy(proxy);
session.setPassword("ftp-user-password");
session.connect();
ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
sftp.connect();
System.out.println(sftp);
Vector ls = sftp.ls("path");
System.out.println(ls.get(0));
sftp.disconnect();
session.disconnect();
}
}
关于java - Apache Nifi SOCKS 代理设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46730343/