基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录)。

1、如果只想让某些用户只能使用 sftp 操作文件, 而不能通过ssh进行服务器的管理,就需要先创建只能进行 sftp操作的帐号户(账户名随便起),如果sftp和ssh功能都需要,那么本地用户就可以,不需要新建。

2、限定用户的活动目录,使用户只能在指定的目录下活动,通过/etc/ssh/sshd_config配置文件的 ChrootDirectory 选项进行设置,需要进行ssh管理的帐号不要添加这个选项,添加完了以后ssh会不能登录,后面会说明。

一、新建用户和用户组

我们先添加用户名为test的用户和组名为test的组,只能进行 sftp操作的帐号户

#添加用户组 gtest
root@debian:~# groupadd gtest
#添加用户test 指定家目录 指定用户组
root@debian:~# useradd -d /home/test -m -g gtest  test

如果只允许用户进行sftp操作,可以在命令后面加上-s /bin/false参数
#设置用户密码
root@debian:~# passwd test

二、设定你想要限定的活动目录
root@debian:~# mkdir /home/sftp
#配置权限 注意此目录如果用于后续的 chroot 的活动目录,目录开始一直往上到系统根目录为止的目录拥有者都只能是root!!!
root@debian:~# chown root /home/sftp/         #其实这个是不必要的因为我是用root创建的用户

三、用户既可以sftp传输文件又能 ssh 登录到服务器的配置方法

开启ssh服务的sftp子系统,添加下面选项中的一个到配置文件/etc/ssh/sshd_config不可以同时添加

root@debian:~#vi /etc/ssh/sshd_config

Subsystem      sftp    /usr/lib/openssh/sftp-server     #此选项默认已经存在

Subsystem      sftp    internal-sftp                    #此选项默认不存在

Subsystem选项的作用
配置外部子系统(例如文件传输守护程序)。参数应该是子系统名称(sftp)和在子系统请求时执行的命令(带有可选参数)。
如果命令为/usr/lib/openssh/sftp-server则sftp以独立进程的方式运行sftp服务。会在服务器上为sftp开启一个独立的进程,默认的选项,当客户端通过sftp命令登录服务器的时候,在服务器上可以查看到相应的进行:
-----------------------------------------
root@debian:~# ps -A | grep sftp
 1502 ?        00:00:00 sftp-server
-----------------------------------------
如果命令为internal-sftp 则sftp以ssh进程内方式运行sftp服务,不用为 sftp 再开一个进程,此时当客户端通过sftp命令登录服务器的时候,在服务器上就查看不到相应的进行了,不是默认的选项,需要先删除或注释掉默认选项,如果启用ChrootDirectory选项(限定用户的活动目录)就必须用这个命令,要不然就会在客户端通过sftp命令登录时候提示下面的错误:
-----------------------------------------
pipci@ubuntu:~$ sftp laopi@192.168.1.139
laopi@192.168.1.139's password:
Connection closed
-----------------------------------------

添加上面其中的任何一个选项后,就可以正常的通过sftp传输文件了,同时ssh登录也是可以的。

四、如果希望用户只能sftp传输文件而不能 ssh 登录到服务器,而且要限定用户的活动目录(锁定用户的根目录),继续看下面的配置

配置/etc/ssh/sshd_config文件
-------------------------------------------------------------
#注释掉这行
#Subsystem sftp /usr/lib/openssh/sftp-server
#添加在配置文件末尾
Subsystem sftp internal-sftp                   #指定sftp以ssh进程内方式运行sftp服务
Match User test                                #该参数指定以下的行将仅仅匹配test用户
ChrootDirectory /home/sftp/               #用chroot将指定用户的根目录,有权限要求,看下面注释
ForceCommand internal-sftp                     #强制执行internal-sftp命令而忽略客户端提供的任何命令

--------------------------------------------------------------

1、Match选项的用法:
Match [User|Group] userName|groupName

