首页 > 系统相关 >linux跨服务器传输文件

linux跨服务器传输文件

时间:2022-10-28 14:26:54浏览次数:80  
标签:String sftp 传输 ssh appadmin linux 服务器 SFTP public

 

借鉴以下文章:

sftp的用法:ChannelSftp类_zhougl996的博客-CSDN博客_channelsftp

JSch - Java实现的SFTP(文件上传详解篇) - longyg - 博客园 (cnblogs.com)

linux环境快速搭建sftp服务以及设置免密 - 渐逝的星光 - 博客园 (cnblogs.com)

SFTP创建目录和判断目录是否存在_@小顽皮的博客-CSDN博客_sftp判断目录是否存在

一、部署sftp服务

  1、创建sftp组 :

groupadd app

 

  2、创建一个用户,用户名为appadmin :

useradd -g app -s /bin/false appadmin 

 

  3、修改密码:

passwd appadmin

 

  4、app组的用户的home目录统一指定到/appadmin下:

mkdir -p /app/appadmin

 

  5、指定appadmin的home为/app/appadmin:

usermod -d /app/appadmin appadmin

 

  6、配置sshd_config:

vi /etc/ssh/sshd_config

 

  6.1、输入/Subsystem搜索到下列内容,然后注释:

# Subsystem app /usr/libexec/openssh/sftp-server

 

  6.2、在文件结尾处添加下面后保存:

复制代码
Subsystem app internal-sftp
Match Group app
ChrootDirectory /app/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
复制代码

 

  7、设定Chroot目录权限:

chown root:sftp /app/appadmin
chmod 755 /app/appadmin

 

  8、建立SFTP用户登入后可写入的目录:

mkdir/app/appadmin/upload 
chown sftp_upload:sftp /sftp/sftp_upload/upload
chmod 755 /app/appadmin/upload

 

  9、输入命令:

setenforce 0

 

  10、重启sshd服务:

service sshd restart

 

  11、ifcong查询ip,进行登录:

sftp [email protected]

若需要指定端口

sftp -oPort=22 [email protected]

二、配置ssh免密登录

  (本质是将需要登录的服务器的公钥数据加载到需要免密登录的服务器的authorized_keys文件中。【实际是配置ssh免密】)

  1.生成公钥私钥

  在需要连接sftp的服务器上执行  ssh-keygen -t rsa,称为当前服务器(注意选择好使用用户) 

   回车两次生成rsa公私钥文件,可打开/home/用户/.ssh/文件夹查看,id_rsa.pub为公钥,id_rsa为私钥,复制id_rsa.pub内容准备。

ssh-keygen -t rsa

 

  2.公钥追加进目标服务器的authorized_keys文件中,三种方式

1)直接手动追加:

在部署sftp服务器上,称为目标服务器,选择将要进行免密连接的用户,打开/home/用户/.ssh/文件夹,新建一个名为authorized_keys的文件,将复制过来的id_rsa.pub中的内容增加到authorized_keys文件中。(如没有则新建文件即可,注意将authorized_keys权限设置为600,.ssh文件夹设置为700)

 

2)公钥文件拷贝到目标服务器追加:可以使用命令scp /root/.ssh/id_isa.pub [email protected]:/root;

scp /root/.ssh/id_isa.pub [email protected]:/root

登录到目标服务器,进入该用户下的.ssh目录cd ~/.ssh,并公钥导入到authorized_keys信任列表,cat id_isa.pub >> /root/.ssh/authorized_keys

cat id_isa.pub >> /root/.ssh/authorized_keys

更新权限:chmod 600 authorized_keys,自此SSH免密登录配置完成。

 

3)直接命令连接目标服务器追加:直接使用ssh-copy-id命令去复制公钥自动写入到authorized_keys文件中,这样就不需要接下来的手动复制公钥操作了

ssh-copy-id -i /root/.ssh/id_isa.pub [email protected]

最后就可以sftp [email protected],或者ssh [email protected]

此处注意,需要更改.ssh和authorized_keys的owner,因为sftp_upload只支持sftp协议,所以需要在root账户下创建.ssh和authorized_keys后,执行一下命令:

chown -R sftp_upload:sftp /sftp/sftp_upload/.ssh(这个没有用到,作为记录)

 

三、代码使用sftp携带私钥登录传输文件

public class SFTPConstants {
    public static final String SFTP_REQ_HOST = "host";
    public static final String SFTP_REQ_PORT = "port";
    public static final String SFTP_REQ_USERNAME = "username";
    public static final String SFTP_REQ_PASSWORD = "password";
    public static final int SFTP_DEFAULT_PORT = 22;
    public static final String SFTP_REQ_LOC = "location";
   public static final String SFTP_PRVKEY_PATH = "prvKey";
   public static final String SFTP_PRVKEY_VALUE = "/home/appadmin/.ssh/id_rsa";
}


public class SFTPChannel {
    Session session = null;
    Channel channel = null;

    private static final Logger LOG = Logger.getLogger(SFTPChannel.class.getName());

