Tengo un script bash test.sh
que contiene los siguientes comandos
#!/bin/bash
PASSWORD=""
USERNAME=""
REM_HOSTNAME='localhost'
FILES_TO_COPY="remote_exec.sh"
function scptmp {
exec sshpass -p $PASSWORD scp -o "ConnectTimeout 3" \
-o "StrictHostKeyChecking no" \
-o "UserKnownHostsFile /dev/null" \
"$@"
}
echo -e "\tCopying files to remote host..."
scptmp -r -q $FILES_TO_COPY $USERNAME@$REM_HOSTNAME:/tmp
echo -e "\tSet execution privs on remote file..."
sshpass -p "$PASSWORD" ssh -t -oStrictHostKeyChecking=no $USERNAME@$REM_HOSTNAME "echo $PASSWORD | sudo -S chmod +x /tmp/$FILES_TO_COPY"
echo -e "\Execute..."
sshpass -p "$PASSWORD" ssh -oStrictHostKeyChecking=no -t $USERNAME@$REM_HOSTNAME "echo $PASSWORD | sudo -S bash /tmp/$FILES_TO_COPY"
Y el remote_exec.sh
con el siguiente contenido:
#!/bin/bash
hostname=`hostname`
mkdir $hostname
Cuando ejecuto el script con
bash test.sh
No recibo ningún error, pero remote_exec.sh
parece que no se ejecuta en el host ya que no se crea ningún directorio.
¿Alguien tiene una idea de cuál podría ser el problema?
Respuesta1
Con exec
, reemplazas el shell actual con el proceso resultante de ejecutar el siguiente comando. Esto significa que cuando llama a su scptmp
función, el proceso reemplaza el shell que actualmente está ejecutando su script sshpass
. Cuando la sshpass
utilidad de la función haya terminado de ejecutarse, el script ya no se ejecutará.
Respuesta2
Las comillas simples inhiben la evaluación de las variables dentro de ellas. Pruebe con comillas dobles:
sshpass -p $PASSWORD ssh -t user@host "echo $PASSWORD | sudo -S bash /tmp/remote_exec.sh"
Respuesta3
En mi caso, me estaba conectando al control remoto por primera vez con el usuario ejecutando el script. Por lo tanto, trate de
SSH <REMOTE_IP>
con el usuario afectado. Si aparece un mensaje sobre "autenticidad del host", entonces esto podría ser un problema.
The authenticity of host '<REMOTE-IP>' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
Dependiendo del entorno y sus políticas, puede simplemente confirmar y reiniciar el script.
Respuesta4
Pruebe lo siguiente:
sshpass -p $PASSWORD ssh -t user@host<<EOF
echo uname -a
cd /tmp/ || exit 1
echo $PASSWORD | sudo -S bash ./remote_exec.sh
exit $?
EOF