zoukankan      html  css  js  c++  java
  • 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,目的达到

  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/likwo/p/5690189.html
Copyright © 2011-2022 走看看