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

2023-05-16

最近遇到一点事,需要开放工作室服务器的网站目录上传文件权限,要求静态网站上传可以即传即用,考虑到简单起见我想到的办法是新建一个用户加入 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 允许并欢迎您在注明来源和非商业使用前提下自由地对本文进行复制、分享或基于本文进行创作。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 获取变量的名称作为输入并使用该名称更改变量

    我从脚本用户那里获取变量的名称作为第一个参数 并将该变量的值回显到控制台 bin bash variablename 1 echo The value of variablename is variablename 这太棒了 我无法开始工作
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • Linux 上的用户空间能否实现本机代码的抢占式多任务处理?

    我想知道是否可以在 Linux 用户空间的单个进程中实现本机代码的抢占式多任务处理 也就是说 从外部暂停一些正在运行的本机代码 保存上下文 交换到不同的上下文 然后恢复执行 所有这些都由用户空间精心安排 但使用可能进入内核的调用 我认为这可
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • Bash 正则表达式——似乎无法匹配任何 \s \S \d \D \w \W 等

    我有一个脚本试图从 gparted 获取信息块 我的数据如下所示 Disk dev sda 42 9GB Sector size logical physical 512B 512B Partition Table msdos Number

随机推荐