我们正在尝试在基于 Spring 的环境中提供一个 SFTP 适配器,以将文件从本地传输到本地或远程服务器。但是,我们没有为远程位置的用户配置任何密码。像 apache-commons VFS 或 Jsch 这样的所有实现都需要密码或私钥对来进行文件传输。我们现在无法为用户配置密码,因为这需要在我们获取用户信息的其他 API 中进行多次更改。
你建议我们如何解决它?
我们正在尝试在基于 Spring 的环境中提供一个 SFTP 适配器,以将文件从本地传输到本地或远程服务器。但是,我们没有为远程位置的用户配置任何密码。像 apache-commons VFS 或 Jsch 这样的所有实现都需要密码或私钥对来进行文件传输。我们现在无法为用户配置密码,因为这需要在我们获取用户信息的其他 API 中进行多次更改。
你建议我们如何解决它?
出于自动化目的,您无需任何密码即可使用 SFTP/SSH。2种方式,任君选择。
1 - 制作一个密钥对,其中密钥的密码为空。使用 ssh-keygen:
$ ssh-keygen -f myInsecureKey
当它提示输入秘密(私人)密钥密码(密码)时,只需按回车键。然后获取公钥 (myInsecureKey.pub) 并将其传输到服务器,进入远程帐户主目录中的 .ssh 目录。必须将其命名为“authorized_keys”,如果它已经存在,请附加您的新密钥(使用编辑器查看您在做什么)。但是请注意,您的密钥现在完全裸露,因此您应该调整权限或其他东西来保护它。
2 - 使用带有常规 SSH 密钥对的“代理”。它有点复杂,但一旦你开始使用它,它就很酷,而且非常适合交互式使用。在 unix/mac 上,命令 ssh-agent 将在您的客户端计算机上运行个人密钥服务器。它会生成一些您需要获取的 shell 命令。像这样:
$ ssh-agent > ~/.ssh/.myAgentContactInfo
$ source ~/.ssh/.myAgentContactInfo
每个 shell 都必须执行最后一步才能使用代理;把它放在你的 .profile 中,这样你打开的新 shell 窗口就可以了。我认为每个用户都需要自己的代理。
然后你用任何密钥加载它: $ ssh-add mySecretKey 这一步需要你的sec key密码,但在那之后,你就没有密码了。
这两种方法都适用于 ssh 和 sftp,并且可能适用于 ssh 库(我从未尝试过)。
我不明白您如何在不使用用户登录名和密码进行身份验证的情况下进行 SFTP。但是,用户可能有一个空密码。
使用 JSch,您可以使用StrictHostKeyChecking
:
final int PORT = 22;
// Server belongs to the model
Server server = new Server("root", "password");
JSch client = new JSch();
Session session = client.getSession(server.getLogin(), server.getAddress(), PORT);
// This is the important line!
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(server.getPassword());