Executar comando que tem variável no servidor remoto via ssh

2

Eu quero executar um comando para alterar a propriedade dos diretórios / home. Exemplo

Exemplo:

[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)

Eu alterarei a propriedade desses diretórios assim:

[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

Eu uso um script para isso do localServer. O script é assim:

#!/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

Existe um problema no para loop. Esse loop está funcionando no remoteServer local. Mas eu não posso usar este comando no localServer como script remoto para remoteServer. Quando eu tento este comando no localServer, a variável "$ i" tem um valor ridículo como "17123891".

    
por Gefolge 21.07.2017 / 09:02

2 respostas

2

Eu encontrei o erro com a mudança da resposta do Nathan'a. A solução está usando um caractere "\" com cada caractere "$" como "\ $". Então o comando final é:

    #!/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 \ }'):groupO \$i; done;"
done
    
por 21.07.2017 / 12:45
1

A solução mais simples seria enviar o script e executá-lo.

for ...
do
   scp script.sh $ip:/tmp
   ssh $ip bash /tmp/sript.sh
   ssh $ip rm /tmp/sript.sh
done

para evitar vários tempos limite

for ...
do
   if scp script.sh $ip:/tmp
   then
      ssh $ip bash /tmp/sript.sh
      sh $ip rm /tmp/sript.sh
   fi
done

se cada /home/userX pertencer a userX

você pode tentar

"ls -d /home/* | xargs -L1 basename | while read h ; do chown \$h:group0 /home/\$h ; done"
    
por 21.07.2017 / 11:38