bash - example - sftp linux ejemplo
¿Cómo ejecutar el comando sftp con una contraseña del script Bash? (9)
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 pila, Especifique la contraseña para sftp en un guión Bash , pero no hubo una respuesta satisfactoria a mi problema.
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.
Esperar es un gran programa 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 [email protected]
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
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 reflejo 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
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
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=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>
cd <base directory for your put file>
lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT
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
.
Puedes usar sshpass para eso. Debajo están los pasos
- Instalar sshpass para Ubuntu -
sudo apt-get install sshpass
- Agregue la IP remota a su archivo de host conocido si es la primera vez Para Ubuntu -> usuario ssh @ IP -> ingrese ''sí''
- 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 remotosshpass -p ''#Password_For_remote_machine'' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
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.
Tiene algunas opciones además de usar autenticación de clave pública:
- Usar keychain
- Use sshpass (menos seguro, pero probablemente satisfaga sus requisitos)
- Use expect (menos seguro y más codificación 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
!
Bash programa 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.