使用 kornshell 或 Perl 规避 root 所需的权限

使用 kornshell 或 Perl 规避 root 所需的权限

我遇到一个问题,我需要更改 200 多台服务器上存在的一个文件的所有权和权限。我属于 2 个不同的组,需要将所有权从一个组更改为另一个组。我还需要将权限设置为 644。如果我具有 root 访问权限,这可以轻松完成,但我没有。因此,我需要以一个用户身份复制文件,然后删除旧文件,然后将最近复制的文件重命名为旧文件的名称。这变得相当乏味,所以我想创建一个脚本来自动执行这些任务。我以为 kornshell 可以解决这个问题,但我的脚本似乎没有做任何事情。这是我到目前为止所拥有的:

锁主机.sh

#!/usr/bin/ksh
sudo su - oradba
cd config
chmod 644 hostenv.cfg
chown orainst hostenv.cfg
exit
sudo su - orainst
cd config
cp -p hostenv.cfg hostenv.cfgnew
rm hostenv.cfg
mv hostenv.cfgnew hostenv.cfg

我认为这会起作用,因为这些是我需要运行才能成功更改文件的所有权/权限的所有命令。

我需要做的就是更改 hostenv.cfg 文件由此:

-rwxrw---- 1 oradba  dba  4433 May  1 21:43 hostenv.cfg

对此:

-rw-r--r-- 1 orainst dba  4433 May  1 21:43 hostenv.cfg

我可以做什么来修复我的脚本?另外,如果我需要在我的脚本中构建用户提示来询问密码,那很好,但我认为系统会询问我。

当我尝试运行脚本时会发生以下情况:

lockhost.sh

我的用户已更改为 oradba,但没有发生任何其他事情...... 直到我输入 exit...

exit

logout
chmod: changing permissions of `hostenv.cfg': Operation not permitted
chown: changing ownership of `hostenv.cfg': Operation not permitted

答案1

问题是您sudo su ...生成了另一个 shell,并且只有当您exit从中退出时,脚本才会尝试继续。

假设您的sudo配置允许,您可以这样做:

sudo -iu oradba 'cd ... && chmod ... && chown ... '
sudo -iu orainst '...'

可以&&用分号代替,只是这样,你保证不会chmod尝试除非cd成功等等。

如果您的sudo配置不允许,您可以这样做:

sudo su -c 'cd ... & chmod ... && chown ... ' - oradba
sudo su -c '...' - orainst

相关内容