Nazwa użytkownika i hasło w wierszu poleceń z sshfs

15

Tworzę mały skrypt kopii zapasowej, używając sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

Czy istnieje sposób na dołączenie hasła do tego polecenia?

A może istnieje inne rozwiązanie do przesyłania plików, w którym można podać hasło logowania inne niż FTP / SFTP?

Zaza
źródło
4
Możesz użyć ssh-gkeygen do wygenerowania pary kluczy RSA, a następnie skonfigurować ssh (klient i serwer) do korzystania z uwierzytelniania RSA. Czy zrobiłeś to już wcześniej dla „zwykłego” uwierzytelniania ssh?
airhuff
tak, ale potem muszę zmienić sposób, w jaki serwery łączą się za pośrednictwem ssh .. o ile wiem, uwierzytelnianie może być oparte na kluczu lub loginie / haśle nie oba jednocześnie ..
Zaza
2
Mogą być jedno i drugie. Zazwyczaj są. W ten sposób nowo utworzony użytkownik może nacisnąć swój klucz na serwerze, wprowadzając swoje hasło. Następnie używają klucza.
xhienne

Odpowiedzi:

11

-o password_stdinnie działają na wszystkich systemach, na przykład na FreeBSD. itp.

Możesz także użyć expect Interpretera, powinien on działać z sshfs i powinien załatwić sprawę.

Innym rozwiązaniem byłoby sshpassna przykład założenie, że tworzona jest kopia zapasowa katalogu / var / www

Tworzenie kopii zapasowej:

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

przesyłanie pliku kopii zapasowej na serwer kopii zapasowej

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

Prześle więc katalog z dzisiejszą kopią zapasową.

Jednak , jak powiedziano wyżej, najlepszym (bezpiecznym i prostym) sposobem byłoby użycie pary kluczy ssh
Jedyną niedogodnością byłoby to, że trzeba przejść proces generowania klucza raz na każdym serwerze musisz sparować, ale jest to lepsze niż utrzymywanie hasła w formacie zwykłego tekstu na wszystkich serwerach, dla których chcesz utworzyć kopię zapasową :),

Generowanie pary kluczy we właściwy sposób

  • Na serwerze lokalnym

    ssh-keygen -t rsa
    
  • Na zdalnym serwerze

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Przesyłanie wygenerowanych kluczy publicznych na zdalny serwer

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Ustaw uprawnienia na zdalnym serwerze

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

    ssh root@remote_servers_ip
    
  • Włączanie protokołu SSH v2

    odkomentuj „Protokół 2” w / etc / ssh / sshd_config

  • włączanie autoryzacji klucza publicznego w sshd

    odkomentuj „PubkeyAuthentication yes” w / etc / ssh / sshd_config

  • Jeśli StrictModes jest ustawiony na tak w / etc / ssh / sshd_config, to

    restorecon -Rv ~/.ssh
    
Drakonoved
źródło
14

Zgodnie z instrukcją istnieje opcja -o password_stdin która może umożliwić odczytanie hasła ze standardowego wejścia, co może być prawdopodobnie przekierowaniem. Nigdy go nie używałem, więc spekuluję.

To powiedziawszy, zdecydowanie odradzam takie rozwiązanie, które z natury jest niepewne.

sshdziała bardzo dobrze z systemem kluczy prywatnych / publicznych. To jest proste i bezpieczne. Nie trzeba wprowadzać hasła ani pisać go wyraźnie w skrypcie powłoki. Po prostu wciśnij swój klucz publiczny na serwerze i możesz od razu się połączyć.

Xhienne
źródło
Czy ktoś może podać działający przykład tego rozwiązania? Próbuję następujących, ale to nie działa:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE
Do twojej wiadomości, powinienem wspomnieć, że używam klucza SSH chronionego hasłem. Udało mi się go uruchomić, korzystając z odpowiedzi udzielonej przez @ nathan-s-watson-haigh, którą można znaleźć tutaj: unix.stackexchange.com/questions/128974/...
MikeyE
Nie mam pod ręką pasującego środowiska, które pozwoliłoby mi przetestować montaż ssfs przy użyciu klucza SSH chronionego hasłem. W każdym razie w twoim rozkazie uderza mnie to, że nie widzę żadnej -o password_stdinopcji.
xhienne
Dzięki za wkład. Właśnie wypróbowałem następujące polecenie i nie prosi o hasło, ale też nie zwraca. Oznacza to, że po prostu siedzi tam i czeka na zakończenie polecenia, bez wiersza polecenia. Próbowałem polecenia: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS Jestem na Debian Buster PPS To działa, ale wyświetla monit o podanie hasła:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE,
11

Piping "sshfs password"z <<<do -o password_stdindziała na bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"
Maz
źródło
4
To powinna być zaakceptowana odpowiedź. Działa na każdym systemie operacyjnym Linux.
argon
więc jak umieścić go w pliku mnt-media.mount do automatycznego montażu za pomocą systemd?
João José
Jeden bardzo drobny komentarz: jeśli twoje hasło zawiera specjalne znaki BASH (jak huk (!)), Powinieneś użyć pojedynczego cudzysłowu zamiast podwójnego cudzysłowu dla hasła.
Kyle Challis
5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

Opcja „-o password_stdin” umożliwia przesyłanie hasła w potoku.

To powiedziawszy, klucze są lepszą opcją, chyba że twój usługodawca nie pozwala ci ich używać do sftp. (Jest to jedna z istotnych awarii WP Engine).

iateadonut
źródło
Czy możesz wyjaśnić swoją odpowiedź. Tylko jedna linia kodu nie liczy się w SE jako dobra odpowiedź
Romeo Ninov
@RomeoNinov Powiedziałbym, że ten post wystarczająco dobrze odpowiada na pytanie. Nie wszyscy są skłonni do napisania powieści wyjaśniającej, dlaczego oczywiste jest oczywiste.
Satō Katsura,
@SatoKatsura Thanks. Ale jestem gotowa na wyzwanie.
iateadonut
2

Zamontuj skrypt:

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

Odmontuj:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount
Michael
źródło
1

należy pamiętać, że jeśli korzystasz z tej -o password_stdinopcji, może się wydawać, że nie działa, ponieważ sshfs zapyta, czy połączyć się z hostem, czy nie (jeśli łączysz się z nim po raz pierwszy i nie jest dodawany do znanego pliku hosts). Jeśli uruchamiasz go wsadowo, nigdy nie zobaczysz, że sshfs pyta. Obejściem tego problemu jest:

  1. Dodaj -o StrictHostKeyChecking=no opcję do sshfs lub
  2. uruchom sshfs ręcznie, aby dodać hosta do znanego pliku hosts
frenchie71
źródło
0

Automatyczny skrypt do połączenia sftp z sshfs

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