linux下的umask()函数,[转载]linux umask函数

2023-05-16

功能说明:指定在建立文件时预设的权限掩码。

语  法:umask [-S][权限掩码]

补充说明:umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。

参  数:

-S  以文字的方式来表示权限掩码。

文件:用八进制基数666,即无x位(可执行位)rw- rw-

rw-.执行位需由用户自行加入。

例一:设要生成的文件以rw- r--

r--这样的权限字出现,即真实权限用八进制表示为644,则被666基数减得022,022即掩码。使用umask 022。

注:033效果与022一样,假设使用033掩码进行设置,则真实权限应为633即rw- r-x r-x

,但前提规定文件不生成x位,所以文件的权限最终将以rw-r--r--出现。

目录:用八进制基数777

例二:设要生成的目录权限以rwxr-xr-x这样的权限字出现,即真实权限用八进制表示为755,则被基数为777的权限字相减后,得掩码022。则使用umask

022进行设置。

总结:

掌握二个要点,一、文件基数为666,目录为777,即文件无设x位,目录可设x位。二、chmod是设哪个位,哪么哪个位就有权限,而umask是设哪个位,则哪个位上就没权限。

============================================================================================

对文件夹操作比较有用的一个命令,设置新增文件的默认属性

umask 指令

umask (顯示設定值)

umask nnn

(設定umask,設定值為000~777的整數)

umask

指令的功能是用來“限定”每一個新增的檔案、目錄的基本使用權限(permission)。譬如說當使用者以編輯器新產生的檔案,或者是從系統的某處拷貝來的新檔案,或者是以輸出重導向的方式產生的新檔案,或是以指令

mkdir 新建的目錄等等,一切新產生的檔案、目錄,它們的最初使用權限,均會受到這個內建指令 umask

的設定值所影響。就是我所說的“限定”。

指令裡的 nnn 所代表的意義與 chmod 指令的 nnn 相似。不同的是

chmod 指令 nnn 是“給於”使用或者是將要改變的許可權限,而 umask 則是“取消”nnn

的使用許可權限。這點是根本性的差異,使用者必須分清楚。

指令 umask

的設定值以三個八進位的數字“nnn”代表。第一個設定數字給使用者自己(owner

user),第二個則是設定給用使用者所屬的群體(group),第三個給不屬於同群體的其它使用者(other)。每一位數字的設定值都是三項不同權限的數值加總,read

權限數值為 4;write 權限數值為 2;execute 權限數值為 1。結合了前三者的權限數值,單一的數字可設定的範圍是 0 ~

7;整體的可設定範圍是 000 ~ 777。

要知道設定後會得到什麼結果。原則上,方法很簡單。就是用最大值減去設定值即可得到你想要知道的結果。對目錄而言最大值是

777;對檔案而言,最大值則是 666。這個方法對目錄而言完全正確;但對檔案而言會有無法應付的意外。

以下為了說明上的方便,我將以實際哂蒙希豢赡軙裼玫脑O定值 067

作為本節例子來加以說明。

譬如當你設定 umask 為 670 ,使用檔案的最大值 666

減去設定值 670,得到的是數值是 負4,已超出數值的定義範圍變成沒有任何意義的數值。但真正使用者會得到的結果卻是檔案對 other

開放 rw 權限;對 owner 與 group 關閉所有權限。所以使用者無法使用減去的方法來獲得完全正確的結果。

表面上,C shell 讓系統使用者使用 umask

時只需輸入一組 3

個數字的設定值。但是,這組設定值對於目錄及檔案卻有著不同的作用結果。所以農夫我打算更進一步地說明其中咦鞯募毠潱尶垂賯兡芡耆睦斫狻

對系統程式而言,內建指令 umask

的設定值實際上是群組化的參數,也就是 S_IRWXU、S_IRWXG、S_IRWXO。代表的群組情況如下:

S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR

S_IRWXG = S_IRGRP | S_IWGRP | S_IXGRP S_IRWXO = S_IROTH | S_IWOTH |

S_IXOTH也就是說 umask

所設定的三個數字,其實包含了九個不同意涵的參數,用來對映九種不同的使用權限,這些參數會被要產生檔案的程式,或者是要產生目錄的程式帶入並執行出結果。一個

C shell 的使用者必須要有能力完全掌握 umask 的設定,並演算出設定後所得到的結果。

系統在產生一個新目錄,會完全使用到上述的九種權限的參數,所以最大值是 777

,這對 umask

內建指令而言,可以很容易地使用減去權限的方法來獲得正確的結果。但在產生一個新檔案時,就不是如此。

系統在產生一個新檔案時,creat function 只取用 read 與

write 權限相關參數,也就是 access permission bits 裡的 S_IRUSR, S_IWUSR,

S_IRGRP, S_IWGRP, S_IROTH, S_IWOTH 來定義產生的檔案應該具有何種程度的權限。由於 read(數值

4) 與 write(數值 2) 的權限相加的結果是 6。所以最大的有效數值為 666。至於所有的 execute 權限(數值

1)在此被忽略(access permission bits 為 S_IXUSR, S_IXGRP, S_IXOTH),所以

