将文件从一台 linux 机器复制到另一台 linux 机器的 Java 代码

Thu*_*shi 7 scp java file-copy

我正在寻找将文件复制到远程 linux 系统的 java 代码。我Runtime.getRuntime().exec()通过传递scp命令尝试了函数,但是每次运行程序时它都要求输入远程系统密码。我想避免这种情况。

我查看了Jsch库——使用它我可以登录到远程系统——但我无法将文件复制到远程系统。登录后,我可以scp对我的主机执行操作,但它再次需要主机系统用户名和密码。但是,我只有远程系统的信息。

Thu*_*shi 7

您可以使用此代码片段将文件复制到另一linux台机器。

JSch jsch = new JSch();
Session session = null;
session = jsch.getSession("username","hostname",22);
session.setPassword("password");
session.setConfig("StrictHostKeyChecking", "no");
    session.connect();
ChannelSftp channel = null;
channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
    File localFile = new File("localfilepath");
    //If you want you can change the directory using the following line.
    channel.cd(RemoteDirectoryPath)
channel.put(new FileInputStream(localFile),localFile.getName());
    channel.disconnect();
session.disconnect();
Run Code Online (Sandbox Code Playgroud)

有了这个,我已经将我的公钥添加到远程系统,使用生成ssh-keygen。所以每次运行程序时它都不会要求输入密码。


hel*_*ylo 3

将文件从一台主机复制到另一台主机需要远程主机上的守护程序,实现一些应用程序级文件传输协议。无论您要使用哪种语言与远程守护进程对话,这都是一个要求。

Linux 系统的选项有:

  • SSH。这需要远程端有一个 SSH 守护进程(比如 openssh-server)。由于 ssh 是为了安全性而设计的,因此您必须配置远程主机以使用密码或私钥对您进行身份验证。实际上复制文件可以通过 scp 实用程序或 ssh 客户端库来完成(jsch 就是这样的一个例子)。
  • 网络文件系统。远程主机安装守护程序(例如 samba)并共享一些文件。然后,您的本地计算机(cifs-utils 软件包可以做到这一点)可以在本地文件系统上挂载远程位置。这样您只需在本地复制文件即可将文件复制到远程主机。身份验证是可选的,文件通过网络以明文形式发送。
  • FTP。FTP 服务器安装在远程端并配置为允许某些用户访问某些位置。然后,您可以使用任何 ftp 客户端或某些 ftp 客户端库(例如,Apache 项目中的 commons-net 库)连接到远程 ftp 服务器并复制文件。身份验证是可选的,文件通过网络以明文形式发送。

所有这些看起来工作量很大,事实上也确实如此,因为没有一个广泛采用的标准化协议可以在大多数系统上实现和配置开箱即用。