Linux創建SFTP用戶并使用jsch進行獲取傳輸文件
#使用root登錄服務器 #在服務器上創建一個sftp用戶組 groupadd sftpusers #創建相關SFTP用戶并設置成不允許登錄配置 useradd -s /sbin/nologin -G sftpusers -M postStoreFtp #創建完成后修改密碼 passwd postStoreFtp #創建完成后進入/data目錄下,創建接收ftp文件的目錄 mkdir /data/postStore cd /data/postStore mkdir data #修改文件夾權限和所屬組,文件夾權限必須為755權限 #修改二級目錄為root用戶以及可以訪問目錄的用戶所屬組權限 chown root:oinstall /data/postStore/ #修改創建文件夾data的訪問權限,所屬組權限為SFTP用戶所屬組 chown postStoreFtp:sftpusers /data/postStore/data chmod 755 -R /data/postStore/ #當前服務器應用系統無需考慮安全性問題,在交給第三方系統sftp用戶時,需要考慮用戶權限問題,須指定其根目錄為所配置的/data/postStore/目錄,不允許訪問并獲取其他目錄的文件及其他信息 #權限配置完成后,修改系統配置文件,修改為除了登錄SFTP外,不允許進行其他的任何操作 vi /etc/ssh/sshd_config #在該文件末尾將原有的Subsystem sftp /usr/openssh/sftp-server 命令注釋掉,并且在后面加上Subsystem sftp internal-sftp及以下內容 #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp Match Group sftpusers ChrootDirectory /data/postStore/ ForceCommand internal-sftp AllowTcpForwarding no #修改完成后進行保存 #保存后重啟sshd服務: systemctl restart sshd.service #java使用jsch.jar進行SFTP操作時,第三方平臺配置的路徑為./data,相當于登錄SFTP后,默認進入/data/postStore目錄,進行fcd時,進入./data目錄,再進行文件傳輸工作 #當前服務器應用系統使用jsch.jar進行獲取數據文件時,配置目錄地址為/data/postStore/data,因為服務器用戶可直接訪問到指定文件夾并進行獲取 #第三方使用jsch.jar獲取文件時,配置地址與傳輸路徑一致,根本原理就是,登錄SFTP服務器,進入的/data/postStore為三方用戶登錄的根目錄/,其目錄下只有一個data的文件夾 驗證方案: 使用其它服務器進行SFTP訪問測試 sftp postStoreFtp@IP SFTP登錄成功后跳轉其它文件夾或進行上傳測試文件
以下為SFTP的JAVA代碼
import com.jcraft.jsch.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class SftpUtils {
private static ChannelSftp sftp = null;
private static Session session = null;
// 登錄
public static void main(String [] ares){
try{
List<String> str = readFile("test","127.0.0.1",22,"test","/data/postStore/data/1212121212.txt");
System.out.println(str.toString());
// putFile("postStoreFtp","127.0.0.1",22,"postStoreFtp","./data");
}catch (Exception e){
}
}
public static ChannelSftp login(String userName,String host,int port,String password) throws JSchException {
JSch jSch = new JSch();
// 設置用戶名和主機,端口號一般都是22
session = jSch.getSession(userName, host, port);
// 設置密碼
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
System.out.println("connect success....");
return sftp;
}
// 退出登錄
public static void logout() {
if (sftp != null) {
if (sftp.isConnected()) {
sftp.disconnect();
}
}
if (session != null) {
if (session.isConnected()) {
session.disconnect();
}
}
}
public static List<String> readFile(String userName, String host, int port, String password, String fPath){
BufferedReader reader = null;
List<String> ls = new ArrayList<>();
// 登錄sftp服務器
try {
ChannelSftp sftp = SftpUtils.login(userName,host,port,password);
// 構建文件輸入流,讀取文件內容取
reader = new BufferedReader(new InputStreamReader(sftp.get(fPath), StandardCharsets.UTF_8));
String str;
while((str = reader.readLine()) != null) {
ls.add(str);
}
reader.close();
//退出sftp
SftpUtils.logout();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
return ls;
}
public static void putFile(String userName, String host, int port, String password, String fPath){
try {
ChannelSftp sftp = SftpUtils.login(userName,host,port,password);
sftp.cd(fPath);
File file = new File("E:\\1212121212.txt");
FileInputStream fileInputStream = new FileInputStream(file);
sftp.put(fileInputStream, file.getName());
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
//退出sftp
SftpUtils.logout();
}
}
浙公網安備 33010602011771號