Nom d'utilisateur et mot de passe en ligne de commande avec sshfs

15

Je crée un petit script de sauvegarde en utilisant sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

Existe-t-il un moyen d'inclure le mot de passe dans cette commande?

Ou existe-t-il une autre solution de transfert de fichiers où le mot de passe de connexion peut être inclus autre que FTP / SFTP?

Zaza
la source
4
Vous pouvez utiliser ssh-gkeygen pour générer une paire de clés RSA puis configurer ssh (client et serveur) pour utiliser l'authentification RSA. L'avez-vous déjà fait pour l'authentification ssh "régulière"?
airhuff
oui mais je dois changer la façon dont les serveurs se connectent via ssh .. pour autant que je sache que l'authentification peut être basée sur une clé ou un login / mot de passe pas les deux en même temps ..
Zaza
2
Ils peuvent être les deux. Ils le sont généralement. De cette façon, un utilisateur nouvellement créé peut appuyer sur sa clé sur le serveur en entrant son mot de passe. Par la suite, ils utilisent leur clé.
xhienne

Réponses:

11

-o password_stdinne semblent pas fonctionner sur tous les systèmes, par exemple freeBSD. etc.

Vous pouvez également utiliser expect Interpreter, il devrait fonctionner avec sshfs et devrait faire l'affaire.

Une autre solution serait sshpass, par exemple, de dire que vous sauvegardez le répertoire / var / www

Sauvegarde:

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

téléchargement du fichier de sauvegarde sur le serveur de sauvegarde

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

Donc, il téléchargera le répertoire avec la sauvegarde d'aujourd'hui.

Mais , comme il a été dit plus haut, le meilleur moyen (sûr et simple) serait d'utiliser la paire de clés ssh
Le seul inconvénient serait que vous devez suivre le processus de génération de clés une fois sur chaque serveur vous devez vous associer, mais il vaut mieux que de conserver un mot de passe au format texte brut sur tous les serveurs que vous souhaitez sauvegarder :),

Générer une paire de clés de la bonne manière

  • Sur le serveur local

    ssh-keygen -t rsa
    
  • Sur un serveur distant

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Téléchargement des clés publiques générées sur le serveur distant

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Définir les autorisations sur le serveur distant

    ssh root@remote_servers_ip "chmod 700 ~/.ssh; chmod 640 ~/.ssh/authorized_keys"
    
  • S'identifier

    ssh root@remote_servers_ip
    
  • Activation du protocole SSH v2

    décommenter "Protocol 2" dans / etc / ssh / sshd_config

  • activation de l'autorisation de clé publique dans sshd

    décommenter "PubkeyAuthentication yes" dans / etc / ssh / sshd_config

  • Si StrictModes est défini sur yes dans / etc / ssh / sshd_config,

    restorecon -Rv ~/.ssh
    
Drakonoved
la source
14

Selon le manuel, il existe une option -o password_stdinqui pourrait permettre de lire le mot de passe à partir de l'entrée standard, qui peut probablement être une redirection. Je ne l'ai jamais utilisé, donc je spécule.

Cela dit, je déconseille fortement une telle solution qui est intrinsèquement précaire.

sshfonctionne très bien avec un système de clés privées / publiques. C'est simple et sécurisé. Pas besoin d'entrer un mot de passe ou de l'écrire en clair dans un script shell. Appuyez simplement sur votre clé publique sur le serveur et vous pouvez vous connecter immédiatement.

xhienne
la source
Quelqu'un peut-il fournir un exemple de travail de cette solution? J'essaie ce qui suit, mais cela ne fonctionne pas:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE
Pour info, j'aurais dû mentionner que j'utilise une clé SSH protégée par mot de passe. J'ai pu le faire fonctionner en utilisant la réponse fournie par @ nathan-s-watson-haigh trouvée ici: unix.stackexchange.com/questions/128974/…
MikeyE
Je n'ai pas d'environnement correspondant à portée de main qui me permettrait de tester un montage ssfs avec une clé SSH protégée par mot de passe. Quoi qu'il en soit, ce qui me frappe d'abord dans votre commande, c'est que je ne vois aucune -o password_stdinoption.
xhienne
Merci pour la contribution. J'ai essayé la commande suivante tout à l'heure, et elle ne demande pas de mot de passe, mais elle ne revient pas non plus. Cela signifie qu'il reste juste en attente de la fin de la commande, aucune invite de commande ne s'affiche. J'ai essayé la commande: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS Je suis sur Debian Buster PPS Cela fonctionne, mais demande un mot de passe:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE
11

Tuyauter "sshfs password"avec <<<avec -o password_stdinfonctionne sur bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"
Maz
la source
4
Cela devrait être la réponse acceptée. Fonctionne sur n'importe quel système d'exploitation Linux.
argon
alors, comment le mettre dans le fichier mnt-media.mount pour un montage automatique avec systemd?
João José
Un commentaire super mineur: si votre mot de passe contient des caractères BASH spéciaux (comme un bang (!)), Vous devez utiliser des guillemets simples au lieu de guillemets doubles pour le mot de passe.
Kyle Challis
5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

L'option "-o password_stdin" vous permet de diriger votre mot de passe.

Cela dit, les clés sont une meilleure option, sauf si votre fournisseur de services ne vous autorise pas à les utiliser pour sftp. (Il s'agit de l'un des échecs notables de WP Engine.)

iateadonut
la source
Pouvez-vous clarifier votre réponse. Une seule ligne de code ne compte pas en SE comme bonne réponse
Romeo Ninov
@RomeoNinov Je dirais que ce message répond assez bien à la question. Tout le monde n'est pas enclin à écrire un roman expliquant pourquoi l'évidence est évidente.
Satō Katsura
@SatoKatsura Merci. Mais je suis à la hauteur du défi.
iateadonut
2

Script de montage:

#!/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"

Démonter:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount
Michael
la source
1

une chose à garder à l'esprit est que si vous utilisez l' -o password_stdinoption, elle peut sembler ne pas fonctionner car sshfs vous demandera de vous connecter ou non à l'hôte (si c'est la première fois que vous vous connectez à elle et qu'elle n'est pas ajoutée au fichier d'hôtes connu). Si vous l'exécutez dans un lot, vous ne verrez jamais sshfs demander. Les solutions de contournement pour éviter cela sont les suivantes:

  1. ajoutez l' -o StrictHostKeyChecking=nooption à sshfs ou
  2. exécutez sshfs manuellement une fois pour ajouter l'hôte au fichier d'hôtes connu
frenchie71
la source
0

Script automatique pour connecter sftp avec sshfs

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