Nombre de usuario y contraseña en línea de comando con sshfs

15

Estoy creando un pequeño script de respaldo usando sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

¿Hay alguna manera de incluir la contraseña en este comando?

¿O hay otra solución de transferencia de archivos donde se puede incluir la contraseña de inicio de sesión además de FTP / SFTP?

Zaza
fuente
44
Puede usar ssh-gkeygen para generar un par de claves RSA y luego configurar ssh (cliente y servidor) para usar la autenticación RSA. ¿Has hecho esto antes para la autenticación ssh "regular"?
airhuff
sí, pero tengo que cambiar la forma en que los servidores se conectan a través de ssh ... hasta donde sé, la autenticación puede estar basada en claves o el inicio de sesión / contraseña no ambos al mismo tiempo ...
Zaza
2
Pueden ser los dos. Por lo general son. De esta manera, un usuario recién creado puede presionar su clave en el servidor ingresando su contraseña. Posteriormente, usan su clave.
xhienne

Respuestas:

11

-o password_stdinno parece estar funcionando en todos los sistemas, por ejemplo, freeBSD. etc.

También puede usar el expect intérprete, debería funcionar con sshfs y debería funcionar.

Otra solución sería sshpass, por ejemplo, digamos que está haciendo una copia de seguridad del directorio / var / www

Respaldando:

name=$(date '+%y-%m-%d')
mkdir /backup/$name && tar -czvf /backup/$name/"$name.tar.gz" /var/www

cargar el archivo de respaldo al servidor de respaldo

sshpass -p "your_password" scp -r backup_user@target_ip:/home/ /backup/$name

Por lo tanto, cargará el directorio con la copia de seguridad de hoy.

Sin embargo, como se dijo más arriba, la mejor manera (segura y simple) sería usar el par de claves ssh.
El único inconveniente sería que debe pasar por el proceso de generación de claves una vez en cada servidor necesita emparejar, pero es mejor que mantener una contraseña en formato de texto sin formato en todos los servidores de los que desea hacer una copia de seguridad :),

generando un par de claves de la manera correcta

  • En servidor local

    ssh-keygen -t rsa
    
  • En servidor remoto

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Carga de claves públicas generadas al servidor remoto

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Establecer permisos en el servidor remoto

    ssh root@remote_servers_ip "chmod 700 ~/.ssh; chmod 640 ~/.ssh/authorized_keys"
    
  • Iniciar sesión

    ssh root@remote_servers_ip
    
  • Habilitar el protocolo SSH v2

    descomentar "Protocolo 2" en / etc / ssh / sshd_config

  • habilitar la autorización de clave pública en sshd

    descomente "PubkeyAuthentication yes" en / etc / ssh / sshd_config

  • Si StrictModes se establece en yes en / etc / ssh / sshd_config, entonces

    restorecon -Rv ~/.ssh
    
Drakonoved
fuente
14

Según el manual, existe una opción -o password_stdinque podría permitir leer la contraseña desde la entrada estándar, que probablemente puede ser una redirección. Nunca lo he usado, así que estoy especulando.

Dicho esto, desaconsejo encarecidamente una solución que sea inherentemente insegura.

sshfunciona muy bien con un sistema de claves privadas / públicas. Es simple y seguro. No es necesario ingresar una contraseña o escribirla de forma clara en un script de shell. Simplemente presione su clave pública en el servidor y podrá conectarse de inmediato.

xhienne
fuente
¿Alguien puede proporcionar un ejemplo práctico de esta solución? Estoy intentando lo siguiente, pero no funciona:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE
Para su información, debería haber mencionado que estoy usando una clave SSH protegida con contraseña. Pude hacerlo funcionar utilizando la respuesta proporcionada por @ nathan-s-watson-haigh que se encuentra aquí: unix.stackexchange.com/questions/128974/…
MikeyE
No tengo a mano ningún entorno que me permita probar un montaje ssfs con una clave SSH protegida con contraseña. De todos modos, lo que me llama la atención al principio es que no veo ninguna -o password_stdinopción.
xhienne
Gracias por el aporte. Intenté el siguiente comando justo ahora, y no solicita una contraseña, pero tampoco regresa. Es decir, simplemente se queda allí esperando a que se complete el comando, no se muestra ningún símbolo del sistema. Probé el comando: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PD Estoy en Debian Buster PPS Esto funciona, pero me pide una contraseña:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE
11

Tubería "sshfs password"con <<<con -o password_stdinfunciona en bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"
Maz
fuente
44
Esta debería ser la respuesta aceptada ... funciona en cualquier sistema operativo Linux.
argón
Entonces, ¿cómo ponerlo en el archivo mnt-media.mount para el montaje automático con systemd?
João José
Un comentario súper menor: si su contraseña tiene caracteres BASH especiales (como una explosión (!)), Entonces debe usar comillas simples en lugar de comillas dobles para la contraseña.
Kyle Challis
5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

La opción "-o password_stdin" es lo que le permite canalizar su contraseña.

Dicho esto, las claves son una mejor opción, a menos que su proveedor de servicios no le permita usarlas para sftp. (Esta es una de las fallas notables de WP Engine).

iateadonut
fuente
¿Puede por favor aclarar su respuesta? Solo una línea de código no cuenta en SE como buena respuesta
Romeo Ninov
@RomeoNinov Diría que esta publicación responde bastante bien a la pregunta. No todos se inclinan a escribir una novela explicando por qué lo obvio es obvio.
Satō Katsura
@SatoKatsura Gracias. Sin embargo, estoy preparado para el desafío.
iateadonut
2

Montar script:

#!/bin/bash
server=<host>
user=<username>
pass=<password>
root=<hostpath>
mount=$(pwd)/sshfs

type sshfs >/dev/null 2>&1 || { echo >&2 "sshfs required"; exit 1; }
type sshpass >/dev/null 2>&1 || { echo >&2 "sshpass required"; exit 1; }

mkdir -p $mount

SSHPASS="$pass" sshfs $server:$root $mount -o ssh_command="sshpass -e ssh -l $user"

Desmontar:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount
Miguel
fuente
1

Una cosa a tener en cuenta es que si está utilizando la -o password_stdinopción, puede parecer que no funciona porque sshfs le preguntará si debe conectarse al host o no (si es la primera vez que se conecta y no se agrega al archivo de hosts conocidos todavía). Si lo está ejecutando en un lote, nunca verá sshfs preguntando. Las soluciones para evitar esto son:

  1. agregue la -o StrictHostKeyChecking=noopción a sshfs o
  2. ejecute sshfs manualmente una vez para agregar el host al archivo de hosts conocidos
frenchie71
fuente
0

Script automático para conectar sftp con sshfs

#!/bin/bash
expect <<END
spawn sshfs sftpuser@ip:/folder /mnt/folder -p 22 -o password_stdin
send "password\r"
expect eof
END
champa
fuente