sudo

There are 2 entries for the tag sudo

Linux下以其他用户运行程序

MitchellChu 2015-07-29 Unix & Linux

  #1:runuser命令 runuser命令使用一个替代的用户或者组ID运行一个Shell。这个命令仅在root用户时有用。 仅以会话PAM钩子运行,并且没有密码提示。如果用一个非root用户,并且该用户没有权限设置user ID,这个命令将会因为程序没有setuid而失败。因runuser不会运行认证和账户PAM钩子,它比su更底层。 语法: runuser -l userNameHere -c 'command' runuser -l userNameHere -c '/path/to/command arg1 arg2' 举例来说,作为一个root用户,你也许想检查下oracle用户下的shell资源限制,输入: # runuser -l oracle -c 'ulimit -SHa' 或者监察下nginx或lighttpd web服务器限制: # runuser -l nginx -c 'ulimit -SHa' 或  # runuser -l lighttpd -c 'ulimit -SHa'  有时,root用户由于权限(安全)问题不能浏览NFS挂载的共享: # ls -l /nfs/wwwroot/cyberciti.biz/http 或者 # cd /nfs/wwwroot/cyberciti.biz/http 可能的输出: -bash: cd: /nfs/wwwroot/cyberciti.biz/http/: Permission denied 尽管如此,apache用户被允许浏览或访问挂载在/nfs/wwwroot/cyberciti.biz/http/下基于nfs的系统: # runuser -l apache -c 'ls -l /nfs/wwwroot/cyberciti.biz/http/' 或者 # runuser -l apache -c 'cd /nfs/wwwroot/cyberciti.biz/http/; vi index.php' 使用runuser命令,无需使用密码,并且,只能在root用户下使用。 可用选项: 1. -l: 让shell成为登录shell,用 runuser -l PAM 文件替代默认的 2. -g:指定主要的组 3. -G 追加组 4. -c:命令,要传到shell的单个命令 5. --session-command=COMMAND:使用-c传递单个命令道shell中并且不创建新的会话 6. -m: 不重置环境变量。     #2:su命令 su命令允许你成为一个超级用户或者替代用户(substitute user),欺骗用户(spoof user),设置用户(set user)或者切换用户(switch user)。它允许一个Linxu用户切换当前用户到那些你知道密码的目标用户,切换包括与之关联的运行中的控制台(console)或者Shell,它的语法如下: su - su - username   切换到root用户 su命令会询问目标用户的密码,在你的shell命令行中输入 su - 来切换到root用户(你必须知道root用户的密码): vivek@wks01:~$ su - 或者 vivek@wks01:~$ su - root 输出示例: Password: root@wks01:/root# logout vivek@wks01:~$ 如果输入了正确的root密码,会话的所有权(这里应该指当前控制台的上下文——译注)将改为root账户。输入logout可以退出一个root登录的shell,输入 whoami或者id命令来验证当前会话的所有者: whoami 或者 id   用root账户运行命令 语法是: su - root -c "command" # OR su - -c "command arg1"  查看/root目录下的内容,这些原本是普通用户无法访问的,运行: su - root -c "ls -l /root" 需要注意的是,Linix和一些Unix-like系统有一个wheel用户组,并且只允许这个组内的用户使用su切换到root。   使用su命令来让其他用户运行命令 下面这个命令是切换到oracle的账户,并且显示限制清单: $...

Linux普通用户无法使用sudo处理及sudoers设置

MitchellChu 2014-04-29 Unix & Linux

