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.