2017-06-26 12 views
0

apache-commons-vfs APIを使用してWindowsからLinuxにファイルをアップロードしようとしています。私はこのユーティリティを使用してファイルをアップロードすることができますが、プログラムが実行されるときに、コード内にすでに入力されている資格情報を要求します。資格情報にもブランクを入力すると、アップロードが許可されます。commons-VFSを使用してSFTP中にパスワードプロンプトをスキップする方法

資格情報の入力を省略することはできますか?

SSH private/publicが唯一の解決策であれば、その手順を分かち合いましょう。

import java.io.File; 
import java.io.FileInputStream; 
import java.util.Properties; 

import org.apache.commons.vfs2.FileObject; 
import org.apache.commons.vfs2.FileSystemOptions; 
import org.apache.commons.vfs2.Selectors; 
import org.apache.commons.vfs2.impl.StandardFileSystemManager; 
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; 

public class SSHUtility { 

    static Properties props; 

    public static void main(String[] args) { 

     SSHUtility SSHUtility = new SSHUtility(); 
     if (args.length < 1) { 
      System.err.println("Usage: java " + SSHUtility.getClass().getName() + " Properties_file File_To_FTP "); 
      System.exit(1); 
     } 

     String propertiesFile = args[0].trim(); 
     String fileToFTP = args[1].trim(); 
     SSHUtility.startFTP(propertiesFile, fileToFTP); 

    } 

    public boolean startFTP(String propertiesFilename, String fileToFTP) { 

     props = new Properties(); 
     StandardFileSystemManager manager = new StandardFileSystemManager(); 

     try { 

      // props.load(new FileInputStream("properties/" + propertiesFilename)); 
      props.load(new FileInputStream(propertiesFilename)); 
      String serverAddress = props.getProperty("serverAddress").trim(); 
      String userId = props.getProperty("userId").trim(); 
      String password = props.getProperty("password").trim(); 
      String remoteDirectory = props.getProperty("remoteDirectory").trim(); 
      String localDirectory = props.getProperty("localDirectory").trim(); 

      // check if the file exists 
      String filepath = localDirectory + fileToFTP; 
      File file = new File(filepath); 
      if (!file.exists()) 
       throw new RuntimeException("Error. Local file not found"); 

      // Initializes the file manager 
      manager.init(); 

      // Setup our SFTP configuration 
      FileSystemOptions opts = new FileSystemOptions(); 
      SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no"); 
      SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true); 
      SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000); 

      // Create the SFTP URI using the host name, userid, password, remote path and file name 
      String sftpUri = "sftp://" + userId + ":" + password + "@" + serverAddress + ":/" + remoteDirectory 
        + fileToFTP; 

      // Create local file object 
      FileObject localFile = manager.resolveFile(file.getAbsolutePath()); 

      System.out.println("localFile::::" + file.getAbsolutePath()); 

      // Create remote file object 
      FileObject remoteFile = manager.resolveFile(sftpUri, opts); 

      // Copy local file to sftp server 
      remoteFile.copyFrom(localFile, Selectors.SELECT_SELF); 
      System.out.println("File upload successful"); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
      return false; 
     } finally { 
      manager.close(); 
     } 

     return true; 
    } 

} 

答えて

0

setPreferredAuthenticationsを "publickey、keyboard-interactive、password"と設定するとこの問題が解決されます。

// Setup our SFTP configuration 
FileSystemOptions opts = new FileSystemOptions(); 
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no"); 
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true); 
SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000); 
SftpFileSystemConfigBuilder.getInstance().setPreferredAuthentications(opts, "publickey,keyboard-interactive,password"); 
関連する問題