Linux下我们经常使用的SSH远程连接到系统进行操作,而为了安全,一般使用的是非root用户连接,只有在必要的时候,我们才会使用sudo切换到root帐户下进行操作,以保证系统尽可能的安全和不被损坏。然而,在有的时候我们通过普通用户SSH连接到Linux的时候,使用sudo来执行身份切换的时候,系统会报错(以下是CentOS6.4下的报错): 对不起,用户 yourusername 不能在 CentOS 上运行 sudo。 ## 如果直接运行命令sudo command,则是如下错误 yourusername 不在 sudoers 文件中。此事将被报告。 或者 Sorry,user yourusername may not run sudo on CentOS 或者(直接sudo+命令): yourusername is not in the sudoers file. This incident will be reported. 这种情况下,为了让我们的用户能够正常的使用sudo,需要通过修改/etc/sudoers文件。 #添加下面一行到:/etc/sudoers,即可让该用户使用sudo yourusername ALL=(ALL) ALL 这种修改是将所有的权限都赋值给了yourusername,为了sudo这个命令,就这么ALL几下,似乎有点不负责任啊,有木有? sudoers文件默认是只读的,因此不能直接修改。网上很多方法是使用chmod来修改sudoers的权限后再通过编辑器(vi/vim etc.)来修改sudoers内容,之后再将sudoers文件的权限恢复,来达到修改sudoers的目的。这种方法确实能够修改sudoers,但是却没有办法保证sudoers文件的正确性,如果修改出现错误,将导致sudoers(sudo)不能正常的工作。更正确的做法是直接使用sudoers的专用编辑器:visudo来编辑sudoers文件。 # visudo ## visudo默认的编辑器是vi,如果你需要修改你的默认编辑器,可以通过添加EDITOR="" 来修改。 # EDITOR="/usr/bin/vim -p -X" visudo ## 如果要永久改变默认编辑器,只要将EDITOR设置为环境变量 # export EDITOR="/usr/bin/vim -p -X"  使用visudo来编辑sudoers的好处是:当我们完成sudoers的编辑时,系统会自动检测我们sudoers的格式是否正确,从而保证sudoers文件的正确性。  其实,sudoers文件是非常简单的,其内容只包含两种,第一种是别名(Aliases,基本变量定义),第二种是用户规范描述(user specifications,指定某用户可以运行的内容)。而这两种内容都是通过扩展巴科斯范式(EBNF)1来进行定义。一旦定义了别名,在用户说明中,就可以使用别名来简化给用户定义运行内容。如果同一个用户在sudoers文件中能够找到多条说明,那么将使用找到的最后一条。 sudoers的别名包含四种:User_Alias,Runas_Alias,Host_Alias和Cmnd_Alias。 User_Alias是用户别名,这个和系统中的group有点类似。通过用户别名,在sudoers中,可以将一个或者多个用户用别名来替代。 ## 定义一个用户别名 User_Alias OPERATORS = operator1,operator2,remote_admin 注意: 1. 等号后面的都是系统中的用户名,用户ID,组,组id等组成,多个用逗号分隔,具体信息可参看文后参考内容sudoers2 2. 别名只能是大写字母开头的,并由大写字母,下划线和数字组成的字符串 Runas_Alias和User_Alias类似,但不同的是Runas_Alias指明的是用户将要运行命令的身份。Runas_Alias可以包含Runas_Alias别名(User_Alias是包含User_Alias别名)。 同时要注意的是,上面两个别名在匹配的时候使用的是字符串匹配法则,也就是说,当两个不同用户名的用户,即使使用了同一个用户ID,在实际情况下,也会被认为是不同的。要避免这种情况,可以考虑使用用户的ID来替代用户名。如: Runas_Alias ROOT = #0 ## 所有的用户ID为0的,统归为ROOT别名 Host_Alias是主机别名,指定规则适用的主机列表。 Host_Alias SERVERS = 192.168.0.1, 192.168.0.2, server1 注意: 1. Host_Alias中,只能使用真实的地址,这就意味着127.0.0.1这种地址是永远不会被匹配到的。而localhost要只有在真有主机的主机名为localhost的时候才能被匹配。 2. 如果IP地址没有给定掩码,sudo自动会搜寻本地网卡上对应匹配的掩码地址来作为默认的网络掩码。 Cmnd_Alias是命令别名,指定用户能够运行的某一类命令的列表。可包含一个,或多个命令(带参数),目录,或者其他的命令别名。 Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/reboot, /sbin/halt ##所有的关机命令 Cmnd_Alias ADMIN_CMDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/visudo ## 所有的用户管理命令 注意: 1. 命令列表中如果包含目录(以/结束),那么该目录下(不含子目录)的所有可执行文件都被赋予了执行权限,这和使用通配符*类似; 2. 命令列表中务必使用全路径名,如果不使用完全限定名,将意味着恶意用户可以创建同名文件并在切换后的用户下运行,这将给系统带来未知的安全风险; 3. 当命令列表中的命令需要带参数的时候,如果出现特殊字符(',',':','=','\'),将需要使用反斜杆('\')进行转义。 通过上面四种别名,我们能够定义出特定的用户,主机和命令列表,在实际运行中,我们如果要对这些特定的列表的某些运行时配置项3进行修改,我们可以通过Default来完成。 Default对于前面四种别名的限制格式各有不同,定义如下: ## EBNF Default_Entry ::= ('Defaults' |'Default' '@' Host_List |'Default' ':' User_List | 'Default' '!' Cmnd_List | 'Default' '>' Runas_List ) Parameter_List Parameter_List ::= (Parameter...

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。