paulwong

          java程序實現對sftp服務器的操作

          FTP服務器中,如果使用的是FTP協議,則用戶名和密碼是以明文方式傳輸的,如果是以SFTP 的方式,就會通過加密的方式傳輸。

          如果服務器中的用戶增加了公鑰的設置,則要求客戶端要有相對應的私鑰。

          公/私鑰的產生方法可見:http://www.jcraft.com/jsch/examples/KeyGen.java.html,值得注意的是,可以產生用密碼的公私鑰和無密碼的公私鑰。

          SFTP服務器:http://www.xlightftpd.com/cn/tutorial/SSH2_SFTP_Setup.html,下載后,添加虛擬服務器,添加用戶,并為用戶添加公鑰文件,即可。

          JAVA模擬一個SFTP服務器:http://mina.apache.org/sshd-project/embedding_ssh.html
          http://svn.apache.org/repos/asf/mina/sshd/trunk/
          public void setupSftpServer(){
              SshServer sshd = SshServer.setUpDefaultServer();
              sshd.setPort(22);
              sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));

              List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
              userAuthFactories.add(new UserAuthNone.Factory());
              sshd.setUserAuthFactories(userAuthFactories);

              sshd.setCommandFactory(new ScpCommandFactory());

              List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>();
              namedFactoryList.add(new SftpSubsystem.Factory());
              sshd.setSubsystemFactories(namedFactoryList);

              try {
                  sshd.start();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }

          在這里介紹對sftp操作的一種java框架:JSch-Java Secure Channel,官方地址是:http://www.jcraft.com/jsch/

          具體使用方法請看下面代碼:

          package jsch;

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

          import com.jcraft.jsch.Channel;
          import com.jcraft.jsch.ChannelSftp;
          import com.jcraft.jsch.JSch;
          import com.jcraft.jsch.JSchException;
          import com.jcraft.jsch.Session;

          public class Test {

              protected String host;//sftp服務器ip
              protected String username;//用戶名
              protected String password;//密碼
              protected String privateKey;//密鑰文件路徑
              protected String passphrase;//密鑰口令
              protected int port = 22;//默認的sftp端口號是22

              /**
               * 獲取連接
               * 
          @return channel
               
          */
              public ChannelSftp connectSFTP() {
                  JSch jsch = new JSch();
                  Channel channel = null;
                  try {
                      if (privateKey != null && !"".equals(privateKey)) {
                          //使用密鑰驗證方式,密鑰可以使有口令的密鑰,也可以是沒有口令的密鑰
                          if (passphrase != null && "".equals(passphrase)) {
                              jsch.addIdentity(privateKey, passphrase);
                          } else {
                              jsch.addIdentity(privateKey);
                          }
                      }
                      Session session = jsch.getSession(username, host, port);
                      if (password != null && !"".equals(password)) {
                          session.setPassword(password);
                      }
                      Properties sshConfig = new Properties();
                      sshConfig.put("StrictHostKeyChecking", "no");// do not verify host key
                      session.setConfig(sshConfig);
                      // session.setTimeout(timeout);
                      session.setServerAliveInterval(92000);
                      session.connect();
                      //參數sftp指明要打開的連接是sftp連接
                      channel = session.openChannel("sftp");
                      channel.connect();
                  } catch (JSchException e) {
                      e.printStackTrace();
                  }
                  return (ChannelSftp) channel;
              }
              
              /**
               * 上傳文件
               * 
               * 
          @param directory
               *            上傳的目錄
               * 
          @param uploadFile
               *            要上傳的文件
               * 
          @param sftp
               
          */
              public void upload(String directory, String uploadFile, ChannelSftp sftp) {
                  try {
                      sftp.cd(directory);
                      File file = new File(uploadFile);
                      sftp.put(new FileInputStream(file), file.getName());
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }

              /**
               * 下載文件
               * 
               * 
          @param directory
               *            下載目錄
               * 
          @param downloadFile
               *            下載的文件
               * 
          @param saveFile
               *            存在本地的路徑
               * 
          @param sftp
               
          */
              public void download(String directory, String downloadFile,
                      String saveFile, ChannelSftp sftp) {
                  try {
                      sftp.cd(directory);
                      sftp.get(downloadFile,saveFile);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }

              /**
               * 刪除文件
               * 
               * 
          @param directory
               *            要刪除文件所在目錄
               * 
          @param deleteFile
               *            要刪除的文件
               * 
          @param sftp
               
          */
              public void delete(String directory, String deleteFile, ChannelSftp sftp) {
                  try {
                      sftp.cd(directory);
                      sftp.rm(deleteFile);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              
              public void disconnected(ChannelSftp sftp){
                  if (sftp != null) {
                      try {
                          sftp.getSession().disconnect();
                      } catch (JSchException e) {
                          e.printStackTrace();
                      }
                      sftp.disconnect();
                  }
              }
          }

          在jsch自帶的例子中,有一個可以根據密鑰生成公鑰的類,叫做UserAuthPubKey.java, 且帶有圖形界面。有用到的可以自己試試。

          posted on 2012-12-15 19:54 paulwong 閱讀(10004) 評論(1)  編輯  收藏 所屬分類: J2SE

          Feedback

          # re: java程序實現對sftp服務器的操作[未登錄] 2013-02-17 14:13 aaa

          dfd  回復  更多評論   


          主站蜘蛛池模板: 马龙县| 新丰县| 高要市| 滦南县| 磴口县| 靖州| 布拖县| 依安县| 高陵县| 达州市| 修武县| 扶沟县| 西充县| 抚松县| 明光市| 垦利县| 阳江市| 门头沟区| 托里县| 阿城市| 新蔡县| 永兴县| 综艺| 汉沽区| 社会| 西安市| 浮山县| 兴安盟| 闻喜县| 昂仁县| 宁河县| 监利县| 云霄县| 逊克县| 丽江市| 日照市| 涞源县| 蓝山县| 石首市| 岑巩县| 临安市|