Nama pengguna dan kata sandi di baris perintah dengan sshfs

15

Saya membuat skrip cadangan kecil menggunakan sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

Apakah ada cara untuk memasukkan kata sandi dalam perintah ini?

Atau ada solusi transfer file lain di mana kata sandi login dapat dimasukkan selain dari FTP / SFTP?

Zaza
sumber
4
Anda dapat menggunakan ssh-gkeygen untuk menghasilkan pasangan kunci RSA kemudian mengonfigurasi ssh (klien dan server) untuk menggunakan otentikasi RSA. Sudahkah Anda melakukan ini sebelumnya untuk otentikasi ssh "reguler"?
airhuff
ya tapi kemudian saya harus mengubah cara server terhubung melalui ssh .. sejauh yang saya tahu otentikasi dapat berbasis kunci atau login / kata sandi tidak keduanya sekaligus ..
Zaza
2
Mereka berdua bisa. Mereka biasanya begitu. Dengan cara ini, pengguna yang baru dibuat dapat menekan kunci mereka di server dengan memasukkan kata sandi mereka. Selanjutnya, mereka menggunakan kunci mereka.
xhienne

Jawaban:

11

-o password_stdinsepertinya tidak bekerja pada semua sistem, misalnya freeBSD. dll.

Anda juga dapat menggunakan expect Interpreter, itu harus bekerja dengan sshfs dan harus melakukan trik.

Solusi lain akan sshpass, misalnya, katakanlah Anda mencadangkan direktori / var / www

Mencadangkan:

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

mengunggah file cadangan ke server cadangan

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

Jadi itu akan mengunggah direktori dengan cadangan hari ini.

Tapi tetap saja, seperti yang dikatakan lebih tinggi, cara terbaik (aman dan sederhana) adalah dengan menggunakan pasangan kunci ssh.
Satu-satunya ketidaknyamanan adalah Anda harus melalui proses pembuatan kunci sekali di setiap server Anda perlu memasangkan, tetapi lebih baik daripada menyimpan kata sandi dalam format teks biasa di semua server yang ingin Anda buat cadangannya :),

Membuat Kunci Pasangkan dengan cara yang Benar

  • Di server lokal

    ssh-keygen -t rsa
    
  • Di Server jauh

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Mengunggah Kunci Publik yang Dihasilkan ke Server Jarak Jauh

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Tetapkan Izin di Server jarak jauh

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

    ssh root@remote_servers_ip
    
  • Mengaktifkan SSH Protocol v2

    batalkan komentar "Protokol 2" di / etc / ssh / sshd_config

  • mengaktifkan otorisasi kunci publik di sshd

    batalkan komentar "PubkeyAuthentication yes" di / etc / ssh / sshd_config

  • Jika StrictModes diatur ke yes di / etc / ssh / sshd_config, maka

    restorecon -Rv ~/.ssh
    
Drakonoved
sumber
14

Menurut manual, ada opsi -o password_stdinyang memungkinkan untuk membaca kata sandi dari input standar, yang mungkin bisa menjadi pengalihan. Saya belum pernah menggunakannya, jadi saya berspekulasi.

Yang mengatakan, saya sangat menyarankan solusi seperti itu yang secara inheren tidak aman.

sshberfungsi sangat baik dengan sistem kunci privat / publik. Sederhana dan aman. Tidak perlu memasukkan kata sandi atau menuliskannya dengan jelas dalam skrip shell. Tekan saja kunci publik Anda di server dan Anda dapat terhubung dengan segera.

xienne
sumber
Adakah yang bisa memberikan contoh kerja dari solusi ini? Saya mencoba yang berikut, tetapi tidak berhasil:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE
FYI, saya seharusnya mengatakan saya menggunakan kunci SSH yang dilindungi kata sandi. Saya dapat membuatnya bekerja menggunakan jawaban yang diberikan oleh @ nathan-s-watson-haigh yang ditemukan di sini: unix.stackexchange.com/questions/128974/…
MikeyE
Saya tidak memiliki lingkungan yang cocok yang memungkinkan saya untuk menguji ssfs-mount dengan kunci SSH yang dilindungi kata sandi. Bagaimanapun, apa yang menurut saya pertama kali dalam perintah Anda adalah bahwa saya tidak melihat -o password_stdinopsi apa pun .
xhienne
Terima kasih atas masukannya. Saya mencoba perintah berikut sekarang, dan tidak meminta kata sandi, tetapi juga tidak kembali. Artinya, ia hanya duduk di sana menunggu perintah selesai, tidak ada prompt perintah yang ditampilkan. Saya mencoba perintah: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS Saya menggunakan Debian Buster PPS Ini berfungsi, tetapi meminta kata sandi:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE
11

Pipa yang "sshfs password"dengan <<<untuk -o password_stdinbekerja pada bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"
Maz
sumber
4
Ini harus menjadi jawaban yang diterima .. berfungsi pada OS Linux apa pun.
argon
jadi, bagaimana memasukkannya ke file mnt-media.mount untuk pemasangan otomatis dengan systemd?
João José
Satu komentar super minor: jika kata sandi Anda memiliki karakter BASH khusus (seperti bang (!)), Maka Anda harus menggunakan tanda kutip tunggal alih-alih tanda kutip ganda untuk kata sandi.
Kyle Challis
5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

Opsi "-o password_stdin" adalah yang memungkinkan Anda untuk memasang kata sandi.

Yang mengatakan, kunci adalah pilihan yang lebih baik, kecuali jika penyedia layanan Anda tidak membiarkan Anda menggunakannya untuk sftp. (Ini adalah salah satu kegagalan WP Engine.)

iateadonut
sumber
Tolong jelaskan jawaban Anda. Hanya satu baris kode yang tidak dihitung dalam SE sebagai jawaban yang baik
Romeo Ninov
@RomeoNinov Saya akan mengatakan posting ini menjawab pertanyaan dengan cukup baik. Tidak semua orang cenderung menulis novel yang menjelaskan mengapa yang jelas itu jelas.
Satō Katsura
@SatoKatsura Terima kasih. Saya siap dengan tantangan, meskipun.
iateadonut
2

Pasang skrip:

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

Lepas dari:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount
Michael
sumber
1

Satu hal yang perlu diingat adalah bahwa jika Anda menggunakan -o password_stdinopsi, itu mungkin tampak tidak berfungsi karena sshfs akan bertanya apakah akan terhubung ke host atau tidak (jika ini adalah pertama kalinya Anda terhubung ke sana dan itu tidak ditambahkan ke file host yang dikenal). Jika Anda menjalankannya dalam batch Anda tidak akan pernah melihat sshfs bertanya. Solusi untuk menghindari ini adalah:

  1. tambahkan -o StrictHostKeyChecking=noopsi ke sshfs atau
  2. jalankan sshfs secara manual sekali untuk menambahkan host ke file host yang dikenal
frenchie71
sumber
0

Script otomatis untuk menghubungkan sftp dengan sshfs

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