Nome utente e password nella riga di comando con sshfs


15

Sto creando un piccolo script di backup utilizzando sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

C'è un modo per includere la password in questo comando?

Oppure esiste un'altra soluzione per il trasferimento di file in cui è possibile includere la password di accesso diversa da FTP / SFTP?


4
È possibile utilizzare ssh-gkeygen per generare una coppia di chiavi RSA, quindi configurare ssh (client e server) per utilizzare l'autenticazione RSA. Lo hai già fatto per l'autenticazione ssh "normale"?
Airhuff,

sì, ma poi devo cambiare il modo in cui i server si connettono tramite ssh .. per quanto ne so l'autenticazione può essere basata su chiave o login / password non entrambi allo stesso tempo ..
Zaza,

2
Possono essere entrambi. Di solito lo sono. In questo modo, un nuovo utente può inserire la propria chiave sul server inserendo la propria password. Successivamente, usano la loro chiave.
Xhienne,

Risposte:


11

-o password_stdinnon sembrano funzionare su tutti i sistemi, ad esempio FreeBSD. ecc.

Puoi anche usare expect Interpreter, dovrebbe funzionare con sshfs e dovrebbe fare il trucco.

Un'altra soluzione sarebbe sshpass, ad esempio, supponiamo che si stia eseguendo il backup della directory / var / www

Backup:

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

caricamento del file di backup sul server di backup

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

Quindi caricherà la directory con il backup di oggi

Ma comunque, come è stato detto più in alto, il modo migliore (sicuro e semplice) sarebbe usare la coppia di chiavi ssh
L'unico inconveniente sarebbe che devi passare attraverso il processo di generazione delle chiavi una volta su ogni server è necessario accoppiare, ma è meglio che mantenere una password in formato testo normale su tutti i server di cui si desidera eseguire il backup :),

Generando una coppia di chiavi nel modo corretto

  • Sul server locale

    ssh-keygen -t rsa
    
  • Sul server remoto

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Caricamento delle chiavi pubbliche generate sul server remoto

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Impostare le autorizzazioni sul server remoto

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

    ssh root@remote_servers_ip
    
  • Abilitazione del protocollo SSH v2

    decommenta "Protocollo 2" in / etc / ssh / sshd_config

  • abilitando l'autorizzazione della chiave pubblica in sshd

    decomment "PubkeyAuthentication yes" in / etc / ssh / sshd_config

  • Se StrictModes è impostato su yes in / etc / ssh / sshd_config, allora

    restorecon -Rv ~/.ssh
    

14

Secondo il manuale, esiste un'opzione -o password_stdinche potrebbe consentire di leggere la password dall'input standard, che può probabilmente essere un reindirizzamento. Non l'ho mai usato, quindi sto speculando.

Detto questo, sconsiglio vivamente una soluzione che è intrinsecamente insicura.

sshfunziona molto bene con un sistema di chiavi pubbliche / private. È semplice e sicuro. Non è necessario inserire una password o scriverla in modo chiaro in uno script di shell. Basta premere la chiave pubblica sul server e puoi collegarti immediatamente.


Qualcuno può fornire un esempio funzionante di questa soluzione? Sto provando quanto segue, ma non funziona:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE,

Cordiali saluti, avrei dovuto menzionare che sto usando una chiave SSH protetta da password. Sono stato in grado di farlo funzionare utilizzando la risposta fornita da @ nathan-s-watson-haigh trovata qui: unix.stackexchange.com/questions/128974/…
MikeyE

Non ho a portata di mano un ambiente adatto che mi consenta di testare un mount ssfs con una chiave SSH protetta da password. Comunque, ciò che mi colpisce all'inizio nel tuo comando è che non vedo alcuna -o password_stdinopzione.
Xhienne,

Grazie per l'input. Ho provato il seguente comando proprio ora, e non richiede una password, ma non ritorna. Ciò significa che rimane semplicemente in attesa del completamento del comando, non viene visualizzato alcun prompt dei comandi. Ho provato il comando: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS Sono su Debian Buster PPS Funziona, ma richiede una password:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE,

11

Tubazioni il "sshfs password"con <<<per -o password_stdinopere in bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"

4
Questa dovrebbe essere la risposta accettata. Funziona su qualsiasi sistema operativo Linux.
Argon,

quindi, come inserirlo nel file mnt-media.mount per il montaggio automatico con systemd?
João José,

Un commento super minore: se la tua password contiene caratteri BASH speciali (come un botto (!)), Allora dovresti usare virgolette singole invece di doppie virgolette per la password.
Kyle Challis,

5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

L'opzione "-o password_stdin" è ciò che ti consente di inserire la tua password.

Detto questo, le chiavi sono un'opzione migliore, a meno che il tuo fornitore di servizi non ti permetta di usarle per sftp. (Questo è uno dei notevoli errori di WP Engine.)


Potete per favore chiarire la vostra risposta. Solo una riga di codice non conta in SE come una buona risposta
Romeo Ninov il

@RomeoNinov Direi che questo post risponde abbastanza bene alla domanda. Non tutti sono propensi a scrivere un romanzo che spieghi perché l'ovvio è ovvio.
Satō Katsura,

@SatoKatsura Grazie. Sono all'altezza della sfida, però.
iateadonut,

2

Monta 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"

Smonta:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount

1

una cosa da tenere a mente è che se si utilizza l' -o password_stdinopzione, potrebbe sembrare che non funzioni perché sshfs chiederà se connettersi all'host o meno (se è la prima volta che ci si connette ad esso e non viene aggiunto al file hosts noto ancora). Se lo stai eseguendo in un batch non vedrai mai chiedere a sshfs. Soluzioni alternative per evitare ciò sono:

  1. aggiungi l' -o StrictHostKeyChecking=noopzione a sshfs o
  2. eseguire sshfs manualmente una volta per aggiungere l'host al file hosts noto

0

Script automatico per connettere 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.