Ejecutar el comando que tiene variable en el servidor remoto a través de ssh

2

Quiero ejecutar un comando para cambiar la propiedad de los directorios / home. Ejemplo


Ejemplo:

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

Voy a cambiar la propiedad de estos directorios de esta manera:

[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

Yo uso un script para esto desde localServer. El guión es así:

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

Hay un problema en para lazo. Este bucle está funcionando en el servidor remoto local. Pero no puedo usar este comando en localServer como script remoto para remoteServer. Cuando intento este comando en localServer, la variable "$ i" tiene un valor ridículo como "17123891".

Gefolge
fuente
Intenta usar $$i en lugar de $i. Se escapará el $$ sobre el local servidor y el remoto el shell del servidor recibirá $i. No puedo probar esto ahora (por lo tanto, comentar), pero debería funcionar. Asegúrate de probarlo sin embargo.
Nathan.Eilisha Shiraini
Gracias por ayudar pero no funcionó.
Gefolge
2
@NathanShiraini tendría usuario \$ escapar $, $$ es para makefile
Archemar
Oh. Vi tu solución ahora @Archemar Gracias. Escribí esta solución como una respuesta a esta pregunta. Funciona. Si lo desea, puede agregar la respuesta y luego puedo aceptarla.
Gefolge
@Archemar De hecho, lo olvidé. Solo utilicé este truco en un Makefile, de ahí la confusión.
Nathan.Eilisha Shiraini

Respuestas:

2

Encontré el error con cambiar la respuesta de Nathan'a. La solución está usando un carácter "\" con cada "$" caracteres como "\ $". Así que el comando final es:

    #!/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
Gefolge
fuente
1

La solución más simple sería enviar el script y luego ejecutarlo.

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

para evitar el tiempo de espera múltiple

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

si cada /home/userX debe pertenecer a userX

puedes probar

"ls -d /home/* | xargs -L1 basename | while read h ; do chown \$h:group0 /home/\$h ; done"
Archemar
fuente
Gracias, es una solución útil. Encontré mi error. Te daré un voto positivo cuando tengo 15 representantes.
Gefolge