Match后面可以是用户也可以是用户组,Match 会对匹配到的用户或用户组起作用,同时该选项只会对该行下面的选项进行匹配,不会对全局配置起作用。所以只有在这里添加的用户
并且下面的选项也加上,才只能sftp传输文件而不能 ssh 登录到服务器,例如上面的test用户,如果本地的用户没做其他限制还是可以ssh 登录到服务器。
2、ChrootDirectory选项的用法:  
这个选项是用来设定用户的可活动目录,可以用 %h 标识用户家目录 %u 代表用户名 当 Match 匹配的用户登录后 会话的根目录会切换至此目录 这里要尤其注意下面几个问题

ChrootDirectory 目录开始一直往上到系统根目录为止的目录拥有者都只能是root,权限最大为 0755,这一点必须要注意而且符合 ,所以如果以非 root 用户登录时,我们需要在 ChrootDirectory 目录下新建一个登录用户有权限操作的目录

ChrootDirectory 一旦设定 则相应的用户(上面的例子为test用户)登录时会话的根目录 "/" 切换为此目录(如过不理解可以网上差下chroot的作用),如果此时相应的用户使用 ssh 而非 sftp 协议登录,则很有可能会被提示:

/bin/bash: No such file or directory

这则提示非常的正确,对于此时登录的用户,会话中的根目录 "/" 已经切换为你所设置的 chroot 目录,除非你的 chroot 就是系统的 "/" 目录,否则此时的 chroot/bin 下是不会有 bash 命令的,这就类似添加用户时设定的 -s /bin/false 参数,shell 的初始命令式 /bin/false 自然就无法远程 ssh 登录了

3、ForceCommand 选项的用法

这个选项用来强制执行这里指定的命令,忽略客户端提供的任何命令和脚本(如果存在),通常用于 Match 块中。 强制用户登录会话时使用的初始命令 如果如上配置了此项 则 Match 对应的用户只能使用 sftp 协议登录,而无法使用 ssh 登录 ,如果ssh登录会被提示

This service allows sftp connections only.

再次强调:

1、chroot 可能带来的问题,因为 chroot 会将会话的根目录切换至此,所以 ssh 登录很可能会提示 /bin/bash: No such file or directory 的错误,因为此会话的路径会为 chroot/bin/bash

2、ForceCommand 为会话开始时的初始命令 如果指定了比如 internal-sftp,则会提示 This service allows sftp connections only. 这就如同 usermod -s /bin/false 命令一样,用户登录会话时无法调用 /bin/bash 命令,自然无法 ssh 登录服务器

五、配置完成 重启 sshd 服务

root@debian:~# systemctl restart sshd.service

六、sftp命令用法:

1、登录到远程主机

pipci@ubuntu:~$ sftp user@ip

建立连接后, linux shell中的$提示符变成了sftp>  说明已经正常登录了。现在执行help, 可以看看sftp支持哪些命令。

2、切换路径
sftp> cd   [路径]  切换远程主机的目录
sftp> lcd  [路径]  切换本地主机的目录

2、显示目录列表
sftp> ls   [选项]  [路径]  显示远程主角目录列表
sftp> lls  [选项]  [路径]  显示本地主机目录列表

3、创建 删除目录
sftp> mkdir   [目录名]   在远程主机创建目录
sftp> lmkdir  [目录名]   在本地主机创建目录
sftp> rmdir   [目录名]   在远程主机移除目录
sftp> lrmdir  [目录名]   在本地主机移除目录

4、显示所在目录
sftp> pwd    显示远程主机工作目录
sftp> lpwd   显示本地主机工作目录

5、其他选项
sftp> rm        删除远程主机文件
sftp> version   显示协议版本
sftp> exit      退出 sftp
sftp> quit      退出 sftp
                  