    public ChannelSftp getChannel(Map<String, String> sftpDetails, int timeout) throws JSchException {

        String ftpHost = sftpDetails.get(SFTPConstants.SFTP_REQ_HOST);
        String port = sftpDetails.get(SFTPConstants.SFTP_REQ_PORT);
        String ftpUserName = sftpDetails.get(SFTPConstants.SFTP_REQ_USERNAME);
        String ftpPassword = sftpDetails.get(SFTPConstants.SFTP_REQ_PASSWORD);
      String prvKey = sftpDetails.get(SFTPConstants.SFTP_PRVKEY_PATH);
     int ftpPort = SFTPConstants.SFTP_DEFAULT_PORT; 
     if (port != null && !port.equals("")) { ftpPort = Integer.valueOf(port); } JSch jsch = new JSch(); // 创建JSch对象
     
     //根据是否使用免密登录,决定是否携带私钥      if(null != prvKey){        jsch.addIdentify(SFTPConatants.SFTP_PRVKEY_VALUE)      } session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名,主机ip,端口获取一个Session对象 LOG.debug("Session created."); if (ftpPassword != null) { session.setPassword(ftpPassword); // 设置密码 } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); // 为Session对象设置properties session.setTimeout(timeout); // 设置timeout时间 session.connect(); // 通过Session建立链接 LOG.debug("Session connected."); LOG.debug("Opening Channel."); channel = session.openChannel("sftp"); // 打开SFTP通道 channel.connect(); // 建立SFTP通道的连接 LOG.debug("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName + ", returning: " + channel); return (ChannelSftp) channel; } public void closeChannel() throws Exception { if (channel != null) { channel.disconnect(); } if (session != null) { session.disconnect(); } }      public void makeDir(String path, ChannelSftp sftp){     try{       if(isDirExist(path, sftp){         sftp.cd(path);        return;       }       String[] pathArray = path.split("/");       StringBuffer filePath = new StringBuffer("/");       for(String p : pathArray){         if(StringUtils.isBlank(p)){           continue;         }         filePath.append(p+"/");         if(isDirExist(filepath)){           sftp.cd(filePath.toString());         }else{           sftp.mkdir(filePath.toString());           sftp.cd(filePath.toString());         }       }       sftp.cd(path);     }catch(Exception e){       e.printStackTrace();     }        }   public void isDirExist(String path, ChannelSftp sftp){     boolean isDirExist = false;     try{       sftpATTRS sftpATTRS = sftp.lstat(path);       isDirExist = true;       return sftpATTRS.isDir();     }catch(Exception e){       if(e.getMessage().toLowerCase().equals("no such file"){         isDirExist = false;       }     }     return isDirExist;   }   public void upload(String srcPath, String dstPath, ChannelSftp sftp){     if(!this.isDirExist(dstPath, sftp)){       this.mkdir(dstPath, sftp);     }     try{       sftp.put(srcPath, dstPath);       sftp.quit();       this.closeChannel();     }catch(Exception e){       e.printStackTrace();     }   } }

 

标签:String,sftp,传输,ssh,appadmin,linux,服务器,SFTP,public
From: https://www.cnblogs.com/weice-blog/p/16835788.html

相关文章

  • 解决在宝塔面板IIS服务器上部署svg/woff/woff2字体的问题
    部署网站的字体和服务器IIS有什么关系?如果你的职责只限于一名前端开发,那么你可能很“幸福”地与这些问题擦肩而过,浑然不觉。可是本人一直都是孤军奋战,连开发环境都要......
  • 巴星项目服务器运维手册
    巴星项目服务器运维手册一、硬件介绍主机名服务器类型OS基本配置角色备注workstation01 工作站 winserver2013 20C,64G windows相关软件 workstation02 工作站 cen......
  • Linux高频命令
    Linux`pwd指令查看工作目录。cd指令切换工作目录。which指令查找一个执行文件所在的路径。ls显示文件信息。rm删除文件。touch修改一个文件的时间戳,如果文件不存在会触......
  • 【服务器数据恢复】RAID5出现异常后重新上线初始化中止,逻辑卷又被格式化的数据恢复
    服务器数据恢复环境:某医院存储服务器,存储了十几年的CT照片等文件的备份;8块硬盘中的7块硬盘作为数据盘组建RAID5,1块作为热备盘。服务器故障:医院方发现存储服务器中的数据......
  • Linux人生第三波
    ​​浅析Linux初始化init系统,第2部分​​​​Ubuntu的初始化系统工具Upstart​​​​一文彻底明白linux中的selinux到底是什么​​Watchdog​​​Linux高可用性方案之......
  • Linux open_datasync fdatasync fsync fsync_writethrough open_sync
    ​​函数sync、fsync与fdatasync总结整理​​​​PostgreSQLReplication之第二章理解PostgreSQL的事务日志(3)​​......
  • Linux环境下mysql数据库备份操作说明
    如下:一、 编写数据库备份shell脚本1、登录服务器,进入mysql安装目录。例:cd/usr/local/mysql2、创建目录dbBakShell和dbbak,用于放置数据备份脚本及备份文件mkdir d......
  • Kafka Server单节点部署(Linux 环境)
    Kafka单节点部署(Linux环境)运行环境:CentOS7.6x64JDK环境:JDK11(请参考JDK的安装和配置(Linux环境))一、Kafka安装包获取1-1kafka官网1-2WinSCP上传(注意:CentOS切换到ro......
  • Linux使用ifconfig命令没有显示ens33或者没有ip地址
    1.首先win+R输入services.msc进入服务窗口,看一下服务有没有启动2.修改网络配置文件ONBOOT修改为yesvi/etc/sysconfig/network-scripts/ifcfg-ens33---进入配置文件3......
  • linux - centos6 ops(持续更新)
    安装与网络配置​​下载​​VirtualBox网络:BridgedAdapter配置centos6:[root@localhost~]#cat/etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0HWADDR=08:00:27:5......