Linux 下实现普通用户只能写入某个目录

今天老婆问了我一个问题:如何在linux 下实现某个目录普通用户能够写入文件,但是不能删除或修改(只能由root 删除或修改)。开始的两分钟里,我初步判断这是做不到的,因为linux 下能 写入(w) 就代表着同时能 修改删除,命题是矛盾的。后面我又想到 粘滞位和 facl,幸好没有放弃,最后还是想到如何做到这个效果。下面是实验过程

首先起个目录用来做实验

[root@node1 data]# pwd
/data[root@node1 data]# mkdir sample

接着我们设置好目录的属组和权限


# 修改 sample 目录属组
[root@node1 data]# chown -R root:root sample# 修改 sample 目录权限,让组和用户都没有任何权限,也就是说
# 只有 root 能
# 1. 进入该目录
# 2. 向该目录写入文件
# 3. 修改或删除该目录中的文件
# 4. 执行该目录中的文件
# 其他组和用户什么都干不了
[root@node1 data]# chmod 700 sample
[root@node1 data]# 
[root@node1 data]# ll
total 0
drwx------ 2 root    root    6 Apr 20 12:14 sample

做完上面一步,普通用户是不能向进入 sample 目录,也不能修改或执行 sample 目录中的文件。如果有一个程序能够向该目录添加文件,那我们就通过粘滞位来提升一下普通用户的权限,并保证该程序对普通用户可用。程序需要自己编写,这里为了实验就直接用 mv 来替代,为了不影响系统,这里换了个名字叫 add

[root@node1 data]# cp /usr/bin/mv /usr/bin/add# 给 add 添加粘滞位,这样,其他用户使用 add 的时候就能提升为 root 权限,而 root 可以向 sample 目录写入文件
[root@node1 data]# chmod u+s /usr/bin/add
[root@node1 data]# ll /usr/bin/add
-rwsr-xr-x. 1 root root 130344 Nov  6  2016 /usr/bin/add

好了,到最后了,我们切换到普通用户,进行检验。看看对该目录的查改删是不是都可以(通过mv),看看通过 add(提升为root) 能不能向 sample 目录添加文件。

# 切到普通用户,如 kafka,创建一个文件
[kafka@node1 ~]$ touch file
[kafka@node1 ~]$ ll
total 0
-rw-rw-r-- 1 kafka kafka 0 Apr 20 12:28 file# 通过mv 添加文件到 sample 目录,失败了,因为普通用户没有权限写入
[kafka@node1 ~]$ mv file /data/sample/
mv: cannot stat ‘/data/sample/file’: Permission denied# 通过应用程序 add 添加文件到 sample 目录,执行成功了。因为执行时,权限会临时提升为 root
[kafka@node1 ~]$ add file /data/sample/# 查看和删除也都失败了
[kafka@node1 ~]$ ll /data/sample/
ls: cannot open directory /data/sample/: Permission denied
[kafka@node1 ~]$ rm -f /data/sample/file
rm: cannot remove ‘/data/sample/file’: Permission denied

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恢复Ext3下被删除的文件(转)

前言 下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件。 删除文件 假设我们有一个文件名叫 ‘test.txt’ $ls -il test.txt15 -rw-rw-r– 2 root root 20 Apr 17 12:08 test.txt 注意:: “-il” 选项表示显示文件的i-node号(15)…

TCP UDP HTTP 的关系和区别

TCP UDP HTTP 三者的关系: TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。 在应用层有HTTP、FTP、TELNET、SMTP、DNS等协议。 TCP…

微信开放平台全网发布时,检测失败 —— C#

