원격 Linux 시스템에 파일을 복사하기 위한 Java 코드를 찾고 있습니다. 작동하도록 명령을 Runtime.getRuntime().exec()
전달하려고 시도했지만 프로그램을 실행할 때마다 원격 시스템 비밀번호를 묻습니다. scp
나는 이런 상황을 피하고 싶다.
이 라이브러리를 살펴보았습니다 Jsch
. 이를 사용하여 원격 시스템에 로그인할 수 있지만 파일을 원격 시스템에 복사할 수는 없습니다. 로그인한 후 scp
호스트에서 작업을 수행할 수 있지만 이 경우에도 호스트 시스템 사용자 이름과 비밀번호가 필요합니다. 하지만 원격 시스템에 대한 정보만 가지고 있습니다.
답변1
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();
이러한 방식으로 generate를 사용하여 원격 시스템에 공개 키를 추가했습니다 ssh-keygen
. 따라서 프로그램을 실행할 때마다 비밀번호를 묻지 않습니다.
답변2
한 호스트에서 다른 호스트로 파일을 복사하려면 일부 애플리케이션 수준 파일 전송 프로토콜을 구현하는 원격 호스트의 데몬이 필요합니다. 이는 원격 데몬과 통신하는 데 사용하려는 언어에 관계없이 요구 사항입니다.
Linux 시스템의 옵션은 다음과 같습니다.
- SSH. 이를 위해서는 원격 측에 SSH 데몬(예: openssh-server)이 필요합니다. SSH는 보안을 위해 설계되었기 때문에 비밀번호나 개인 키를 사용하여 인증하도록 원격 호스트를 구성해야 합니다. 실제로 파일 복사는 scp 유틸리티나 ssh 클라이언트 라이브러리를 통해 수행할 수 있습니다(jsch가 이에 대한 예입니다).
- 네트워크 파일 시스템. 원격 호스트는 데몬(예: Samba)을 설치하고 일부 파일을 공유합니다. 그러면 로컬 시스템(cifs-utils 패키지가 이를 수행함)이 로컬 파일 시스템에 원격 위치를 마운트할 수 있습니다. 이렇게 하면 파일을 로컬로 복사하여 원격 호스트에 복사할 수 있습니다. 인증은 선택 사항이며 파일은 네트워크를 통해 일반 텍스트로 전송됩니다.
- FTP. FTP 서버는 원격 측에 설치되며 특정 사용자가 특정 위치에 액세스할 수 있도록 구성됩니다. 그런 다음 FTP 클라이언트 또는 일부 FTP 클라이언트 라이브러리(예: Apache 프로젝트의 commons-net 라이브러리)를 사용하여 원격 FTP 서버에 연결하고 파일을 복사할 수 있습니다. 인증은 선택 사항이며 파일은 네트워크를 통해 일반 텍스트로 전송됩니다.
이 모든 것이 많은 작업처럼 보일 수 있으며, 대부분의 시스템에서 즉시 구현하고 구성할 수 있는 널리 채택된 표준화된 프로토콜이 없기 때문에 그렇습니다.