目录
创建sftp账号
linux sftp登陆
java通过sftp账号拉取文件
1. 创建sftp根目录
mkdir -pv /app/sftp/
2.授权chomd 0755
chmod 0755 -R /app/sftp
3.创建用户组(此处名为sftp)
groupadd sftp
4.创建user用户data并指定用户组,指定home存储目录,设置不能登陆
useradd -g sftp -d /app/sftp/data/ -s /sbin/nologin data
/sbin/nologin 和 /bin/false 区别
/sbin/nologin
礼貌拒绝用户登录,给出友好提示。
/bin/false
不允许登录系统,没有任何提示
指定用户home路径可单独用命令
5.手动修改用户密码
passwd data
6.查看用户data的属性
id data
7.创建用户目录下的操作目录
mkdir upload
8.授予用户操作权限
chown data upload
9.备份好配置并修改
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bak$(date +%Y-%m-%d)
末行添加配置
注释掉Subsystem sftp /usr/libexec/openssh/sftp-server
添加:
Subsystem sftp internal-sftp
Match User sftp
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
ChrootDirectory /app/sftp
①sftp data@127.0.0.1(sftp -P {port} {username}@{ip})
passwd:输入密码
②使用工具lftp
lftp sftp://{username}@{ip}:{port}
回车输入密码
1.添加依赖
jakarta.json jakarta.json-api 2.1.1
2.在配置文件中进行参数配置(也可不配置,直接在代码中写)
sftp:ip: xxx.xxx.xx.xxport: xxxtimeout: 60000retryTime: 3admin:username: xxxpassword: xxx
3.代码
import com.java.domaincollect.service.AuthDigAsync;
import com.jcraft.jsch.*;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;@Component
public class SftpTask extends Thread {private ChannelSftp sftp;private Session session;@Value("${sftp.admin.username}")private String username;@Value("${sftp.admin.password}")private String password;@Value("${sftp.ip}")private String host;@Value("${sftp.port}")private Integer port;@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate AuthDigAsync authDigAsync;/*** 建立sftp连接*/private void connect(){try {JSch jSch = new JSch();session = jSch.getSession(username, host, port);session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect();Channel channel = session.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;System.out.println("connect Complete ---------");}catch (JSchException e) {e.printStackTrace();}}/*** 关闭sftp连接*/public void close(){try {if (sftp != null) {if (sftp.isConnected()) sftp.disconnect();}if(session != null){if (session.isConnected()) session.disconnect();}} catch (Exception e) {e.printStackTrace();}}/*** 下载文件到本地** @param source 源文件* @param target 目标文件* @throws SftpException 异常* @throws FileNotFoundException 异常*/@SneakyThrowspublic void download(String source, String target) throws SftpException, FileNotFoundException {connect();InputStream inputStream = sftp.get(source);Reader reader = null;Date date = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");String format = simpleDateFormat.format(date);try {reader = new InputStreamReader(inputStream,"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}LineNumberReader lnr = new LineNumberReader(reader);String line = lnr.readLine();int sum = 0;List all=new ArrayList<>();while (line!=null) {System.out.println(line);all.add(line);sum += 1;line = lnr.readLine();if (all.size() == 100 || line == null) {stringRedisTemplate.opsForList().rightPushAll("domain" + format, all);all.clear();authDigAsync.getAuth(all);}}sftp.get(source,target);
// sftp.get(source, new FileOutputStream(new File(target)));}}
public void test(){try {System.out.println("start-----------------");sftpTask.download("/upload/result.txt","/opt");} catch (IOException e) {e.printStackTrace();} catch (SftpException e) {e.printStackTrace();}}