• 使用sftp命令从linux系统A登录linux系统B 限制只能使用sftp登录,限制登录目录 可密码登录,可秘钥登录 一、在linux系统A上的操作 在/home中创建目录 #创建ftp用户家目录ftpuser mkdir /home/ftpuser #...

    目标:

    • 使用sftp命令从linux系统A登录linux系统B
    • 限制只能使用sftp登录,限制登录目录
    • 可密码登录,可秘钥登录
    一、在linux系统A上的操作
    1. 在/home中创建目录

      #创建ftp用户家目录ftpuser
      mkdir /home/ftpuser
      #创建用于放秘钥的.ssh目录
      mkdir /home/ftpuser/.ssh
      #创建一个zhangsan用户登录限定目录
      mkdir zhangsan
      
    2. 创建用户组ftpuser,所有使用sftp登录的用户都可以放到此组中,便于管理

      groupadd ftpuser
      
    3. 创建用户zhangsan

      #家目录/home/ftpuser 组ftpuser 禁止登录shell的用户/sbin/nologin 
      useradd -d /home/ftpuser -g ftpuser -s /sbin/nologin -M zhangsan
      
    4. 设置用户密码(为了使用密码登录)

      #根据提示输入两次相同密码
      passwd zhangsan
      
    5. 在sshd_config添加用户配置

      vi /etc/ssh/sshd_config
      #修改Subsystem
      Subsystem sftp internal-sftp
      #限制的用户,多个用户以逗号隔开
      Match User zhangsan
      #限制的用户组,多个用户组以逗号隔开
      #Match Group ftpuser 
      #不允许X11转发   
      X11Forwarding no  
      #不允许允许tcp端口转发,保护其他的tcp连接
      AllowTcpForwarding no
      #增加
      ForceCommand internal-sftp
      #用户的根目录,用chroot将用户的根目录指定到%h,%h代表用户home目录,这样用户就只能在用户目录下活动。也可用%u,%u代表用户名
      ChrootDirectory /home/ftpuser/%u
      
    6. 重启SSH服务

      systemctl restart sshd
      

      注:上面操作完成后就可以在linux系统B上直接使用密码登录啦,登录命令参考下面的第6条

    二、在linux系统B上的操作
    1. 先查看有没有.ssh目录

      ll ~/.ssh
      
    2. 如果上面查询没有,执行下面命令创建.ssh目录

      mdkir ~/.ssh
      
    3. 使用下面命令生成秘钥,遇到提示直接回车即可

      ssh-keygen
      
    4. 查看秘钥文件

      #使用下面命令查看秘钥文件,id_rsa是私钥,id_rsa.pub是公钥
      ll ~/.ssh
      
    5. 把公钥~/.ssh/id_rsa.pub内容追加到linux系统A(需要登录服务器)/home/ftpuser/.ssh/authorized_keys文件中

      #跨服务器复制,需要知道目的服务器登录密码
      scp ~/.ssh/id_rsa.pub roo@192.168.0.100:/home
      #在linux系统A中执行下面命令,把复制来的/home/id_rsa.pub内容追加到/home/ftpuser/.ssh/authorized_keys文件中
      cat /home/id_rsa.pub >> /home/ftpuser/.ssh/authorized_keys
      
    6. 密码登录

      #输入下面命令,根据提示输入密码(上面创建用户输入的密码)
      sftp -P 22 zhangsan@192.168.0.100
      #如果报下面登录异常
      Couldn't read packet: Connection reset by peer
      解决思路:
      	查看sshd_config配置是否正确;
      	使用命令`ll /home/ftpuser/`查看目录`zhangsan`所属用户是否root,使用命令`chown root:root zhangsan`来修改目录所属的用户和组
      
    7. 秘钥登录

      #输入下面命令,指定端口,指定私钥
      sftp -P 22 -i ~/.ssh/id_rsa zhangsan@192.168.0.100
      
    展开全文
  • Linux创建sftp用户

    2018-05-17 13:23:28
    最近做的一个需求涉及到使用sftp模式传输文件,所以本地虚拟机创建了一个sftp用户供文件上传测试,这里记录下虚拟机上搭建sftp服务的过程。1、创建连接服务器的sftp用户useradd -d/home/sftp1 -s /sbin/nologin test...

    最近做的一个需求涉及到使用sftp模式传输文件,所以本地虚拟机创建了一个sftp用户供文件上传测试,这里记录下虚拟机上搭建sftp服务的过程。

    1、创建连接服务器的sftp用户

    useradd -d/home/sftp1 -s /sbin/nologin testsftp

    /home/sftp1:sftp用户所在的目录,如果该目录已存在会报错

    testsftp:创建的sftp用户名


    2、修改创建的sftp用户的登录密码

    passwd testsftp

    3、修改sshd_config配置文件

    vim/etc/ssh/sshd_config

    添加如下代码:

    Subsystem       sftp  internal-sftp
    
    Match Usertestsftp

    注意需要将原来的

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

    注释掉,否则重启sshd服务会报错:


    4、修改sftp目录权限

    可以根据需要修改sftp用户目录为可读可写可执行权限

    chmod 777/home/sftp1

    5、修改好配置后重启sftp服务:

    service sshd restart

    查看sftp服务启动状态:

    service sshd status

    说明启动成功。

    6、使用sftp连接服务器

    可以在终端中直接使用sftp username@ip命令登录

    也可以使用终端连接工具比如xshell连接


    7、对于可能出现的一些问题大多是由于sshd_config配置的问题造成的,这里贴出我的机器上的配置,经测试可以成功,如果有特殊需求配置可以参考网络上其他人的介绍。

    #       $OpenBSD: sshd_config,v 1.93 2014/01/10 05:59:19 djm Exp $
    
    # This is the sshd server system-wide configuration file.  See
    # sshd_config(5) for more information.
    
    # This sshd was compiled with PATH=/usr/local/bin:/usr/bin
    
    # The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented.  Uncommented options override the
    # default value.
    
    # If you want to change the port on a SELinux system, you have to tell
    # SELinux about this change.
    # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
    #
    #Port 22
    #AddressFamily any
    #ListenAddress 0.0.0.0
    #ListenAddress ::
    
    # The default requires explicit activation of protocol 1
    #Protocol 22
    
    # HostKey for protocol version 1
    #HostKey /etc/ssh/ssh_host_key
    # HostKeys for protocol version 2
    HostKey /etc/ssh/ssh_host_rsa_key
    #HostKey /etc/ssh/ssh_host_dsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    
    # Lifetime and size of ephemeral version 1 server key
    #KeyRegenerationInterval 1h
    #ServerKeyBits 1024
    
    # Ciphers and keying
    #RekeyLimit default none
    
    # Logging
    # obsoletes QuietMode and FascistLogging
    #SyslogFacility AUTH
    SyslogFacility AUTHPRIV
    #LogLevel INFO
    
    # Authentication:
    
    #LoginGraceTime 2m
    #PermitRootLogin yes
    #StrictModes yes
    #MaxAuthTries 6
    #MaxSessions 10
    
    #RSAAuthentication yes
    #PubkeyAuthentication yes
    
    # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
    # but this is overridden so installations will only check .ssh/authorized_keys
    AuthorizedKeysFile      .ssh/authorized_keys
    
    #AuthorizedPrincipalsFile none
    
    #AuthorizedKeysCommand none
    #AuthorizedKeysCommandUser nobody
    
    # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
    #RhostsRSAAuthentication no
    # similar for protocol version 2
    #HostbasedAuthentication no
    # Change to yes if you don't trust ~/.ssh/known_hosts for
    # RhostsRSAAuthentication and HostbasedAuthentication
    #IgnoreUserKnownHosts no
    # Don't read the user's ~/.rhosts and ~/.shosts files
    #IgnoreRhosts yes
    
    # To disable tunneled clear text passwords, change to no here!
    #PasswordAuthentication yes
    #PermitEmptyPasswords no
    PasswordAuthentication yes
    
    # Change to no to disable s/key passwords
    #ChallengeResponseAuthentication yes
    ChallengeResponseAuthentication no
    
    # Kerberos options
    #KerberosAuthentication no
    #KerberosOrLocalPasswd yes
    #KerberosTicketCleanup yes
    #KerberosGetAFSToken no
    #KerberosUseKuserok yes
    
    # GSSAPI options
    GSSAPIAuthentication yes
    GSSAPICleanupCredentials no
    #GSSAPIStrictAcceptorCheck yes
    #GSSAPIKeyExchange no
    #GSSAPIEnablek5users no
    
    # Set this to 'yes' to enable PAM authentication, account processing,
    # and session processing. If this is enabled, PAM authentication will
    # be allowed through the ChallengeResponseAuthentication and
    # PasswordAuthentication.  Depending on your PAM configuration,
    # PAM authentication via ChallengeResponseAuthentication may bypass
    # the setting of "PermitRootLogin without-password".
    # If you just want the PAM account and session checks to run without
    # PAM authentication, then enable this but set PasswordAuthentication
    # and ChallengeResponseAuthentication to 'no'.
    # WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
    # problems.
    UsePAM yes
    
    #AllowAgentForwarding yes
    #AllowTcpForwarding yes
    #GatewayPorts no
    X11Forwarding yes
    #X11DisplayOffset 10
    #X11UseLocalhost yes
    #PermitTTY yes
    #PrintMotd yes
    #PrintLastLog yes
    #TCPKeepAlive yes
    #UseLogin no
    UsePrivilegeSeparation sandbox          # Default for new installations.
    #PermitUserEnvironment no
    #Compression delayed
    #ClientAliveInterval 0
    #ClientAliveCountMax 3
    #ShowPatchLevel no
    #UseDNS yes
    #PidFile /var/run/sshd.pid
    #MaxStartups 10:30:100
    #PermitTunnel no
    #ChrootDirectory none
    #VersionAddendum none
    
    # no default banner path
    #Banner none
    
    # Accept locale-related environment variables
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    
    # override default of no subsystems
    #Subsystem      sftp    /usr/libexec/openssh/sftp-server
    
    #Subsystem       sftp   internal-sftp
    #Match User testsftp
    
    Subsystem       sftp   internal-sftp
    Match User sftpuser
    # Example of overriding settings on a per-user basis
    #Match User anoncvs
    #       X11Forwarding no
    #       AllowTcpForwarding no
    #       PermitTTY no
    #       ForceCommand cvs server
    展开全文
  • $3 :用户密码 $4 : 本地文件路径 $5 :FTP服务器文件路径 $6 :mput/mget 命令 $7 :要操作的文件名称 cmdsftp.sh $1 : 主机IP $2 :用户名 $4 : 本地文件路径 $5 :FTP服务器文件路径 $6 :mput/mget 命令 $7 :...
  • 之前我服务器是使用的Windows Server 2003,这段时间由于访问量变大我还是机智的换成Linux了,在搭建FTP的时候看到网上都是推荐vsftpd,不过我不推荐...我推荐使用SSH自带的SFTPSFTP是Secure File Transfer Prot...

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com

    之前我服务器是使用的Windows Server 2003,这段时间由于访问量变大我还是机智的换成Linux了,在搭建FTP的时候看到网上都是推荐vsftpd,不过我不推荐这个家伙,看官且看下文。

    我推荐使用SSH自带的SFTPSFTPSecure File Transfer Protocol的缩写,安全文件传送协议。SFTP使用加密传输认证信息和传输的数据,所以使用SFTP是非常安全的。SFTP之于FTP可以理解为Https之于Http,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP

    **本文最终的效果:**在Linux下建立sftp-users用户组,在该组下建多个用户,禁止该组所有用户ssh远程登录服务器,但是允许该组所有用户登录sftp,并只能访问自己的目录及子目录中的文件。

    本文以admin用户为例,下面出现的admin均指该用户或者该用户目录。


    安装ssh和openssh-sftp-server

    其实Linux发行版基本都是安装了OpenSSH的,不过我们这里还是确认一下是否安装,
    一般我们需要安装openssh-serveropenssh-sftp-server,所以我们检查是否安装了SSH

    • Ubuntu检查是否安装了OpenSSH
    dpkg --get-selections | grep openssh
    
    • CentOS检查是否安装了OpenSSH
    # 以yum方式安装的:
    yum list installed openssh
    
    # 以rpm包安装的:
    rpm -qa | grep openssh
    
    # 以deb包安装的:
    dpkg -l | grep openssh
    

    如果已经三个包都安装了,那么你的命令行该是如下:

    openssh-server              installed
    openssh-sftp-server         installed
    ...
    

    哪个没有打印就是没有安装,安装即可。

    • Ubuntu 安装,依次执行以下命令,install后面只写没有安装的包名即可
    sudo apt-get update
    sudo apt-get install openssh-client openssh-server openssh-sftp-server
    
    • CentOS 安装,install后面只写没有安装的包名即可
    sudo yum install openssh-client openssh-server openssh-sftp-server
    

    如果都是安装的,我们需要保证OpenSSH的版本不得低于4.8,因为我们要用ChrootDirectory配置用户访问目录,所以检查下SSH的版本,执行命令ssh -V会打印出如下版本信息:

    OpenSSH_6.6.1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f...
    

    如果SSH的版本低于4.8,需要升级。

    • Ubuntu升级SSH
    sudo apt-get update
    sudo apt-get install openssh-server
    
    • CentOS升级SSH
    sudo yum update -y openssh-server
    

    建立用户组和用户

    我们要建立一个专门管理sftp用户的用户组,方便我们管理权限。
    1、建立一个名为sftp-userssftp用户组

    sudo groupadd sftp-users
    

    2、在该组建立几个需要登录sftp的用户

    新建用户名为admin的用户:

    sudo useradd -g sftp-users -m admin
    

    修改admin的密码:

    passwd admin
    

    然后连续两次输入你要给该用户设置的密码即可。

    3、如果该用户已存在,但是不在sftp-users组中,可以移动用户到改组

    usermod –g sftp_users admin
    

    配置ssh和权限

    1、打开/etc/ssh/sshd_config文件

    2、修改X11Forwarding的值为no,原来可能是:X11Forwarding yes,现在修改为X11Forwarding no,如果X11Forwarding不存在,就在文件最后添加上面的代码。
    修改AllowTcpForwarding的值为no,原来可能是AllowTcpForwarding yes,现在修改为AllowTcpForwarding no,如果AllowTcpForwarding不存在,就在文件最后添加上面的代码。

    3、修改Subsystem sftpinternal-sftp

    Subsystem sftp /usr/libexec/openssh/sftp-server
    # 或者
    Subsystem sftp /usr/lib/openssh/sftp-server
    

    现在修改为:

    Subsystem sftp internal-sftp
    

    4、在文件末尾增加内容

    Match Group sftp-users
        ChrootDirectory %h
        ForceCommand internal-sftp
    
    • Match Group sftp-users这一行是指定以下的子行配置是匹配sftp-users用户组的,多个用户组用英文逗号分隔。
    • ChrootDirectory %h该行指定Match Group行指定的用户组验证后用于chroot环境的路径,也就是默认的用户目录,比如/home/admin;也可以写明确路径,例如/data/www
    • ForceCommand internal-sftp该行强制执行内部sftp,并忽略任何~/.ssh/rc文件中的命令。

    这里要特别注意,因为ChrootDirectory %h模式,所以我们等下要设置sftp-users中的所有用户的用户目录权限为root拥有,否则sftp-users组中的用户无法用sftp登录。

    修改sftp-users用户组用户目录权限

    上面说了,因为使用了ChrootDirectory %h,现在来修改权限。

    1、修改权限为root用户拥有

    chown root /home/admin
    

    2、修改权限为root可读写执行,其它用户可读

    chmod 755 /home/admin
    

    3、重启ssh,登录sftp

    sudo service ssh restart
    

    现在就可以使用sftp登录了,但是我们发现,我们不能上传文件,那是因为登录后默认是用户目录,比如/home/admin,但是该目录是root用户拥有,因此我们还要修改权限。

    注意:centos7重启ssh的命令是sudo systemctl restart sshd.service,另外可以设置ssh为开机启动,命令是sudo systemctl enable sshd.service

    4、在用户目录下建立子目录,让sftp-users中的用户可读写文件
    我们现在在/home/admin目录下新建一个upload文件夹:

    cd /home/admin/
    mkdir upload
    

    5、授权upload文件夹读写
    让子文件夹upload属于admin

    chown admin /home/admin/upload
    

    让子文件夹upload被admin读写

    chmod 755 /home/admin/upload
    

    重启ssh,登录sftp

    现在全部都配置完了,如果在上面第三步没有重启ssh的话,现在重启后既可以登录使用了。

    sudo service ssh restart
    

    centos7.x的系统如果执行上面这个命令提示不存在,执行:

    sudo systemctl restart sshd
    

    Windows登录sftp推荐使用WinScpLinux用命令即可,Mac推荐使用Yummy FTP


    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com

    展开全文
  • 1.创建用户组sftp groupadd sftp 2.创建sftp登录账户user,将user用户设置为/bin/...useradd -s /bin/false -G sftp sftpuser 3.为sftp用户配置密码 passwd sftpuser 4.编辑/etc/ssh/sshd_config配置文件 vi /etc/ss...

    1.创建用户组sftp

    groupadd sftp

    2.创建sftp登录账户user,将user用户设置为/bin/false,这样就不会有登陆shell的权限,只能使用sftp连接

    useradd -s /bin/false -G sftp sftpuser

    3.为sftp用户配置密码

    passwd sftpuser

    4.编辑/etc/ssh/sshd_config配置文件

    vi /etc/ssh/sshd_config

    4.1 找到Subsystem这个配置项,修改为:
    Subsystem sftp internal-sftp

    4.2 文件尾部追加配置,让属于用户组sftp的用户只能访问自己的文件夹(备注这一段一定要放在UseDNS no这个配置后面要不然会报错)
    Match Group sftp
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp
    ChrootDirectory /data/sftp/ #sftp的根目录
    5.创建user的sftp访问文件夹,并修改文件夹属性

    mkdir /data/sftp/image

    chown root /data/sftp/image

    chgrp sftp /data/sftp/image

    给root用户和组分配权限(这边不授权的话连接的时候会出现
    Write failed: Broken pipe
    Couldn’t read packet: Connection reset by peer错误)

    chown -R root:root /data/sftp/

    给ftp用户user赋予image这个文件的权限(这边不授权的话会出现不能在image下创建文件以及文件夹)

    chown user:root /data/hysftp/image/

    也可以递归授权,这样就可以操作image下新建的文件夹里面的数据了

    chown -R user:root /data/hysftp/image/

    6.重启sshd服务

    service sshd restart

    附上java sftp工具

    package com.govmade.gds.common.core.util;
    
    import com.jcraft.jsch.*;
    import org.apache.poi.util.IOUtils;
    
    import java.io.*;
    import java.util.*;
    
    /**
     * SFTP工具类
     * @author dtt
     * @date 2019/12/13
     */
    public class SFTPUtil {
    
    	private ChannelSftp sftp;
    
    	private Session session;
    	/** SFTP 登录用户名*/
    	private String username;
    	/** SFTP 登录密码*/
    	private String password;
    	/** 私钥 */
    	private String privateKey;
    	/** SFTP 服务器地址IP地址*/
    	private String host;
    	/** SFTP 端口*/
    	private int port;
    
    
    	/**
    	 * 构造基于密码认证的sftp对象
    	 */
    	private SFTPUtil(String username, String password, String host, int port) {
    		this.username = username;
    		this.password = password;
    		this.host = host;
    		this.port = port;
    	}
    
    	/**
    	 * 构造基于秘钥认证的sftp对象
    	 */
    	public SFTPUtil(String username, String host, int port, String privateKey) {
    		this.username = username;
    		this.host = host;
    		this.port = port;
    		this.privateKey = privateKey;
    	}
    
    	public SFTPUtil(){}
    
    
    	/**
    	 * 连接sftp服务器
    	 */
    	public void login(){
    		try {
    			JSch jsch = new JSch();
    			if (privateKey != null) {
    				jsch.addIdentity(privateKey);// 设置私钥
    			}
    
    			session = jsch.getSession(username, host, port);
    
    			if (password != null) {
    				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;
    		} catch (JSchException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 关闭连接 server
    	 */
    	public void logout(){
    		if (sftp != null) {
    			if (sftp.isConnected()) {
    				sftp.disconnect();
    			}
    		}
    		if (session != null) {
    			if (session.isConnected()) {
    				session.disconnect();
    			}
    		}
    	}
    
    
    	/**
    	 * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
    	 * @param basePath  服务器的基础路径
    	 * @param directory  上传到该目录
    	 * @param sftpFileName  sftp端文件名
    	 */
    	public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{
    		try {
    			sftp.cd(basePath);
    			sftp.cd(directory);
    		} catch (SftpException e) {
    			//目录不存在,则创建文件夹
    			String [] dirs=directory.split("/");
    			String tempPath=basePath;
    			for(String dir:dirs){
    				if(null== dir || "".equals(dir)) continue;
    				tempPath+="/"+dir;
    				try{
    					sftp.cd(tempPath);
    				}catch(SftpException ex){
    					sftp.mkdir(tempPath);
    					sftp.cd(tempPath);
    				}
    			}
    		}
    		sftp.put(input, sftpFileName);  //上传文件
    	}
    
    
    	/**
    	 * 下载文件。
    	 * @param directory 下载目录
    	 * @param downloadFile 下载的文件
    	 * @param saveFile 存在本地的路径
    	 */
    	public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException {
    		if (directory != null && !"".equals(directory)) {
    			sftp.cd(directory);
    		}
    		File file = new File(saveFile);
    		sftp.get(downloadFile, new FileOutputStream(file));
    	}
    
    	/**
    	 * 下载文件
    	 * @param directory 下载目录
    	 * @param downloadFile 下载的文件名
    	 * @return 字节数组
    	 */
    	public byte[] download(String directory, String downloadFile) throws SftpException, IOException{
    		if (directory != null && !"".equals(directory)) {
    			sftp.cd(directory);
    		}
    		InputStream is = sftp.get(downloadFile);
    		return IOUtils.toByteArray(is);
    	}
    
    
    	/**
    	 * 删除文件
    	 * @param directory 要删除文件所在目录
    	 * @param deleteFile 要删除的文件
    	 */
    	public void delete(String directory, String deleteFile) throws SftpException {
    		sftp.cd(directory);
    		sftp.rm(deleteFile);
    	}
    
    
    	/**
    	 * 列出目录下的文件
    	 * @param directory 要列出的目录
    	 */
    	public Vector<?> listFiles(String directory) throws SftpException {
    		return sftp.ls(directory);
    	}
    
    
    	/**
    	 * 生成新的文件名
    	 *
    	 * @param fileName 文件名
    	 * @return 文件名
    	 */
    	private static String mkFileName(String fileName) {
    		return UUID.randomUUID().toString() + "_" + fileName;
    	}
    
    
    	/**
    	 * SFTP上传文件
    	 *
    	 * @param sftpHost Host
    	 * @param sftpUserName 用户名
    	 * @param sftpPassword 密码
    	 * @param sftpPort 端口
    	 * @param ftpPath 文件根路径
    	 * @param dateFileFolder 日期文件夹
    	 * @param file 文件
    	 * @return Map(原始文件名,sftp上的文件名)
    	 * @throws SftpException SftpException
    	 * @throws IOException IOException
    	 */
    	public static Map<String, Object> uploadFile(String sftpHost, String sftpUserName, String sftpPassword,
    												 int sftpPort, String ftpPath, String dateFileFolder, File file) throws SftpException, IOException {
    
    		Map<String, Object> fileMap = new HashMap<>();
    		SFTPUtil sftp = new SFTPUtil(sftpUserName, sftpPassword, sftpHost, sftpPort);
    
    		sftp.login();
    		InputStream is = new FileInputStream(file);
    
    		String fileName = file.getName();
    		fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
    		String newFileName = mkFileName(fileName);
    
    		sftp.upload(ftpPath,dateFileFolder, newFileName, is);
    		sftp.logout();
    		is.close();
    
    		fileMap.put("success", "true");
    		fileMap.put("fileName", fileName);
    		fileMap.put("newFileName", newFileName);
    
    		return fileMap;
    	}
    
    	public static void main(String[] args) throws IOException, SftpException {
    		File file = new File("C:\\Users\\dell\\Desktop\\***.txt");
    		//SFTPUtil s= new SFTPUtil("账号","密码","ip",端口);
    		SFTPUtil.uploadFile("ip","账号","密码",端口,"/image","2014-09-09",file);
    		//s.login();
    		//s.delete ("/image","e5d64641-bf72-4c00-a15f-30f6e2df9e46_systemTemplate.xlsx");
    		//s.download("/image","e5d64641-bf72-4c00-a15f-30f6e2df9e46_systemTemplate.xlsx");
    	}
    }
    
    
    展开全文
  • 概述Public Key认证的主要魅力在于认证时承诺不必提供密码就能够同远程系统建立连接。Public Key认证的基础在于一对密钥,public key和private key,public key对数据进行加密而且只能用于加密,private key 只能对所...

    概述

    Public Key认证的主要魅力在于认证时承诺不必提供密码就能够同远程系统建立连接。

    Public Key认证的基础在于一对密钥,public key和private key,public key对数据进行加密而且只能用于加密,private key 只能对所匹配的public key加密过的数据进行解密。

    我们把public key放在远程系统合适的位置,然后从本地开始进行ssh连接。

    此时,远程的sshd会产生一个随机数并用我们产生的public key进行加密后发给本地,本地会用private key进行解密并把这个随机数发回给远程系统。

    最后,远程系统的sshd会得出结论我们拥有匹配的private key允许我们登录。

    SFTP免密码登录操作方法

    1) 登陆服务端主机,在当前用户根目录执行(以RSA算法为例)

    如下命令:

    ssh-keygen –t rsa

    屏幕显示内容均可直接以回车使用默认项,此时在$home/.ssh目录下生成I d_rsa私钥(private key)及id_rsa.pub公钥(public key)两个文件。

    2) 将服务端的$home/.ssh/id_rsa.pub文件上传到客户端机的$home/.ssh目录下

    通过scp命令传到 客户端

    scp  $home/.ssh/id_rsa.pub username@client_ip:$home/.ssh

    在客户端机$home/.ssh目录下执行命令:

    cat id_rsa.pub >> authorized_keys

    3)将客户端各主机信息添加到$home/.ssh/known_hosts文件中

    例如:
    服务端IP是10.45.7.154
    客户端为:10.45.7.61

    在服务端执行 sftp usename@10.45.7.61命令提示如下:

    qdgcp@mdw:~/.ssh> sftp qmdb@10.45.7.61
    Connecting to 10.45.7.61...
    The authenticity of host '10.45.7.61 (10.45.7.61)' can't be established.
    RSA key fingerprint is ea:53:c8:cf:24:31:18:d8:47:68:8d:18:65:a4:e8:20.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '10.45.7.61' (RSA) to the list of known hosts.

    这样,在服务端的$home/.ssh/目录会出现一个known_hosts文件,客户端主机信息将添加到这个文件中。

    按上述方法实现服务端主机和客户端主机间的公私钥配对后,从服务端主机向客户端主机就可以实现同一用户名的sftp自动安全登陆操作了。


    注意:
    如果我在服务端使用root用户登录,并且执行了

     sftp oracle@10.45.7.61 
     或者
     ssh  oracle@10.45.7.61

    这个时候 在A上执行 ssh oracle@10.45.7.61是可以自动登录的,
    但是如果 仅仅 ssh 10.45.7.61 ,这个时候linux会自动获取当前登录用户,并赋予到 这个命令上,此时会变成 当前用户@10.45.7.61 ,但由于我们在root用户下执行的免密码登录,这个时候变成了oracle用户,虽然也是 ssh oracle@10.45.7.61,但是用户变了,所以同样的也不能自动登录。 如下图所示

    这里写图片描述

    退出ssh的话 输入 logout即可 ,如果退出sftp ,输入exit命令即可。

    说明:

    在配置ssh自动传输的时候注意,

    • .ssh目录的属主、属组使用当前用户与用户组,
    • .ssh目录的权限请保持700,
    • authorized_keys的权限为644,
    • id_rsa的权限为600,
    • id_rsa.pub的权限为644,
    • 同时检查用户$HOME目录权限必须为755。

    这里写图片描述

    确认权限 。
    r 4 w 2 x 1
    chmod 644 dir 通过chmod 赋权限。

    实操

    以下操作的是同一台主机, 一般都用于两台主机之间。

    [root@entel2 ~]# cd $HOME
    [root@entel2 ~]# ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    79:e6:c1:13:7d:05:39:8a:c8:e8:84:9f:8e:c6:0e:0f root@entel2
    The key's randomart image is:
    +--[ RSA 2048]----+
    |              .o.|
    |           .  o. |
    |     . o ....... |
    |    . o oo....   |
    |     + .S *      |
    |      +  + o     |
    |  E. o    .      |
    |   ++ .          |
    |   oo            |
    +-----------------+
    [root@entel2 ~]# cd .ssh/
    [root@entel2 .ssh]# ll
    total 24
    -rw------- 1 root root  1671 Nov  3 14:05 id_rsa
    -rw-r--r-- 1 root root   393 Nov  3 14:05 id_rsa.pub
    
    
    [root@entel2 .ssh]# cat id_rsa.pub >>authorized_keys
    
    [root@entel2 .ssh]# ll
    total 28
    -rw-r--r-- 1 root root   393 Nov  3 14:08 authorized_keys
    -rw------- 1 root root  1671 Nov  3 14:05 id_rsa
    -rw-r--r-- 1 root root   393 Nov  3 14:05 id_rsa.pub
    
    
    [root@entel2 .ssh]# sftp root@10.45.7.198
    Connecting to 10.45.7.198...
    The authenticity of host '10.45.7.198 (10.45.7.198)' can't be established.
    RSA key fingerprint is 5f:b5:f8:02:5a:b0:ad:6b:10:ce:6a:cc:53:55:68:c7.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '10.45.7.198' (RSA) to the list of known hosts.
    sftp> exit
    
    
    查看目录 出现了 known_hosts
    [root@entel2 .ssh]# ll
    total 32
    -rw-r--r-- 1 root root   393 Nov  3 14:08 authorized_keys
    -rw------- 1 root root  1671 Nov  3 14:05 id_rsa
    -rw-r--r-- 1 root root   393 Nov  3 14:05 id_rsa.pub
    -rw-r--r-- 1 root root   393 Nov  3 14:09 known_hosts
    
    
    [root@entel2 .ssh]# cat known_hosts
    10.45.7.198 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1WCBN8XDrGX2Ersub6U8CDtY2a0Ug5YT9fvqTcJm+DCQVj/DZVyvc5ODBC03iDp54ugSOToFluo1RabJjrTEZGMWjYKCZzEXRYO3sq4waGIP1D27bYLs9GW23VZUP0qwpmPKuJs8Asx7S1m9knoQO+wIeyQQt0gkw3TKM4QJSPAsfqSl0XuSTOczS9kbNTGOCpYoB7kThsE8Q87OqRLfjR2ePN3bDTL6RKX8iDm2PelQ2g+oAQCCmWlUF11TYwBahN0bKY7rNPsEQWlYpk0QGdNVTwMGy1j2DrlzoLSyuLfMu5+NgPVgx9MKmLfQlPVdFQyb/n5NShGxG+VAPA+6CQ==
    
    
    
    [root@entel2 .ssh]# ssh root@10.45.7.198
    Last login: Thu Nov  3 14:06:17 2016 from 10.45.22.168
    
    
    
    [root@entel2 ~]# sftp root@10.45.7.198
    Connecting to 10.45.7.198...
    sftp> 

    ssh特别慢故障

    背景:

    我们的应用中的QDG上传文件特别慢,文件目录很小,但是传了5个小时才传完,发现命令执行sftp/ssh 本机,也是非常的卡。 问题有可能出现在这里。


    过程:

    用 ssh -v 目标IP 来查看详细的连接建立过程

    这里写图片描述


    解决:

    使用root用户调整 /etc/ssh/ssh_config 修改 GSSAPIAuthentication yes 改为no

    这里写图片描述


    使用以下命令查看看ssh 连接时间

     time ssh xgj@172.25.146.14 exit

    修改配置后,重新启动QDG,秒传,问题得到解决。


    常见解决方法:

    1、在ssh服务端上更改/etc/ssh/sshd_config文件中的配置为如下内容:

    UseDNS no
    # GSSAPI options
    GSSAPIAuthentication no

    然后,执行/etc/init.d/sshd restart重启sshd进程使上述配置生效,在连接一般就不慢了。

    2、如果还慢的话,检查ssh服务端上/etc/hosts文件中,127.0.0.1对应的主机名是否和 uname -n的结果一样,或者把本机ip和hostname(uname -n结果)加入到/etc/hosts里。

    [xgj@entel2 ~]$ uname -n
    entel2
    [xgj@entel2 ~]$ cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.45.7.198 entel2
    [xgj@entel2 ~]$ 
    1. 利用ssh -v的调试功能查找慢的原因
      其实可以用下面的命令调试为什么慢的细节(学习这个思路很重要)。
    展开全文
  • Linux 添加SFTP用户

    2019-06-15 10:55:47
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • linux配置sftp服务器

    2017-06-09 12:00:11
    操作系统linux centos 7 添加用户组:groupadd sftp 添加用户并设置为sftp组sudo useradd -g sftp -s /sbin/nologin -M sftpsftp :用户修改sftp用户密码sudo passwd sftp 会提示你输入密码创建sftp用户的根目录并...
  • 最近在练习Linux相关配置用到 给sftp 连接用户设置访问目录的权限问题,查看了好多的资料博客,鸟哥Linux私房菜也找了相关文章来看如何解决,都没有好的解决方案,突然找到了以下这边文章,尝试的这大神的方法一步...
  • 详解Linuxsftp

    2018-07-07 09:23:08
    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器...
  • 请自行安装openssh。本人测试版本:openssh-clients-6.4p1-8.el7.x86_64openssh-server-6.4p1-8.el7.x86_64openssh-...下面为创建sftp用户,并且只能在自己的目录底下进行操作:1.创建sftp用户组 groupadd -g 10...
  • linux创建sftp账号

    2018-02-28 14:17:37
    提供sftp服务的有vsftpd和internal-sftp,这里用的是系统自带的internal-sftp,操作步骤如下: ...设置用户密码 passwd YSsftp 3.创建用户的根目录 mkdir /home/sftpFile 4.设置权限 设置目录权限,目录...
  • 首先 你的openssh-server版本至少得是4.8p1,因为配置权限需要版本添加的新配置项ChrootDirectory来完成...1. 我们需要创建一个用户组,专门用于sftp用户 # groupadd sftpusers  ps我里的用户组是sftpusers 2. 我们创
  • Linux上配置SFTP服务

    2017-05-14 21:50:20
    SFTP介绍sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似。 然而,sFTP 比 FTP 更安全;它通过加密 SSH 传输处理所有操作。 它可以配置使用几个有用的 SSH 功能,如...
  • 使用sftp指令,会自动请求用户输入密码。 总结一下可以避免sftp输入密码的三种方式: 1. lftp方式 LFTP是一款非常著名的字符界面的文件传输工具。支持FTP、HTTP、FISH、SFTP、HTTPS和FTPS协议。 例子:(本例...
  • sftp用户添加 添加用户组 groupadd sftpgroup 添加用户,并添加到组,禁止登录 useradd -s /sbin/nologin -g sftpgroup sftpuser 设置密码 密码需要输入两次 passwd sftpuser 设置用户home目录的权限 chmod 777 /...
  • 在一些生产环境中,有时,用户需要传数据到服务器,但是配置 ftp 服务比较麻烦,此时,我们可以为用户创建 sftp 账户,让用户使用 sftp 来上传下载所需的数据。sftp 账号即为系统账号,将账户密码用户用户除了能...
  • 最近搞一个sftp项目,用于给第三方公司上传文件,期间查询了很多种方式,依然无法限制目录,很苦恼,本次经过无数次试验,终于成功了。 提供sftp服务的有vsftpd和internal-sftp,这里用的是系统自带的internal-sftp...
  • linux 搭建SFTP服务器

    2019-08-28 16:00:11
    2019-8-28 填坑(给被坑的读者道歉!!!) 参考:http://www.koukousky.com/server/linux/217.html http://blog.csdn.net/zwl19920815/article/details/54893721 ... 在百度上看到一个回答:sftp 走的是ssh ...
1 2 3 4 5 ... 20
收藏数 8,856
精华内容 3,542