cómo escribir un script de shell bash para ssh a una máquina remota y cambiar de usuario y exportar una variable env y hacer otros comandos

Tengo un servicio web que se ejecuta en varias máquinas redhat remotas diferentes. Cada vez que quiera actualizar el servicio, sincronizaré el nuevo código fuente del servicio web escrito en perl desde un depósito de control de versiones (uso forzosamente) y reiniciaré el servicio usando ese nuevo código perl sincronizado. Creo que es demasiado aburrido iniciar sesión en máquinas remotas una por una y hacer esa serie de comandos para reiniciar el servicio uno por uno manualmente. Así que escribí un script bash update.sh como el siguiente para "hacerlo una vez en un lugar, actualizar todas las máquinas". Ejecutaré este script de shell en mi máquina local. Pero parece que no funcionará. Solo ejecuta el primer comando "sudo -u webservice_username -i" como puedo ver desde la línea de comando en mi máquina local. (El código a continuación solo muestra cómo actualizará uno de los servicios web remotos. "Exportar P4USER = mi nombre" es para el uso del cliente forzado)

#!/bin/sh
    ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

¿Por qué sé que se ejecuta el único primer comando? Bueno, porque después de ingresar la contraseña para el ssh en mi máquina local, muestra:

Your environment has been modified. Please check /tmp/webservice.env.

Y simplemente se queda atascado allí. Me refiero a no retorno.

Como sugirió un comentarista, agregué "-t" para ssh

#!/bin/sh
        ssh -t myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

Esto permitiría que la línea de comando local regrese. Pero parece extraño, no puede cd a ese "dir", dice "cd: dir: no existe tal archivo o directorio", también dice "p4: comando no encontrado". Así que parece que el comando sudo -u se ejecuta sin efecto y el comando de exportación no se ejecutó o se ejecutó sin efecto.
Un archivo de registro local detallado es el siguiente:

Your environment has been modified. Please check /tmp/dir/.env.
bash: line 0: cd: dir: No such file or directory
bash: p4: command not found
bash: line 0: cd: bin: No such file or directory
bash: ./prog: No such file or directory
tail: cannot open `../logs/service.log' for reading: No such file or directory
tail: no files remaining

preguntado el 12 de junio de 12 a las 22:06

Tienes sudo creado para no te pide una contraseña? -

@chrisaycock tienes razón. Si hago manualmente esa serie de comandos iniciando sesión en esa máquina remota, y hago el primer comando "sudo -u webservice_username -i" No pido contraseña. ¿Alguna idea sobre cómo cambiar el script de shell? -

En lugar de ejecutar sudo después de ssh, agregue el usuario myname al archivo sudoers con los permisos que necesita para ejecutar los scripts en el servidor. -

@nathancahill La razón por la que sudo para cambiar a otro usuario no es el problema del permiso. solo webservice_user tiene el directorio "dir". Cada usuario en esa máquina tiene un entorno de trabajo diferente y, por lo tanto, tiene diferentes carpetas de directorio. -

¿Has probado ssh -t or -T? -

3 Respuestas

En lugar de conectarse a través de ssh y luego cambiar de usuario de inmediato, ¿no puede usar algo como ssh -t webservice_username@remotehost1 conectarse con el nombre de usuario deseado para empezar? Eso evitaría tener que sudo .

Si esa no es una posibilidad, intente incluir todos los comandos que desea ejecutar en un script de shell y guárdelo en la máquina remota. Si puede hacer que su tarea funcione a partir de un script, entonces su ssh La llamada se vuelve mucho más simple y debería encontrar menos problemas:

ssh myname@remotehost1 '/path/to/script'

Para actualizar fácilmente este script, puede escribir un breve script para su máquina local que cargue la versión más reciente a través de scp y luego usa ssh para invocarlo.

Respondido el 13 de junio de 12 a las 19:06

Tenga en cuenta que cuando ejecuta:

#!/bin/sh
    ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

Su sesión ssh se ejecuta sudo -u webservice_username -i espera a que salga y luego ejecuta el resto de los comandos; no se ejecuta sudo y luego ejecute los siguientes comandos. Esto tiene que ver con el contexto en el que está ejecutando la serie de comandos. Todos los comandos se ejecutan en el shell de myname@remotehost1 y todo sudo -u webservice_username - i se inicia un shell para webservice_username y en realidad no ejecuta ningún comando.

Realmente la mejor solución aquí es como dijo bta; escriba un script y luego rsync/scp al destino y luego ejecútelo usando sudo.

Respondido el 13 de junio de 12 a las 20:06

¿Hay alguna forma de permitir que el comando sudo -u se ejecute normalmente y dejar que se ejecuten los demás comandos? - Peiti Li

No dado lo que estás tratando de lograr; ejecutar múltiples comandos como un usuario específico en este caso es mejor hacerlo con un script. Revisé los documentos de sudo y no pude encontrar nada que pudiera ayudar. - nik

El comando de exportación simplemente no funciona con ssh de esta manera, lo que desea hacer es modificar de forma remota ~/.bashrc y se generará a sí mismo cada vez que inicie sesión en ssh.

Respondido 04 Abr '13, 05:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.