最近遇到一点事,需要开放工作室服务器的网站目录上传文件权限,要求静态网站上传可以即传即用,考虑到简单起见我想到的办法是新建一个用户加入 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 其實只會讀取這兩個設定檔:

/etc/profile:這是系統整體的設定,你最好不要修改這個檔案;

~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬於使用者個人設定,你要改自己的資料,就寫入這裡

/etc/profile只有login shell才会读,每個使用者登入取得 bash 時一定会读取的设定档! 所以如果你想要帮所有使用者设定整体环境,那就是改这里

同样,/etc/profile会去呼叫外部的设定资料,底下这些资料会依次被呼叫进来

——引自鸟哥

总之对于 login shell ,系统读取的只有/etc/profile 一个文件,但是他会调用个人配置如~/.bash_profile,按顺序依次是读取,优先读取第一个配置,后面的配置不会生效,bash  之所以会读取这么多配置,主要是出于对其他 shell 的兼容:

~/.bash_profile

~/.bash_login

~/.profile

而且 ~/.bash_profile 会调用 ~/.bashrc ,也就是说最终 Login shell 读取的是~/.bashrc

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

而对于 non-login shell , 只会直接读取~/.bashrc,但是 bashrc 会调用/etc/bashrc(Debian 下是 /etc/bash.bashrc)

而这个/etc/bashrc主要有三个作用:

根据不同的UID,规范出UMASK的值

依据不同的UID ,规范出PS1, 也就是提示符的内容

