基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录)。
1、如果只想让某些用户只能使用 sftp 操作文件, 而不能通过ssh进行服务器的管理,就需要先创建只能进行 sftp操作的帐号户(账户名随便起),如果sftp和ssh功能都需要,那么本地用户就可以,不需要新建。
2、限定用户的活动目录,使用户只能在指定的目录下活动,通过/etc/ssh/sshd_config配置文件的 ChrootDirectory 选项进行设置,需要进行ssh管理的帐号不要添加这个选项,添加完了以后ssh会不能登录,后面会说明。
一、新建用户和用户组
我们先添加用户名为test的用户和组名为test的组,只能进行 sftp操作的帐号户
#添加用户组 gtest
root@CentOS:~# groupadd gtest
#添加用户test 指定家目录 指定用户组
root@CentOS:~# useradd -d /home/test -m -g gtest test
如果只允许用户进行sftp操作,可以在命令后面加上-s /bin/false参数
#设置用户密码
root@CentOS:~# passwd test
二、设定你想要限定的活动目录
root@CentOS:~# mkdir /home/sftp
#配置权限 注意此目录如果用于后续的 chroot 的活动目录,目录开始一直往上到系统根目录为止的目录拥有者都只能是root!!!
root@CentOS:~# chown root /home/sftp/ #其实这个是不必要的因为我是用root创建的用户
三、用户既可以sftp传输文件又能 ssh 登录到服务器的配置方法
开启ssh服务的sftp子系统,添加下面选项中的一个到配置文件/etc/ssh/sshd_config不可以同时添加
root@CentOS:~#vi /etc/ssh/sshd_config
Subsystem sftp /usr/libexec/openssh/sftp-server #此选项默认已经存在
Subsystem sftp internal-sftp #此选项默认不存在
Subsystem选项的作用
配置外部子系统(例如文件传输守护程序)。参数应该是子系统名称(sftp)和在子系统请求时执行的命令(带有可选参数)。
如果命令为 /usr/libexec/openssh/sftp-server则sftp以独立进程的方式运行sftp服务。会在服务器上为sftp开启一个独立的进程,默认的选项,当客户端通过sftp命令登录服务器的时候,在服务器上可以查看到相应的进行:
-----------------------------------------
root@CentOS:~# 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/libexec/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 登录服务器
五、关闭SElinux
vi /etc/selinux/config
SELINUX=disabled #找到这项改成这个配置
如果不关闭SElinux,那么sftp 登陆成功后,没有读的权限,有如下的报错
---------------------------------------
sftp> ls
remote readdir("/"): Permission denied
---------------------------------------
六、配置完成 重启 服务器,使SElinux和ssh配置生效
root@CentOS:~# shutdown -r now
七、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要注意所使用的用户是否具有可读取远程服务器相应文件或目录的权限。