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 閱讀(10009) 評論(1)  編輯  收藏 所屬分類: J2SE

          Feedback

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

          dfd  回復  更多評論   


          主站蜘蛛池模板: 岳阳县| 东海县| 遵义市| 阿巴嘎旗| 宕昌县| 西乌珠穆沁旗| 建宁县| 宁武县| 民勤县| 正阳县| 清水县| 财经| 天镇县| 大田县| 石棉县| 武乡县| 伊宁市| 梨树县| 襄汾县| 平山县| 游戏| 柳江县| 兴宁市| 石阡县| 武义县| 阿尔山市| 玉溪市| 淮北市| 瓮安县| 邵武市| 额敏县| 遂昌县| 崇阳县| 阜新市| 孝昌县| 巴马| 上杭县| 修水县| 光山县| 沈丘县| 雷州市|