Debian9.5下sftp配置和scp用法



基於 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要注意所使用的用戶是否具有可讀取遠程服務器相應文件或目錄的權限。












免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM