在shell脚本中有时需要使用sudo进行提权,运行包含这类脚本的文件时通常需要我们在终端输入sudo密码,但是在一些无人值守的应用中显然就不太适合了。本文通过构建一个多用户的ubuntu操作环境,来展示脚本中需要使用sudo命令时的应用场景。
我们都知道在linux的多用户下,用户之间是不能相互访问彼此的家目录的,如果要想访问其他用户的家目录必须使用sudo命令来提权。首先我在A用户的家目录下新建了一个脚本文件,我想使用这个脚本文件列出用户B家目录。
使用adduser
命令新建一个测试用户,在ubuntu中推荐大家使用adduser
命令,而不是useradd
命令。
adduser tom
执行上述命令后,在终端会以非常友好的提示帮助我们新建一个用户。
通过上述命令新建用户后,重启系统,用刚刚新建的用户登录系统。如果新建用户而未重启系统登录的话该用户的家目录是没有子目录的,只有重启登录后才会建全该用户家目录下的子目录。
接下来我们在当前用户目录下新建一个测试脚本文件,这个脚本用来列出新建用户tom的家目录。
vim ~/test.sh
使用vim命令新建一个test.sh
文件,添加以下内容。
#!/bin/bash
sudo ls -l /home/tom
给test.sh
脚本文件赋可执行权限。
sudo chmod +x test.sh
新打开一个终端,执行test.sh
脚本文件(注意要新开一个终端)。
你会发现终端停留在输入sudo密码界面了,如果我们脚本中包含提权才能进行的命令的话这种脚本会卡在输入密码这一步上,需要手动输入sudo密码脚本才能往下执行,这当然不是我们希望的,如果想让非root用户不输入密码就能执行sudo命令的话需要修改/etc/sudoers
文件。
首先修改/etc/sudoer
属性,添加可写属性(以下命令在root用户下执行)。
chmod 640 /etc/sudoers
在sudoers
文件的最后一行添加以下内容。
alfiy ALL=(ALL) NOPASSWD: /usr/bin/ls
修改完成后,保存退出,同时为了系统安全需要将sudoers文件的属性重新改成440.
新开一个终端,执行test.sh
脚本,你会发现脚本不会卡在输入密码那里了。