creat function 在輸出時一律定義為

0,也就是無執行的權限。會對檔案如此限制的理由其實很容易理解。因為幾乎不可能有一個使用者他的所有檔案都絕對必要被固定成為給予

execute

權限(檔案包含的型態相當多,如文字檔、資料檔、圖形檔、執行檔等等),如果功能被如此設定的話,反而會造成相當多的系統漏洞,所以必須管制成必要時再由使用者自己來打開

execute 權限(這就是為什麼每當你新編輯完成的 C Shell script ,還要用指令 chmod

來加上可執行使用權限才能執行的原因)。

明瞭上述的原因之後,看官們您能理解,指令 umask

的設定值裡面,如果包含了 excute 權限,又咚惝a生檔案的使用權限時,應該要先減去(或者應該稱為

disable),才來作咚恪K援斣O定值為 670,其中是第二位數字是奇數,明顯的包含了 S_EXGRP 的數值,所以先減去

1,所已有效設定為 660。此時使用最大值 666 減去 660,得到的便是正確的檔案使用權限。

a4c26d1e5885305701be709a3d33442f.png農夫我使用最大值減去設定值的方式來說明,對一般的使用者應該能較容易理解與哂谩T谇耙话娴奈淖终f明中,我曾經提到計算的方式此用的是

XOR 咚惴▌t,它才是實際上程式的咚惴▌t。也就是設定值被程式拆成參數後的參數演算法則。我想學習過邏輯咚愕娜硕记宄 XOR

的咚惴绞剑ㄈ缬覉D所示)。

以下我使用設定值 067 當作例子,以 XOR

的演算法則來實際設定會應該得到的結果。

a4c26d1e5885305701be709a3d33442f.png

希望看官們,能理解以上的說明(農夫我發覺改寫後的版本,看起來實在相當囉唆)。以下提供一些比較常用的設定值供看官們參考:

檔案權限的最大值設定值結果代表的使用權限666002664rw-rw-r--666022644rw-r--r--666037640rw-r-----666077600rw-------

目錄權限的最大值設定值結果代表的使用權限777002775rwxrwxr-x777022755rwxr-xr-x777037740rwxr-----777077700rwx------

順便附上單一設定值與檔案及目錄的互動對照表,如下:

umask

設定值 檔案

使用許可權 目錄

使用許可權 0 rw- rwx 1 rw- rw- 2 r-- r-x 3

r-- r-- 4 -w- -wx 5 -w- r-- 6 --- --x 7 --- ---

假如使用者想要顯示 umask 的設定值,可鍵入指令

umask,設定值即會顯示出:

% umask

22

以上所顯示的設定值“22”即代表“022”。因第一個數字為“0”時不顯示。假如顯示值為“2”則代表“002”,顯示值為“0”則代表“000”。一般系統的常用的設定值有“002”、“022”、“037”或“077”等幾種。

接著我們實際來設定指令並觀看其使用結果:

5 % umask 022 ; umask

22

6 % ls -l > aa ; ls -l

aa

1 -rw-r--r-- 1 akira 61 Aug 31 11:32

aa

7 % mkdir dd ; ls -l

total 2

1 -rw-r--r-- 1 akira 61 Aug 31 11:32

aa

1 drwxr-xr-x 2 akira 512 Aug 31 11:33

dd/

一般而言如果使用者要自行設定或更改這個指令的設定值,最好的方式是將這個指令放在“~/.cshrc”檔案中,讓 C Shell

來為你執行。如果 login

後還有須要更動,可直接在指令行模式下鍵入指令重新設定之。如果使用者不自行設定則系統會給於系統的設定值,一般均為“022”。

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

linux下的umask()函数,[转载]linux umask函数 的相关文章

  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 在 C 中使用 sqrtf():“未定义对‘sqrtf’的引用”

    我正在使用Linux Ubuntu 12 04 https en wikipedia org wiki Ubuntu version history Ubuntu 12 04 LTS 28Precise Pangolin 29 Precis
  • 如何真正释放 Linux 中的大页面以供新进程使用?

    真的找不到太多关于此的信息 希望有人可以提供帮助 我正在假脱机使用 100GB java 堆作为大数据缓存 为了避免与文件系统缓存等内容发生冲突 并且因为它通常性能更好 我将其分配在大页面中 我保留了 51 200 x 2MB 大页面 一切
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • Linux下的C#,Process.Start()异常“没有这样的文件或目录”

    我在使用 Process 类调用程序来启动程序时遇到问题 可执行文件的层次结构位于 bin 目录下 而当前工作目录需要位于 lib 目录下 project bin a out this is what I need to call lib
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • 远程linux服务器到远程linux服务器大型稀疏文件复制 - 如何?

    我有两台 CentOS 5 4 服务器 每台服务器上都安装了 VMware Server 假设我始终对 vmware 虚拟机使用稀疏文件 将虚拟机文件从一台服务器复制到另一台服务器的最可靠 最快速的方法是什么 虚拟机的文件复制起来很痛苦 因
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0

随机推荐