2016-10-20 6 views
0

scp를 사용하여 한 서버에서 다른 서버로 파일을 보내려면 jcraft 라이브러리를 사용하고 있습니다. 내가 사용하여 연결을 clossing하고 있기 때문에 코드는 너무sftp java 클라이언트가 원격 시스템에서 sshd 프로세스를 계속 실행합니다.

Scp scp=new Scp(); 

scp.setDestinationHost(CopyDestHost); 
scp.setDestinationPassword(CopyDestPassword); 
scp.setDestinationPublicKeyFile(CopyDestKey); 
scp.setDestinationUserName(CopyDestUser);    
scp.setSourceFile(temp.getAbsolutePath()); 
scp.setDestinationDirectory(filepath); 

stream.flush(); 
stream.close(); 
scp.send(); 

처럼, 이것은 새로운 객체를 생성되어 각각의 다른 자바 클래스, 여러 번에서 호출되어있다이

public class Scp { 
String DestinationHost;//host IP 
String DestinationUserName;//username 
String DestinationPassword;//password 
String DestinationPublicKeyFile;//public key-if any 
String DestinationDirectory;//where to save on remote 
String SourceFile; 
/* 
    setters-getters 
    */ 
public void send() throws SftpException, FileNotFoundException, JSchException{ 
    JSch jsch = new JSch(); 
    Session session = null; 
    session = jsch.getSession(DestinationUserName,DestinationHost,22); 
    jsch.addIdentity(getDestinationPublicKeyFile(),getDestinationPassword()); 

    session.setConfig("StrictHostKeyChecking", "no"); 
    session.connect();  

    ChannelSftp channel = null; 

    //try to connect 
    channel = (ChannelSftp)session.openChannel("sftp"); 
    channel.connect(30000); 
    channel.connect(); 

    File localFile = new File(getSourceFile()); 
    File remoteFile=new File(getDestinationDirectory()); 
    channel.cd(remoteFile.getParent()); 

    channel.put(new FileInputStream(localFile),//the source file 
    remoteFile.getParentFile().getName());//the destination name(not the path) 

    channel.disconnect(); 
    session.disconnect(); 
    } 
} 

같다 channel.disconnect();session.disconnect(); 연결이 닫힌 후 내 원격 컴퓨터에서 실행되는 sshd 프로세스의 거대한 목록이 왜 표시됩니까? 예 :

root  13251 863 0 11:54 ?  00:00:00 sshd: skaros [priv] 
user  13300 13251 0 11:54 ?  00:00:00 sshd: [email protected] 
skaros 13301 13300 0 11:54 ?  00:00:00 /usr/lib/openssh/sftp-server 
root  14885 863 0 10:35 ?  00:00:00 sshd: skaros [priv] 
skaros 14986 14885 0 10:35 ?  00:00:00 sshd: [email protected] 
skaros 14987 14986 0 10:35 ?  00:00:00 /usr/lib/openssh/sftp-server 

나는 그들을 수동으로 죽여야합니까? 나는 그걸 그냥두고 갈까?

+0

파일을 복사하는 동안 예외가 발생합니까? – Kenster

+0

@Kenster some, 가끔. 하지만 나는 그들이 실행중인 프로세스만큼이나 많다고 생각하지 않는다. 그러나 그것에 대해 확실하지 않다. –

+0

1) Java 프로세스를 종료 한 후 원격 프로세스가 사라지나요? 2) 독립형 SFTP 클라이언트를 사용해 보셨습니까? 당신도 똑같은 행동을하거나 원격 프로세스가 제대로 닫혔습니까? –

답변

1

"버그"로 판명되었습니다. This post이 문제를 해결했습니다

while (channel.getExitStatus() == -1){ 
     try{Thread.sleep(1000);}catch(Exception e){System.out.println(e);} 
    }