sudo与用户权限
sudo,以root的身份另起新进程
注意:cd是shell内置的,不会另起新进程,故sudo cd会提示找不到命令
sudo使用当前用户密码,su使用切换用户的密码,默认切换为root
sudo通常仅改变$PATH等极少数环境,su切换大量环境
问题:
dirge@Linux:~$ sudo echo "ulimit -c unlimited" >> /etc/profile
bash: /etc/profile: Permission denied
分析:
这是因为重定向符号 “>>” 也是 bash 的命令。sudo 只是让 echo 命令具有了 root 权限,
但是没有让 “>>” 命令也具有root 权限,所以 bash 会认为这个命令没有写入信息的权限。
解决:
用sudo执行bash,将其它命令作为bash的参数
方式1
sudo bash
echo "ulimit -c unlimited" >> /etc/profile
exit
方式2
sudo bash -c 'echo "ulimit -c unlimited" >> /etc/profile'
注意:
单引号为字面串,双引号为解析串
ref:
[https://www.cnblogs.com/jankz/p/10889734.html]
env
env: 查看环境变量
set: 查看所有变量(包含自定义变量)
export: 将自定义变量转为环境变量
declare: 将环境变量转为自定义变量
注意:子进程仅会继承父进程的环境变量,不会继承父进程的自定义变量
login sehll(输入密码的形式)会读取 /etc/profile与~/.profile文件 (该文件又调用了~./bashrc)
non-login shell(ctrl + t等的形式打开shell)会读取~/.bashrc文件
source:在当前shell进程执行脚本
所以"source /etc/profile"需要反复执行,因为脚本文件/etc/profile只有在登录时才会执行。
正确的形式应当是修改~/.bashrc文件
sudo模式的env与用户模式的env不同,以$PATH为例
方案一:
sudo env "PATH=$PATH" command
方案一中的$PATH为当前环境变量的$PATH
bash会先将变量替换再执行sudo语句。
不替换的方式:双引号改为单引号,则为字面串。
如
echo 'echo $PATH' | bash
echo 'echo $PATH' | sudo bash
或者
bash -c 'echo $PATH'
sudo bash -c 'echo $PATH'
注意sudo bash -c 'echo $PATH' 与 sudo bash -c "echo $PATH"的区别
方案二:
ln设置软链接
方案三:
通过命令visudo修改sudo配置文件
ref:
[https://unix.stackexchange.com/questions/83191/how-to-make-sudo-preserve-path]
用户和组
/etc/passwd:该文件记录了登录名,加密后的密码,用户ID(UID),组ID(GID,用户属主中首选属主的ID),注释,主目录,登录shell
登录shell为 "/bin/false", "/usr/sbin/nologin"时,用户无法登录shell
/etc/group:该文件记录了组名,加密后的密码,组ID(GID),用户列表
进程凭证
实际用户ID和实际用户组ID:登录shell从/etc/passwd文件中读取的第三、第四字段,创建进程时将从父进程中继承这些ID
有效用户ID和有效用户组ID:通常与上述实际ID相同,可通过系统调用或者set-UID和set-GID设置为可执行文件的属主ID。
当进程执行系统调用时,将结合euid,egid及辅助组ID一起确定进程的权限。
可执行文件还拥有两个特别的权限位set-UID位和set-GID位。
当设置了set-user-id和set-group-id权限位时,那么可执行位x标识被替换成s。进程运行时,有效用户ID和有效用户组ID为文件属主ID。
非特权用户可以通过chmod对自己拥有的文件进行设置set-UID/set-GID,特权用户能够对任何文件设置。
Linux系统常用的set-UID的程序有 passwd,mount,unmount,su; 常见的set-GID的程序为wall
可通过proc/PID/status文件查看进程凭证
总结:
进程的uid,gid,euid,egid通常为当前登录用户,
sudo执行的程序的uid,gid,euid,egid则为root,
设置了set-UID/set-GID的程序的 euid/egid 则为文件属主。
文件属性
- 文件时间戳
- 上次访问时间
- 上次修改时间
- 上次文件状态发送改变时间
文件属主
新建文件属主 = 进程有效用户ID,进程有效用户组ID文件权限
st_mode:
| | | | | U | G | T | R | W | X | R | W | X | R | W | X |
—————————————————————
前4位标志文件类型,后12位标志权限,其中U = SUID,G = SGID,T = sticky
普通文件
可执行需要同时具备读权限和执行权限目录文件
可读:访问文件列表
可写:可创建文件/可删除文件
可执行:可访问目录中的文件的内容或i节点信息
访问文件需要有路径名所列所有目录的可执行权限
目录内添加删除文件需要同时有可写与可执行权限
目录可读不可执行:只能查看目录的文件列表,不能访问目录内的文件内容和i节点信息
目录可执行不可读:不能列出目录下的文件内容,若已知文件名称,仍可对其访问
sudo与用户权限的更多相关文章
- 为linux普通用户添加超级用户权限sudo
问题:假设用户名为:ali如果用户名没有超级用户权限,当输入 sudo + 命令 时, 系统提示: ali is not in the sudoers file. This incident wil ...
- Linux学习笔记——使用指定的用户权限执行程序——sudo
sudo可以用来以其他用户身份执行命令,sudo命令可以针对单个命令授予临时权限.sudo仅在需要时授予用户权限,减少了用户因为错误执行命令损坏系统的可能性. 1:sudo的帮助信息如下: ...
- linux普通用户权限设置为超级用户权限方法、sudo不用登陆密码
以用户zato为例 普通用户权限设置为超级用户权限 进入有超级用户权限的账号 添加文件可写(w)权限 sudo chmod u+x /etc/sudoers 编辑/etc/sudoers文件 添加语句 ...
- CentOS用户权限管理--su与sudo
Linux权限管理--su与sudo 1.su用来切换登录的用户,比如当前用户为chen,可以用su zhu,并输入用户zhu的登录密码,就可以切换到用户zhu.如果一个普通用户想切换到root用户, ...
- Ubuntu Linux---控制用户权限:root特权/sudo
借了本<Ubuntu Linux指南>开始学学乌邦图吧,熟悉之后再下个红帽来玩玩,现在说说我们一直提到的root,但是在Linux中,这个root有所不同...大多数Linux系统都为一个 ...
- 【Linux】sudo用户权限管理
权力下放 一.权力分配- sudo Sudo是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的"权力",让 他们执行一些只有超级用户或其他特 ...
- linux命令-sudo普通用户拥有root权限
普通用户权限不够 [root@wangshaojun ~]# su - dennywang[dennywang@wangshaojun ~]$ ls /root/ls: 无法打开目录/root/: 权 ...
- sudo控制用户对系统命令的使用权限
sudo控制用户对系统命令的使用权限 sudo相关概念 普通用户涉及到超级权限的运用,管理员如果想让该普通用户通过su来切换到root获得超级权限,就必须把root权限密码告诉用户.但是如果普通用户有 ...
- root用户和sudo使用root权限的区别(转)
百度百科:https://baike.baidu.com/item/sudo/7337623?fr=aladdin sudo指令 功能: 以root的身分执行命令 语法: sudo 其他指令 用户: ...
随机推荐
- Gym 102055B Balance of the Force
大意: $n$个骑士, 第$i$个骑士若加入光明阵营, 那么能力值$L_i$, 加入黑暗阵营, 能力值$D_i$. 给定$m$个限制$(u_i,v_i)$, 表示$u_i,v_i$不能在同一阵营. 求 ...
- JavaNetty心跳监控
import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; import java ...
- C#解压、压缩高级用法
压缩:(可以吧要排除的文件去掉) /// <summary> /// 压缩文件夹 /// </summary> /// <param name="folder& ...
- docker容器日志管理(清理)
原文:docker容器日志管理(清理) 前言 在使用docker容器时候,其日志的管理是我们不得不考虑的事情.因为docker容器的日志文件会占据大量的磁盘空间.下面介绍的就是对docker容器日志的 ...
- [jsp学习笔记]servelt get post
1.post提交数据是隐式的,get是通过在url里面传递的(可以看一下你浏览器的地址栏),用来传递一些不需要保密的数据. 2.用get时,传输数据的大小有限制 (注意不是参数的个数有限制),为2K: ...
- 常用的MySQL命令
1.新建数据库: create database person; 2.使用数据库 use person: 3.创建一个表格 create table student ( id int(10) not ...
- 各种GAN的学习和总结
GAN: https://www.cnblogs.com/kk17/p/10046884.html WGAN: https://www.cnblogs.com/Allen-rg/p/10305125. ...
- Java新功能之方法引用
方法引用的使用 最初,引用只是针对引用类型完成的,也就是只有数组.类.接口才具备引用操作.JDK1.8后追加了方法引用.实际上引用的本质就是别名. 因此方法的引用就是别名的使用. 方法的引用有四种形式 ...
- iOS应用图片尺寸制作脚本
1.前提说明 通常 2.代码使用说明 2.1 脚本基本代码 #!/bin/sh iPhoneIcon() { sips -z 30 25 if_connected_green.png --out ./ ...
- redis 异常 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. 解决方 ...