呼叫/etc/profile.d/*sh目录中的内容

顺便一提

PS1

这玩意呢,是 interactive shell 具有的环境变量,用于确定提示符的样式。

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

source + 配置文件名

命令立刻使之生效.

对于 login shell 和 non-login shell 的区别,有个很简单的办法实践,那就是在自己家目录下建立一个.bash_profile 文件,写上 umask 002,保存退出shell 重新登录,随便新建一个文件,查看属性,bash 调出新的 shell ,再新建一个文件,对比他们的属性。

stardust@Chaos:~$ touch 1 #建立新文件1

stardust@Chaos:~$ ls -al 1 #查看属性是644,因为默认umask是022

-rw-r--r-- 1 stardust stardust 0 Dec 29 16:50 1

stardust@Chaos:~$ bash #采用 non-login 方式启动新 shell

stardust@Chaos:~$ touch 2

stardust@Chaos:~$ ls -al 2 #权限属性是644,因为目前没有修改

-rw-r--r-- 1 stardust stardust 0 Dec 29 16:50 2

stardust@Chaos:~$ nano ./.bash_profile #编辑bash_profile

stardust@Chaos:~$ bash #采用 non-login 方式启动新 shell

stardust@Chaos:~$ touch 3

stardust@Chaos:~$ ls -al 3

-rw-r--r-- 1 stardust stardust 0 Dec 29 16:51 3

#权限还是644,因为non-login shell没有读取 bash_profie

stardust@Chaos:~$ su -l stardust

Password: #su 加 -l 参数之后是 login shell

stardust@Chaos:~$ touch 4

stardust@Chaos:~$ ls -al 4 #权限已经变为664,自定义的 umask 生效

-rw-rw-r-- 1 stardust stardust 0 Dec 29 16:51 4

我本想通过简单测试验证这些加载顺序,但是没成功,那么就只能放一个别人的验证了:理解 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,目的达到

本文链接:https://www.starduster.me/2014/12/29/use-umask-to-config-sftp-upload-files/

本站基于 Creactive Commons BY-NC-SA 4.0 License 允许并欢迎您在注明来源和非商业使用前提下自由地对本文进行复制、分享或基于本文进行创作。

请注意:受限于笔者水平,本站内容可能存在主观臆断或事实错误,文中信息也可能因时间推移而不再准确,在此提醒读者结合自身判断谨慎地采纳。

linux修改sftp umask,配置 bash 默认的 umask 更改 SFTP 上传文件的权限相关推荐

  1. 修改form重定到iframe中,模拟异步上传文件的效果

    2019独角兽企业重金招聘Python工程师标准>>> <%@ page contentType="text/html; charset=GBK" lang ...

  2. Linux上传文件没有权限,添加文件权限命令

    1.进入需要被上传的目录中 cd 需要被上传的目录路径 2.获取root权限,这个命令切换用户为root,且不需要root的密码,输入当前用户的密码即可 sudo su 3.添加文件权限,-R可以让文 ...

  3. Java上传文件到Linux服务器

    将从数据库中查询出的数据,按照字段排序,数据之间以 "|"分隔,存储到文本文件中,上传到指定的服务器 下面分两种方法来进行实现:SFTP 和 FTP,一般使用 SFTP SFTP ...

  4. 腾讯云配置密钥使用putty登录 PuTTY实现Windows向Linux上传文件

    腾讯官方文档对密钥登录还存在一些问题,绑定密钥之后不能解绑,关机也不行. 腾讯默认情况下有两种配置方式,一种是将公钥存到腾讯服务器上,用户只能下载私钥,另一种是用户自己提供公钥和私钥.官方文档只给出第 ...

  5. sftp方式从windows上传文件到Linux服务器

    今天我一直用scp想实现从windows上传文件到Linux服务器,但是鼓捣了半天也没有实现.后来查资料才发现,scp实现文件的上传和下载貌似只能在Linux和Linux之间实现.(欢迎指正不对的地方 ...

  6. window linux上传文件命令,windows通过cmd命令行使用sftp上传文件至linux

    一问:sftp是什么? sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. ...

  7. linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf)

    linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf) 转载于:https://www.cnblogs.com/RichardLee/archiv ...

  8. php上传图片限制类型,php,_使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 。都是默认的配置,php - phpStudy...

    使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 .都是默认的配置 使用php的图片上传类进行图片上传,总是提示:上传文件时出错 : 未允许类型 .都是默认的配置 $upl ...

  9. Linux配置编程环境+云服务器上传文件

    Java环境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_2107771 ...

最新文章

  1. $digest already in progress 解决办法——续
  2. [译]WPF 应用程序和MVVM设计模式 ——Josh Smith
  3. MIT JOS学习笔记01:环境配置、Boot Loader(2016.10.22)
  4. 轻雨物联网解决方案:农业物联网的市场前景分析
  5. 使用HeartBeat实现高可用HA的配置过程详解
  6. java需求分析和设计,附面试题
  7. 汇编语言 王爽 【第四版】 第一章 检测点1.1
  8. 【Java笔记】Java开发实战经典 - 第六章
  9. Event representations with tensor-based compositions笔记
  10. python判断今天周几_如何用python判断今天是星期几
  11. 关于screenX、clientX、pageX, offsetX的相关介绍
  12. 使用VMware创建linux censo7系统--超简单的图文安装
  13. 数学建模常用算法:启发式优化算法合辑(内含多种智能优化算法,使用java实现算法、详细注释、并进行结果可视化)
  14. 制作一个简单HTML抗疫逆行者网页作业(HTML+CSS)
  15. eNSP配置静态路由及默认路由的三种案例
  16. vin端口是什么意思_振荡器基础1——为什么振荡器需要正反馈?什么是LC自激振荡器?...
  17. web综合 限时秒杀效果的制作
  18. 淘宝用户购物行为分析
  19. ArcGIS平台概述
  20. 工信部对多家涉及网络数据和用户个人信息安全突出情况的企业开展问询调查...

热门文章

  1. ORA-12520: TNS:监听程序无法为请求的服务器类型找到可用的处理程序
  2. TensorFlow 模型和权重的保存及预测
  3. android 命令截图,Android截图命令screencap
  4. “放下屠刀,立地成佛”
  5. python getopt使用_【python】getopt使用
  6. 数学建模-多属性决策
  7. 记录一下Java中final的作用
  8. C#中SelectNodes找不到节点
  9. LeeCode1623. 三人国家代表队
  10. 【Python】深入理解python格式化输出