在root模式对普通用户授权:
[[email protected] ~]# visudo ==vi /etc/sudoers
在vi编辑模式,输入98gg,调到98行:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
输入yy再输入p表示复制粘贴,并改为keke用户:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
keke ALL=(ALL) ALL
[[email protected] ~]$ useradd oldgirl
-bash: /usr/sbin/useradd: Permission denied
[[email protected] ~]$ sudo useradd oldgirl
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for keke:
[[email protected] ~]$ tail -1 /etc/passwd
oldgirl:x:501:501::/home/oldgirl:/bin/bash
给普通用户keke授予touch、useradd权限:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
keke ALL=(ALL) /bin/touch, /usr/sbin/useradd
(放具体路径作为权限)
[[email protected] ~]# su - keke
[[email protected] ~]$ sudo touch wuyike.txt
[sudo] password for keke:
[[email protected] ~]$ ll
total 0
-rw-r--r--. 1 root root 0 Mar 4 08:17 wuyike.txt
以后用sudo touch...时不需要再输入密码:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
keke ALL=(ALL) NOPASSWD:ALL
#keke ALL=(ALL) /bin/touch, /usr/sbin/useradd
另外,这条路进root不用密码:
[[email protected] ~]$ sudo su - root
[[email protected] ~]#
查找命令所在路径的方法可以有:
[[email protected] ~]# find / -type f -name "useradd"
/etc/default/useradd
/usr/sbin/useradd
[[email protected] ~]# whereis -b useradd
useradd: /usr/sbin/useradd
[[email protected] ~]# locate useradd
/etc/default/useradd
/usr/sbin/luseradd
/usr/sbin/useradd
/usr/share/man/fr/man8/useradd.8.gz
/usr/share/man/id/man8/useradd.8.gz
/usr/share/man/it/man8/useradd.8.gz
/usr/share/man/ja/man8/useradd.8.gz
/usr/share/man/man1/luseradd.1.gz
/usr/share/man/man8/useradd.8.gz
/usr/share/man/pl/man8/useradd.8.gz
/usr/share/man/ru/man8/useradd.8.gz
/usr/share/man/sv/man8/useradd.8.gz
/usr/share/man/tr/man8/useradd.8.gz
/usr/share/man/zh_CN/man8/useradd.8.gz
/usr/share/man/zh_TW/man8/useradd.8.gz
which命令:查找命令所在路径,搜索范围来自全局变量PATH变量所对应的路径
[[email protected] ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[[email protected] ~]# grep PATH /etc/profile
case ":${PATH}:" in
PATH=$PATH:$1
PATH=$1:$PATH
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
[[email protected] ~]# export PATH="/tmp:$PATH" 将tmp作为一个路径,临时地
[[email protected] ~]# echo $PATH
/tmp:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
临时修改:export PATH="/tmp:$PATH"
永久修改:前面临时修改的命令放到/etc/profile下,使用source /etc/profile使得修改立即生效。
PATH 系统路径变量:执行ls/cp/mv等非内置命令时,系统会首先查找PATH里对应的路径是否有,如果没有就报告找不到该命令。
当执行which cp来查看命令所在路径时,也是从PATH变量去搜索。
自己创建一个命令并查找:
[[email protected] ~]# touch /tmp/wuyike
[[email protected] ~]# chmod +x /tmp/wuyike 将"wuyike"变成一个命令
[[email protected] ~]# which wuyike
/tmp/wuyike
[[email protected] ~]# chmod -x /tmp/wuyike 将“wuyike”取消作为命令
[[email protected] ~]# which wuyike
/usr/bin/which: no wuyike in (/tmp:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
内置命令没有路径,在visudo中无法管理内置命令,只要which查不到的都是内置命令。
bash内置命令:
(1).:执行当前进程环境中的程序。同source。
(2). file:dot命令从文件file中读取命令并执行。
(3): 空操作,返回退出状态0。
(4)alias:显示和创建已有命令的别名。
(5)bg:把作业放到后台。
(6)declare [var]:显示所有变量,或用可选属性声明变量。
(7)dirs:显示当前记录的目录(pushd的结果)。
(8)disown:从作业表中删除一个活动作业。
(9)echo [args]:显示args并换行。
(10)enable:启用或禁用Shell内置的命令。
(11)bind:显示当前关键字与函数的绑定情况,或将关键字与readline函数或宏进行绑定。
(12)break:从最内层循环跳出。
(13)builtin [sh-builtin [args]]:运行一个内置Shell命令,并传送参数,返回退出状态0。当一个函数与一个内置命令同名 时,该命令将很有用。
(14)cd [arg]:改变目录,如果不带参数,则回到主目录,带参数则切换到参数所指的目录。
(15)command comand [arg]:即使有同名函数,仍然执行该命令。也就是说,跳过函数查找。
(16)eval [args]:把args读入Shell,并执行产生的命令。
(17)exec command:运行命令,替换掉当前Shell。
(18)exit [n]:以状态n退出Shell。
(19)export [var]:使变量可被子Shell识别。
(20)help [command]:显示关于内置命令的有用信息。如果指定了一个命令,则将显示该命令的详细信息。
(21)history:显示带行号的命令历史列表。
(22)jobs:显示放到后台的作业。
(23)kill [-signal process]:向由PID号或作业号指定的进程发送信号。输入kill-l查看信号列表。
(24)let:用来计算算术表达式的值,并把算术运算的结果赋给变量。
(25)local:用在函数中,把变量的作用域限制在函数内部。
(26)fg:把后台作业放到前台。
(27)getopts:解析并处理命令行选项。
(28)hash:控制用于加速命令查找的内部哈希表。
(29)logout:退出登录Shell。
(30)popd:从目录栈中删除项。
(31)pushd:向目录栈中增加项。
(32)pwd:打印出当前的工作目录。
(33)read [var]:从标准输入读取一行,保存到变量var中。
(34)readonly [var]:将变量var设为只读,不允许重置该变量。
(35)return [n]:从函数中退出,n是指定给return命令的退出状态值。
(36)set:设置选项和位置参量。
(37)shift [n]:将位置参量左移n次。
(38)stop pid:暂停第pid号进程的运行。
(39)suspend:终止当前Shell的运行(对登录Shell无效)。
(40)test:检查文件类型,并计算条件表达式。
(41)times:显示由当前Shell启动的进程运行所累计用户时间和系统时间。
(42)trap [arg] [n]:当Shell收到信号n(n为0、1、2或15)时,执行arg。
(43)type [command]:显示命令的类型,例如:pwd是Shell的一个内置命令。
(44)typeset:同declare。设置变量并赋予其属性。
(45)ulimit:显示或设置进程可用资源的最大限额。
(46)umask [八进制数字]:用户文件关于属主、属组和其他用户的创建模式掩码。
(47)unalias:取消所有的命令别名设置。
(48)unset [name]:取消指定变量的值或函数的定义。
(49)wait [pid#n]:等待pid号为n的后台进程结束,并报告它的结束状态。