我遇到一个问题,我需要更改 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