¿Cómo ejecutar el comando sftp con una contraseña del script Bash?

Necesito transferir un archivo de registro a un host remoto usando sftp desde un host Linux. Me han proporcionado credenciales para el mismo de mi grupo de operaciones. Sin embargo, dado que no tengo control sobre otro host, no puedo generar y compartir claves RSA con el otro host.

Entonces, ¿hay alguna forma de ejecutar el comando sftp (con el nombre de usuario / contraseña proporcionado) desde el script Bash a través de un trabajo cron ?

Encontré una pregunta similar sobre Desbordamiento de stack, Especifique la contraseña para sftp en un guión Bash , pero no hubo una respuesta satisfactoria a mi problema.

Tiene algunas opciones además de usar autenticación de clave pública:

  1. Usar llavero
  2. Use sshpass (menos seguro, pero probablemente satisfaga sus requisitos)
  3. Use expect (menos seguro y más encoding necesaria)

Si decide darle una oportunidad a sshpass aquí hay un fragmento de script en funcionamiento para hacerlo:

 export SSHPASS=your-password-here sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << ! cd incoming put your-log-file.log bye ! 

Otra forma sería usar lftp:

 lftp sftp://user:password@host -e "put local-file.name; bye" 

La desventaja de este método es que otros usuarios en la computadora pueden leer la contraseña de herramientas como ps y que la contraseña puede formar parte de su historial de shell.

Una alternativa más segura que está disponible ya que LFTP 4.5.0 está configurando la variable de entorno LFTP_PASSWORD y ejecutando lftp con --env-password . Aquí hay un ejemplo completo:

 LFTP_PASSWORD="just_an_example" lftp --env-password sftp://user@host -e "put local-file.name; bye" 

LFTP también incluye una característica de reflection genial (puede incluir la eliminación después de la transferencia confirmada ‘–Quitar los archivos de origen’):

 lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com 

Esperar es un gran progtwig para usar.

En Ubuntu, instálalo con:

 sudo apt-get install expect 

En una máquina CentOS, instálalo con:

 yum install expect 

Supongamos que desea establecer una conexión con un servidor sftp y luego cargar un archivo local desde su máquina local al servidor sftp remoto.

 #!/usr/bin/expect spawn sftp username@hostname.com expect "password:" send "yourpasswordhere\n" expect "sftp>" send "cd logdirectory\n" expect "sftp>" send "put /var/log/file.log\n" expect "sftp>" send "exit\n" interact 

Esto abre una conexión sftp con su contraseña para el servidor.

Luego va al directorio donde desea cargar su archivo, en este caso “logdirectory”

Esto carga un archivo de registro del directorio local que se encuentra en / var / log / con el nombre de archivo file.log al “directorio de registro” en el servidor remoto

Puede usar lftp interactivamente en un script de shell para que la contraseña no se guarde en .bash_history o similar haciendo lo siguiente:

 vi test_script.sh 

Agregue lo siguiente a su archivo:

 #!/bin/sh HOST= USER= PASSWD= cd  lftp< 

Y escriba / salga del editor vi después de editar el host, el usuario, el pase y el directorio para su mecanografía :wq Luego haga que el script ejecutable chmod +x test_script.sh y ejecútelo ./test_script.sh .

Recientemente me pidieron que cambiara de ftp a sftp, para asegurar la transmisión de archivos entre los servidores. Estamos utilizando el paquete Tectia SSH, que tiene una opción --password para pasar la contraseña en la línea de comando.

ejemplo: sftp --password="password" "userid"@"servername"

Ejemplo de lote:

 ( echo " ascii cd pub lcd dir_name put filename close quit " ) | sftp --password="password" "userid"@"servername" 

Pensé que debería compartir esta información, ya que estaba viendo varios sitios web, antes de ejecutar el comando de ayuda ( sftp -h ), y me sorprendió ver la opción de contraseña.

Puede anular al habilitar Contraseña menos autenticación. Pero debes instalar las claves (pub, priv) antes de ir por eso.

Ejecute los siguientes comandos en el servidor local.

 Local $> ssh-keygen -t rsa 

Presione ENTER para todas las opciones solicitadas. No es necesario escribir ningún valor.

 Local $> cd .ssh Local $> scp .ssh/id_rsa.pub user@targetmachine: Prompts for pwd$> ENTERPASSWORD 

Conéctese al servidor remoto con el siguiente comando

 Local $> ssh user@targetmachine Prompts for pwd$> ENTERPASSWORD 

Ejecute los siguientes comandos en el servidor remoto

 Remote $> mkdir .ssh Remote $> chmod 700 .ssh Remote $> cat id_rsa.pub >> .ssh/authorized_keys Remote $> chmod 600 .ssh/authorized_keys Remote $> exit 

Ejecute el siguiente comando en el servidor local para probar la autenticación sin contraseña. Debe estar conectado sin contraseña.

 $> ssh user@targetmachine 

Combine sshpass con un archivo de credenciales bloqueado y, en la práctica, es tan seguro como cualquier otro: si tiene la raíz en el buzón para leer el archivo de credenciales, todas las apuestas se desactivarán de todos modos.

Puedes usar sshpass para eso. Debajo están los pasos

  1. Instalar sshpass para Ubuntu – sudo apt-get install sshpass
  2. Agregue la IP remota a su archivo de host conocido si es la primera vez Para Ubuntu -> usuario ssh @ IP -> ingrese ‘sí’
  3. dar un comando combinado de scp y sshpass para ello. A continuación se muestra un código de muestra para sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps tomcat remoto sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps

Bash progtwig para esperar a que sftp solicite una contraseña y luego enviarla:

 #!/bin/bash expect -c " spawn sftp username@your_host expect \"Password\" send \"your_password_here\r\" interact " 

Es posible que necesite instalar esperar, cambie la redacción de ‘Contraseña’ a minúscula ‘p’ para que coincida con lo que recibe su aviso. El problema aquí es que expone su contraseña en texto plano en el archivo y en el historial de comandos. Lo cual casi derrota el propósito de tener una contraseña en primer lugar.