2016-10-20 56 views
0

我正在使用jcraft庫爲了使用scp將文件從一臺服務器發送到另一臺服務器。該代碼是這樣sftp java客戶端保持sshd進程在遠程機器上運行

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(); 
    } 
} 

這是來自於一個其他的Java類,幾次,其中的每一個創建新對象調用時,像這樣

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(); 

由於我使用clossing的連接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

是否有任何scp實例在複製文件時拋出異常? – Kenster

+0

@Kenster一些,偶爾。但是我不認爲它們與正在運行的進程一樣多,但不能確定這一點 –

+0

1)在結束Java進程後,遠程進程是否消失? 2)你嘗試了獨立的SFTP客戶端嗎?你是否得到相同的行爲或者遠程進程是否正確關閉? –

回答

1

原來是一個「bug」。 This post用它解決了這個問題

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