通过 ssh 运行远程服务器中含有变量的命令

通过 ssh 运行远程服务器中含有变量的命令

我想运行一个命令来更改 /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"

相关内容