主要就是三个:返回API文本消息,返回普通文本消息,发送事件消息 --会出现失败的情况 (后续补充说明:出现检测出错,不一定是代码出现了问题,也有可能是1.微信方面检测时出现服务器请求失败&…

Zabbix 钉钉报警

话不多说,咱们直接进入正题钉钉报警时基于zabbix,访问钉钉应用接口去推送的报警消息,所以我们需要一个在钉钉创建一个报警应用1、 我做的钉钉报警是基于钉钉自定义应用进行推送的所以需要登录钉钉管理后台进行创建(zabbix自定义应…

于敦德:途牛五大战略纵深不惧同质化竞争

于敦德说,途牛已经在目的地、出发地、产品系列、客户和品牌五个领域建立起了纵深壁垒,不担心任何局部竞争,将坚决把局部同质化战争打到底。 一个行业的两种公司 包括旅游在内的很多行业通常都有两种公司:…

自定义线程的方式

2019独角兽企业重金招聘Python工程师标准>>> package com.javaxxz.test;public class Demo extends Thread {/*** 创建线程的方式* 方式一:* 1、自定义一个类继承Thread类* 2、重写Thread类的run方法,把自定线程的任务代码写在run方法中* …

20155204 2016-2017-2 《Java程序设计》第8周学习总结

学号 2016-2017-2 《Java程序设计》第X周学习总结 教材学习内容总结 想要取得channel的操作对象,可以使用channels类,它定义了静态方法newChannel()。Buffer的直接子类们都有一个alloocate()方法,可以让你指定Buffer容量。1.java.util.loggin…

HALCON示例程序train_characters_ocr.hdev使用SVM分类器训练字体

HALCON示例程序train_characters_ocr.hdev使用SVM分类器训练字体 小哥哥小姐姐觉得有用点个赞呗! 示例程序源码(加注释) 蓝色字体均为算子解释链接,可以前往查看解答 关于显示类函数解释 read_image (Image, ‘ocr/chars_tra…

安装DirectX SDK时出现Error Code:s1023 的解决方案

安装DXSDK_Jun10时(下载地址:http://www.microsoft.com/en-us/download/confirmation.aspx?id6812 ) 出现下图所示错误 Error Code:s1023 计算机上有安装过更新版的Microsoft Visual C 2010 Redistributable,打开“…

顶级数据库行会Percona阿里全面解析下一代云数据库技术

摘要: 几年前,数据库管理系统的企业市场似乎还如同铜墙铁壁,除了老牌厂商外,其他厂商休想打进来。随着移动互联、物联网技术的发展,多终端应用的时代悄然而至。结构化与非结构化数据的爆发,推动人类社会进入…

C#指定窗口显示位置的方法

小哥哥小姐姐觉得有用点个赞呗! C#指定窗口显示位置的方法 1.使用StartPosition MainForm mainform; mainformnew MainForm (); dlgCtrl.StartPosition FormStartPosition.Manual;下面是FormStartPosition里边的定义与解释 // 指定窗体的初始位置。public …

C# 修改项目文件夹名称完全版

目录步骤1、打开项目,修改文件名称2、更改命名空间名称3、在解决方案中用txt1000替换所有test5004、使用记事本打开项目文件(.sln文件)修改路径5、更改项目文件夹名称6、删除之前的残留文件7、大功告成!!!&…

js中遍历注册事件时索引怎么获取

注意:这种写法,是有问题的。注册事件是在页面加载完毕以后就完成了,但此时并没有触发事件。事件触发是由用户在页面上点击时才会触发,所以说当用户点击时,才会执行事件处理函数,那么此时的i已经变成了4&…

C#DotNetBar TabControl将水平标签设置成竖直

小哥哥小姐姐觉得有用点个赞呗! 首先选中整个TabControl控件 更改属性: 完成

使用 Drone 构建 Coding 项目

2019独角兽企业重金招聘Python工程师标准>>> 使用 Drone 构建 Coding 项目 Drone 是一个轻量级的持续集成工具。它具备许多现代持续集成工具的特性:轻巧(Docker 镜像不到 10M)、部署方便(docker-compose 一键部署&…

Visual Studio Code 常用插件整理

常用插件说明: 一、HTML Snippets 超级使用且初级的H5代码片段以及提示 二、HTML CSS Support 让HTML标签上写class智能提示当前项目所支持的样式 三、Debugger for Chrome 让vscode映射chrome的debug功能,静态页面都可以用vscode来打断点调试、配饰稍…

川崎机器人c#通讯(转)

由于本人在工业自动化行业做机器视觉的工作,所以除了图像处理方面要掌握外,还需要与工业机器人进行通信。最近学习了计算机与川崎机器人的TCP/IP通信,于是在这里记录一下。 除了直接与机器人通信外,有一种方式是通过PLC间接通信&a…

模板类 Template Classes 以及模板类编译时的处理

我们可以建立template classes,使它们能够神奇地操作任何类型的资料。下面这个例子是让CThree 类别储存三个成员变量,成员函数Min 传回其中的最小值,成员函数Max 则传回其中的最大值。我们把它设计为template class&…

行转列及列转行查询

开发过程中常遇到行转列或是列转行的问题,即需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。 一、行转列:将原来同一列下多行的不同内容作为多个字段&#xff…

一、Java语言基础(4)_方法和数组——数组

2018-04-25 不悔梦归处,只恨未尽心 数组 一、一维数组 数组的含义:具有相同类型的多个变量按有序形式组织起来的数据形式。(数组是用来存储固定大小的同类型元素。)数组的定义:方式1(推荐使用)&…