umask 權限設置文章


文章來源 https://www.starduster.me/2014/12/29/use-umask-to-config-sftp-upload-files/

最近遇到一點事,需要開放工作室服務器的網站目錄上傳文件權限,要求靜態網站上傳可以即傳即用,考慮到簡單起見我想到的辦法是新建一個用戶加入 www-data 組,登錄目錄設在網站所在目錄下,要傳網站直接把文件丟上去就行(前提是這些網站都在同一個域名下,不然還需要另外配置 Server)。可是 SFTP 上傳的文件都是默認755,原本 vsftpd 可以用戶 local_umask 控制上傳文件權限,但是坑爹的硬件防火牆封了 FTP 端口,只能通過22端口。但是 SFTP 雖然名字里帶 FTP ,但是實際上 SFTP不是由 vsftpd 控制而是由 openssh 控制,SFTP 沒有專門的守護進程,也沒有獨立的配置文件(我在查了半天 vsftpd 相關問題之后才發現這一事實,暈死)

查看 openssh 的配置沒發現有 umask 的相關配置,應該只能改 bash 的環境配置了。

那么問題又來了,我在 /etc/passwd 中設置的登陸地址是網站所在地址,系統沒有自動生成 bash 的配置文件,於是乎我在手動建立了一個 .bash_profile ,里面填了一行 umask 002,重啟 sshd ,驚奇地發現沒有效果——原本權限777的文件上傳之后還是755。

仔細一想,bash 的配置文件好像不止一個,大概是 SFTP 讀取的配置不對?於是又去查了一下關於 bash 的配置,一查嚇一跳,還有這么多細節問題以前沒注意的。其中最大的問題就是 login shell 和 non-login shell 的區別:

定義:
login shell:取得bash 時需要完整的登入流程,就稱為login shell。
non-login shell:取得bash介面的方法不需要重復登入的動作。

login shell 和 non-login shell的最大區別在於讀取環境變量的配置文件不同,當系統啟動時或你開啟一個新到終端登錄系統時,系統通過調用/bin/login程序處理登錄並在 一個shell中顯示命令行提示符,這個shell就是login shell;該shell程序可以是bash也可以是sh或csh,具體使用哪種shell可以在/etc/passwd中設置(/bin/login程 序讀取該文件決定使用哪種shell)

舉例來說,同tty1~tty6登入時, 需要輸入用戶名和密碼,此時取得的bash就稱為login shell,通過 SSH 登陸啟動的 shell、或者使用 su -l 切換賬戶的時候調用的都是 login shell。
而以X window登入linux后,再以X 的圖形化介面啟動虛擬終端,此時不需要輸入用戶名和密碼,那個 bash 的環境就稱為non-login shell 。或者在原本的 bash 環境中使用bash 啟動新 shell,同樣沒有要求輸入用戶名和密碼,那個第二個 bash 也是 non-login shell。另外 su 命令執行時不指定 -l 參數、使用 bash -c 喚醒的新 shell 也是 non-login shell。

那么,由此可知 ,SSH 登陸和 SFTP 登陸所使用的 shell 應該是 login shell ,那么我們據此設置 bash 配置文件。

在這兩個取得bash的情況中,所讀取的設定檔並不一樣
login shell 其實只會讀取這兩個設定檔:

  1. /etc/profile:這是系統整體的設定,你最好不要修改這個檔案;
  2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬於使用者個人設定,你要改自己的資料,就寫入這裡

/etc/profile只有login shell才會讀,每個使用者登入取得 bash 時一定會讀取的設定檔! 所以如果你想要幫所有使用者設定整體環境,那就是改這里
同樣,/etc/profile會去呼叫外部的設定資料,底下這些資料會依次被呼叫進來

——引自鳥哥

總之對於 login shell ,系統讀取的只有/etc/profile 一個文件,但是他會調用個人配置如~/.bash_profile,按順序依次是讀取,優先讀取第一個配置,后面的配置不會生效,bash  之所以會讀取這么多配置,主要是出於對其他 shell 的兼容:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

而且 ~/.bash_profile 會調用 ~/.bashrc ,也就是說最終 Login shell 讀取的是~/.bashrc

坑爹呢繞這一大圈早知道我就改 bashrc 了嘛!

而對於 non-login shell , 只會直接讀取~/.bashrc,但是 bashrc 會調用/etc/bashrc(Debian 下是 /etc/bash.bashrc)

而這個/etc/bashrc主要有三個作用:

  1. 根據不同的UID,規范出UMASK的值
  2. 依據不同的UID ,規范出PS1, 也就是提示符的內容
  3. 呼叫/etc/profile.d/*sh目錄中的內容

順便一提 PS1  這玩意呢,是 interactive shell 具有的環境變量,用於確定提示符的樣式。

bash 默認引用個人配置使用的就是 source 命令,因此我們每次修改 bash 配置,可以使用

命令立刻使之生效.

對於 login shell 和 non-login shell 的區別,有個很簡單的辦法實踐,那就是在自己家目錄下建立一個.bash_profile 文件,寫上 umask 002,保存退出shell 重新登錄,隨便新建一個文件,查看屬性,bash 調出新的 shell ,再新建一個文件,對比他們的屬性。

更多關於 login shell 的測試參見login-shell和non login-shell區別 & bash配置文件實驗報告

我本想通過簡單測試驗證這些加載順序,但是沒成功,那么就只能放一個別人的驗證了:理解 bashrc 和 profile

另外附部分 bash man 手冊對這幾個配置文件的解釋:

/etc/profile
The systemwide initialization file, executed for login shells
系統全程的初始化文件,為登錄的shell所執行
~/.bash_profile
The personal initialization file, executed for login shells
個人的初始化文件,為登錄的shell所執行
~/.bashrc
The individual per-interactive-shell startup file
個人的交互式shell的起始文件

最后我在/etc/passwd 中登陸目錄下手動建立了一個 .bashrc 加了一句 umask 002,目的達到


免責聲明!

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



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