6、远程主机下载文件
sftp> get [-r] [远端主机目录或文件] [本地主机目录]    
进行文件下载的sftp用户必须对本地主机的对应目录有写的权限,如果不指定本地主机目录则文件会存储到sftp登录时的本地当前目录。举例:下载文件
----------------------------------------------
sftp> get  /test/tif  /home/pipci
Fetching /test/tif to /home/pipci/tif
/test/tif                                    100%    5     0.0KB/s   00:00
----------------------------------------------

上面的复制成功,前提是sftp登录的用户必须对/home/pipci目录有写权限,如果要下载目录需要加上-r参数。

7、本地主机上传文件
sftp> put  [-r]  [本地主机目录]  [远端主机目录或文件]
进行文件的上传的sftp用户必须对远程主机的对应目录有写的权限,如果不指定远程主机目录则文件会存储到sftp登录时的远程主机的当前目录。举例:上传文件
----------------------------------------------
sftp> put  /home/pipci/Yozo_Officelog.txt  /test
Uploading /home/pipci/Yozo_Officelog.txt to /test/Yozo_Officelog.txt
/home/pipci/Yozo_Officelog.txt                100% 2625     2.6KB/s   00:00
----------------------------------------------
上面的复制成功,前提是sftp登录的用户必须对/test目录有写权限,如果要上传目录需要加上-r参数。

七、使用scp进行远程文件复制
scp就是secure copy,一个在linux下用来进行远程拷贝文件的命令。
有时我们需要获得远程服务器上的某个文件,该服务器既没有配置ftp服务器,也没有做共享,无法通过常规途径获得文件时,只需要通过简单的scp命令便可达到目的,但是
前提是复制的用户不能在ssh配置文件中设置chroot限制用户的根目录。如果设置了会提示/bin/sh: No such file or directory这样的错误。

scp命令用法:
上传文件
pipci@ubuntu:~$ scp  [-rp]  [本地主机文件或目录]  [user@ip]:[远程主机目录]
下载文件
pipci@ubuntu:~$ scp  [-rp]  [user@ip]:[远程主机文件或目录]  [本地主机目录]
参数说明:
 -r :递归方式负责目录所有文件
 -p :保留文件原有权限信息
 -P : 制定连接的端口号,这个P为大写的P

举例上传文件:
-------------------------------------------------
pipci@ubuntu:~$ scp  -r  /home/pipci/tidd/  laopi@192.168.1.139:/home/laopi
laopi@192.168.1.139's password:
hs_err_pid15960.log                           100%   91KB  90.7KB/s   00:00    
hs_err_pid15147.log                           100%   97KB  97.5KB/s   00:00
-------------------------------------------------
举例下载文件:
-------------------------------------------------
pipci@ubuntu:~$ scp  -r  laopi@192.168.1.139:/home/laopi/tidd  /home/pipci/
laopi@192.168.1.139's password:
hs_err_pid17040.log                           100%   98KB  97.5KB/s   00:00    
hs_err_pid9006.log                            100%   98KB  97.8KB/s   00:00
-------------------------------------------------

上传或下载重点在那个冒号(:),如果冒号两边都是文件或目录就是上传文件,如果冒号在文件或目录的左侧就是下载文件,冒号两边没有空格

注意两点:

1.如果远程服务器防火墙有特殊限制,scp便要走特殊端口,具体用什么端口视情况而定,命令格式如下:

pipci@ubuntu:~$ scp -rp 8443 /home/pipci/tidd/  laopi@192.168.1.139:/home/laopi

2.使用scp要注意所使用的用户是否具有可读取远程服务器相应文件或目录的权限。

Debian9.5下sftp配置和scp用法的更多相关文章

  1. CentOS6.9下sftp配置和scp用法

    基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录). 1.如果只想让某些用户只能使用 sftp 操作文件, 而不能通过ssh进行服 ...

  2. win10下vscode配置sftp

    sftp配置 1.在vscode中下载sftp插件 在vscode中快捷键 ctrl+shift+P 打开指令窗口,输入extension:install,回车,左侧即打开扩展安装的界面  在搜索框中 ...

  3. linux下ssh/sftp配置和权限设置

    基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录). 1.开通 sftp 帐号,使用户只能 sftp 操作文件, 而不能 ssh ...

  4. 末学者笔记--SSHD服务及SCP用法

    sshd服务讲解 1.SSHD服务 介绍:SSH 协议:安全外壳协议.为 Secure Shell 的缩写.SSH 为建立在应用层和传输层基础上的安全协议. 默认端口22 作用: sshd服务使用SS ...

  5. Centos下SFTP双机高可用环境部署记录

    SFTP(SSH File Transfer Protocol),安全文件传送协议.有时也被称作 Secure File Transfer Protocol 或 SFTP.它和SCP的区别是它允许用户 ...

  6. Linux下远程cp命令scp

    2014-2.19  PS1.在用此命令cpLinux与Linux之间的数据时发现有些服务器上默认没有安装scp但用yum -y install scp提示么有这样的包 后来发现原来scp工具的安装包 ...

  7. (转载)Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记

    Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记 Linux下配LMAP环境,花了我好几天的时间.之前没有配置过,网上的安装资料比较混乱,加上我用的版本问题,安装过程 ...

  8. SVN 在 linux 下的配置

    0.服务器主机需要打开websharing: sudo su (进入root,需要输入密码) apachectl start (没有反应即打开成功) 1.建立想要保存软件仓库的目录 最好在/users ...

  9. sftp配置多用户权限

    sftp配置多用户权限   工作需要,用户上传文件到目录下,用ftp不太安全,选择sftp.让用户在自己的home目录下活动,不能ssh到机器进行操作.   下面开始干活. 查看ssh版本 ssh - ...

随机推荐

  1. xBIM 基础16 IFC的空间层次结构

    系列目录    [已更新最新开发文章,点击查看详细]  本篇介绍如何从文件中检索空间结构.IFC中的空间结构表示层次结构的嵌套结构,表示项目,站点,建筑物,楼层和空间.如果您查看IFC文档, 您会发现 ...

  2. Scalable, Distributed Systems Using Akka, Spring Boot, DDD, and Java--转

    原文地址:https://dzone.com/articles/scalable-distributed-systems-using-akka-spring-boot-ddd-and-java Whe ...

  3. highcharts的使用:从数据库获取数据显示在图上

    //月产量统计图 function GetHighCharts() { var date = new Date(); var year = date.getFullYear(); var month_ ...

  4. (转载) Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框

    Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框 标签: Android清除功能EditText仿IOS的输入框 2013-09-04 17:33 70865人阅读  ...

  5. js中深拷贝代码实现

    function copy(original,o){ if(typeof original != 'object') return original; var o = o || (Array.isAr ...

  6. SpringMVC学习(二)——SpringMVC架构及组件(及其运行原理)-转载

    相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上一篇文章中SpringMVC的处理流程吗?  这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来说比 ...

  7. POJ 2481 Cows【树状数组】

    题意:给出n头牛的s,e 如果有两头牛,现在si <= sj && ei >= ej 那么称牛i比牛j强壮 然后问每头牛都有几头牛比它强壮 先按照s从小到大排序,然后用e来 ...

  8. 3ds Max绘制青花瓷茶壶

    1.在桌面找到3DMAX软件,左键双击,启动程序: 2.在命令案板中,找到几何体,茶壶,在顶视图绘制一个茶壶: 3.在百度图片中搜索,查找“青花瓷”,找到一个自己喜欢的精美图案,截图保存备用: 4.在 ...

  9. H5教程:移动页面性能优化

    随着移动互联网的发展,我们越发要关注移动页面的性能优化,今天跟大家谈谈这方面的事情. 首先,为什么要最移动页面进行优化? 纵观目前移动网络的现状,移动页面布局越来越复杂,效果越来越炫,直接导致了文件越 ...

  10. css实现步骤条

    实现效果 html <ul class="steps"> <li class="active">申请完成</li> < ...