我想运行一个命令来更改 /home 目录的所有权。示例
例子:
[root@remoteServer]# ls -l /home
drwxr-xr-x. 17 root root 4096 Sep 9 2014 user1
drwxr-xr-x. 17 root root 4096 Sep 9 2014 user2
drwxr-xr-x. 17 root root 4096 Sep 9 2014 user3
[root@remoteServer]#
[root@remoteServer]#id user1
uid=1101(user1) gid=1200(groupO)
[root@remoteServer]#id user2
uid=1102(user2) gid=1200(groupO)
[root@remoteServer]#id user2
uid=1103(user3) gid=1200(groupO)
我将像这样更改此目录的所有权:
[root@remoteServer]# ls -l /home
drwxr-xr-x. 17 user1 groupO 4096 Sep 9 2014 user1
drwxr-xr-x. 17 user2 groupO 4096 Sep 9 2014 user2
drwxr-xr-x. 17 user3 groupO 4096 Sep 9 2014 user3
我使用 localServer 中的脚本来实现此目的。该脚本如下:
#!/bin/bash
for ip in $(cat ipListFile)
do
ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o PasswordAuthentication=no $ip "for i in /home/*; do chown $(echo $i | awk -F"home/" '{ print $2 }'):groupO $i; done;"
done
有一个问题为了循环。此循环在本地远程服务器中运行。但我无法在本地服务器上将此命令用作远程服务器的远程脚本。当我在本地服务器上尝试此命令时,“$i”变量的值很荒谬,如“17123891”。
答案1
我发现 Nathan'a 的答案有误。解决方案是在每个“$”字符后使用一个“\”字符,如“\$”。因此最终命令是:
#!/bin/bash
for ip in $(cat ipListFile)
do
ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o PasswordAuthentication=no $ip "for i in /home/*; do chown \$(echo \$i | awk -F"home/" '{ print \$2 }'):groupO \$i; done;"
done
答案2
最简单的解决方案是发送脚本,然后执行它。
for ...
do
scp script.sh $ip:/tmp
ssh $ip bash /tmp/sript.sh
ssh $ip rm /tmp/sript.sh
done
避免多次超时
for ...
do
if scp script.sh $ip:/tmp
then
ssh $ip bash /tmp/sript.sh
sh $ip rm /tmp/sript.sh
fi
done
如果每一个都/home/userX
应该属于userX
你可以试试
"ls -d /home/* | xargs -L1 basename | while read h ; do chown \$h:group0 /home/\$h ; done"