Benutzername und Passwort in der Kommandozeile mit sshfs

15

Ich erstelle ein kleines Backup-Skript mit sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

Gibt es eine Möglichkeit, das Kennwort in diesen Befehl aufzunehmen?

Oder gibt es eine andere Dateiübertragungslösung, bei der das Anmeldekennwort außer FTP / SFTP eingegeben werden kann?

Zaza
quelle
4
Sie können mit ssh-gkeygen ein RSA-Schlüsselpaar generieren und dann ssh (Client und Server) für die Verwendung der RSA-Authentifizierung konfigurieren. Haben Sie dies bereits für die "reguläre" SSH-Authentifizierung getan?
Airhuff
Ja, aber dann muss ich die Art und Weise ändern, wie Server über SSH verbinden. Soweit ich weiß, kann die Authentifizierung schlüsselbasiert sein oder Login / Passwort nicht gleichzeitig.
Zaza
2
Sie können beides sein. Sie sind normalerweise. Auf diese Weise kann ein neu erstellter Benutzer seinen Schlüssel auf dem Server durch Eingabe seines Kennworts drücken. Anschließend verwenden sie ihren Schlüssel.
Xhienne

Antworten:

11

-o password_stdinscheinen nicht auf allen Systemen zu funktionieren, zum Beispiel freeBSD. usw.

Sie können auch expect Interpreter verwenden, es sollte mit sshfs funktionieren und den Trick machen.

Eine andere Lösung wäre sshpasszum Beispiel, dass Sie das Verzeichnis / var / www sichern

Sichern:

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

Hochladen der Sicherungsdatei auf den Sicherungsserver

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

So wird es Verzeichnis mit dem heutigen Sicherung lädt

aber noch, wie es höher gesagt wurde, am besten (sicher und einfach) Weg SSH - Schlüsselpaar zu verwenden , wäre
der einzige Nachteil wäre, dass Sie durch den Schlüsselerzeugungsprozess auf jedem Server einmal gehen Sie müssen ein Pairing durchführen, es ist jedoch besser, als auf allen Servern, die Sie sichern möchten, ein Kennwort im Nur-Text-Format

beizubehalten

  • Auf lokalem Server

    ssh-keygen -t rsa
    
  • Auf dem Remote-Server

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Hochladen generierter öffentlicher Schlüssel auf den Remote-Server

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Festlegen von Berechtigungen auf dem Remote-Server

    ssh root@remote_servers_ip "chmod 700 ~/.ssh; chmod 640 ~/.ssh/authorized_keys"
    
  • Einloggen

    ssh root@remote_servers_ip
    
  • Aktivieren des SSH-Protokolls v2

    Kommentar "Protokoll 2" in / etc / ssh / sshd_config entfernen

  • Aktivieren der Autorisierung öffentlicher Schlüssel in sshd

    Kommentar "PubkeyAuthentication yes" in / etc / ssh / sshd_config entfernen

  • Wenn StrictModes in / etc / ssh / sshd_config auf yes gesetzt ist, dann

    restorecon -Rv ~/.ssh
    
Drakonoved
quelle
14

Laut Handbuch gibt es eine Option, mit -o password_stdinder das Kennwort möglicherweise von der Standardeingabe gelesen werden kann. Dies kann wahrscheinlich eine Umleitung sein. Ich habe es nie benutzt, also spekuliere ich.

Ich rate jedoch dringend von einer solchen Lösung ab, die von Natur aus unsicher ist.

sshfunktioniert sehr gut mit einem System von privaten / öffentlichen Schlüsseln. Es ist einfach und sicher. Es ist nicht erforderlich, ein Kennwort einzugeben oder es in einem Shell-Skript in Klartext zu schreiben. Drücken Sie einfach Ihren öffentlichen Schlüssel auf den Server und Sie können sofort eine Verbindung herstellen.

xhienne
quelle
Kann jemand ein funktionierendes Beispiel für diese Lösung liefern? Ich versuche Folgendes, aber es funktioniert nicht:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE
Zu Ihrer Information hätte ich erwähnen sollen, dass ich einen passwortgeschützten SSH-Schlüssel verwende. Ich konnte es mit der Antwort von @ nathan-s-watson-haigh zum Laufen bringen, die hier zu finden ist: unix.stackexchange.com/questions/128974/…
MikeyE
Ich habe keine passende Umgebung zur Hand, mit der ich einen ssfs-Mount mit einem kennwortgeschützten SSH-Schlüssel testen könnte. Jedenfalls fällt mir zuerst auf, dass ich keine -o password_stdinOption sehe .
Xhienne
Danke für die Eingabe. Ich habe gerade den folgenden Befehl ausprobiert und er fragt nicht nach einem Passwort, gibt aber auch nicht zurück. Das heißt, es wartet nur darauf, dass der Befehl ausgeführt wird, und es wird keine Eingabeaufforderung angezeigt. Ich habe den Befehl ausprobiert: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS Ich bin auf Debian Buster PPS. Dies funktioniert, fordert aber zur Eingabe eines Passworts auf:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE
11

Kochend die "sshfs password"mit <<<zu -o password_stdinArbeiten auf bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"
Maz
quelle
4
Dies sollte die akzeptierte Antwort sein. Funktioniert auf jedem Linux-Betriebssystem.
Argon
also, wie kann man es in die datei mnt-media.mount für die automatische einbindung mit systemd stellen?
João José
Ein sehr kleiner Kommentar: Wenn Ihr Passwort spezielle BASH-Zeichen enthält (wie ein Knall (!)), Sollten Sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen für das Passwort verwenden.
Kyle Challis
5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

Mit der Option "-o password_stdin" können Sie Ihr Kennwort weiterleiten.

Das heißt, Schlüssel sind eine bessere Option, es sei denn, Ihr Dienstanbieter lässt Sie nicht für SFTP verwenden. (Dies ist einer der bemerkenswerten Fehler von WP Engine.)

iateadonut
quelle
Können Sie bitte Ihre Antwort klären. Nur eine Codezeile zählt in SE nicht als gute Antwort
Romeo Ninov
@ RomeoNinov Ich würde sagen, dieser Beitrag beantwortet die Frage gut genug. Nicht jeder ist geneigt, einen Roman zu schreiben, der erklärt, warum das Offensichtliche offensichtlich ist.
Satō Katsura
@SatoKatsura Danke. Ich bin der Herausforderung jedoch gewachsen.
iateadonut
2

Skript einbinden:

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

Aushängen:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount
Michael
quelle
1

Wenn Sie diese -o password_stdinOption verwenden, scheint sie möglicherweise nicht zu funktionieren, da sshfs Sie fragt, ob Sie eine Verbindung zum Host herstellen möchten oder nicht (wenn Sie zum ersten Mal eine Verbindung herstellen und diese Option nicht hinzugefügt wird) zur bekannten hosts-datei noch). Wenn Sie es in einem Stapel ausführen, werden Sie nie sshfs fragen sehen. Problemumgehungen, um dies zu vermeiden, sind:

  1. füge die -o StrictHostKeyChecking=noOption zu sshfs oder hinzu
  2. Führen Sie sshfs einmal manuell aus, um den Host der bekannten Hosts-Datei hinzuzufügen
frenchie71
quelle