Zdalne katalogi przez SSH tak jak zwykły folder na dysku

Kategoria: Oprogramowanie Data publikacji:

Pracując ze stronami internetowymi, często operuję na danych zgromadzonych na serwerach zdalnych. Przez wiele lat używałem aplikacji FileZilla. Zdarzało mi się też korzystać ze „sztuczki” dostępnej w linuksowych menadżerach plików i eksploratorze Windows polegającej na wpisaniu adresu serwera z przedrostkiem ftp:// w pasku adresu, dzięki czemu zdalne pliki wyglądały dokładnie tak jak dane na moim komputerze. Pomyślałem kiedyś — czy nie dałoby się podobnego efektu osiągnąć bardziej stabilną, profesjonalną, a jednocześnie mniej masochistyczną metodą?

Otóż w systemach linuksowych jest taka możliwość! Jakiś czas temu odnalazłem w Internecie niepozorne, proste w obsłudze (dla znających interfejs wiersza poleceń) i niesłychanie wygodne narzędzie SSHFS. Opiera się ono na dwóch fundamentach — SFTP oraz FUSE. SFTP to protokół umożliwiający przesyłanie plików za pośrednictwem SSH, zaś FUSE to moduł jądra Linux pozwalający na łatwe tworzenie systemów plików bez restartu systemu i bez uprawnień roota.

Czym jest SSHFS?

SSHFS to aplikacja, która tworzy system plików gromadzący dane ze wskazanego serwera za pośrednictwem SFTP i SSH. Dzięki wykorzystaniu FUSE program działa natychmiast i nie wymaga podwyższonych uprawnień. System plików można umieścić w dowolnym folderze, na przykład w katalogu domowym — dajmy na to ~/sshfs lub ~/serwer, albo ~/projekty — czy też poza nim.

Jak używać SSHFS?

Najpierw, co oczywiste, należy SSHFS zainstalować. Znajdziemy go w repozytoriach wielu systemów linuksowych, dlatego instalacja powinna być bezproblemowa. Zainteresowanych kodem źródłowym aplikacji odesłać mogę do repozytorium SSHFS na GitHubie. Gdy program w systemie już posiadamy, aby rozpocząć z nim pracę wystarczy wykonać w terminalu proste polecenie:

sshfs nazwa_uzytkownika@adres_serwera.pl:/sciezka/do/folderu/zdalnego /sciezka/do/punktu/montowania [ewentualne dodatkowe przełączniki]

Program za pośrednictwem SSH zapyta nas o hasło. Przykład polecenia:

sshfs tomek@serwer.pl:/public_html/wordpress ~/WordPress/

Przed uruchomieniem tego polecenia folder ~/WordPress/ powinien już istnieć, a bieżący użytkownik powinien mieć uprawnienia do jego modyfikacji. Nie ma potrzeby uruchamiać SSHFS jako root! Po wykonaniu polecenia program uruchomi się w tle, a zawartość katalogu serwera /public_html/wordpress/ pojawi się w folderze ~/WordPress/ na twoim komputerze. Jakakolwiek modyfikacja znajdujących się w nim plików zmieni też pliki na serwerze.

Po zakończeniu pracy należy odmontować folder, wykorzystując polecenie FUSE:

fusermount -u /sciezka/do/punktu/montowania

Możliwe problemy

Nie ma róży bez kolców, dlatego podczas korzystania z SSHFS mogą wystąpić pewne problemy. Podzielę się z wami tymi, które napotkałem sam.

  • Niepoprawne uprawnienia plików w zamontowanym katalogu. SSHFS przypisuje każdemu plikowi dokładnie takie uprawnienia, jakie ma on na serwerze. Jeśli na twoim komputerze nie ma użytkownika lub grupy o ID takim jak to przypisane plikowi na serwerze (a jest to bardzo prawdopodobne przy np. współdzielonych hostingach), mogą wystąpić problemy z właścicielami plików i dostępem do plików. Warto użyć przełącznika -o idmap=user lub, w specyficznych przypadkach, jeśli chcemy stworzyć własne mapowanie użytkowników i grup z serwera na nasz komputer — -o idmap=file (odsyłam do dokumentacji).
  • Niepoprawne uprawnienia nowo tworzonych plików po stronie serwera. SSHFS nadaje wysyłanym plikom uprawnienia zgodnie z umaskiem twojego systemu. Możesz użyć polecenia chmod do zmiany uprawnień dla konkretnego pliku (niekoniecznie przez SSH, można też u siebie na komputerze w punkcie montowania, SSHFS przetransportuje to na serwer). Można też użyć przełącznika o następującej treści: -o sftp_server="/usr/libexec/sftp-server -u 022". Dzięki temu do usługi SFTP na serwerze zostanie przekazany parametr określający umask plików. Jeśli to nie poskutkuje, można użyć zpatchowanej wersji SSHFS — więcej informacji na andre.frimberger.de.
  • Brak dostępu do folderów dowiązanych symbolicznie. SSHFS interpretuje dowiązania symboliczne względem twojego systemu plików, nie względem systemu plików na serwerze. Jeśli w zdalnym katalogu znajduje się dowiązanie do folderu lub pliku poza nim, a chcesz mieć do niego dostęp, użyj opcji -o follow_symlinks. Dzięki temu plik będzie dostępny, ale w sposób bezpośredni — menadżer plików i system nie będą „wiedzieć”, że jest to dowiązanie.
  • Problematyczne kończenie pracy z SSHFS. Aplikacja może utrudnić ci pracę z komputerem, jeśli nie zamkniesz jej poprawnie. W takiej sytuacji próba wejścia do folderu zawierającego punkt montowania SSHFS może skończyć się zawieszeniem terminala lub menadżera plików. Aby tego uniknąć, dbaj o odmontowanie zdalnego katalogu po zakończeniu pracy. Dodaj przełącznik -o auto_unmount do polecenia, dzięki czemu gdy proces SSHFS zostanie „ubity” (np. przy wylogowaniu), nastąpi automatyczne odmontowanie.
    Problem może wystąpić też, gdy zahibernujesz/uśpisz komputer z włączonym SSHFS. Aby tego uniknąć, zadbaj o odmontowanie przy hibernacji/uśpieniu. Na przykład możesz stworzyć skrypt SystemD w katalogu /usr/lib/systemd/system-sleep o poniższej treści (pamiętaj o nadaniu prawa uruchamiania):

    #!/bin/bash
    if [ -n $1 ] && [ $1 = "pre" ]; then
    killall sshfs
    fi

Automatyzacja przy użyciu skryptu bash

Korzystam z SSHFS na co dzień do łączenia się z serwerem używanego przeze mnie hostingu współdzielonego. By ułatwić sobie pracę i jednocześnie uniknąć wspomnianych problemów, przygotowałem sobie skrypt podobny do poniższego.

#!/bin/bash

# set local mount directory
mountdir="/mnt/sshfs"

# unmount current connection
fusermount -q -u $mountdir

# run new connection if parameter is present
if [ $1 ]; then

	# set remote path according to given parameter
	remotedir="/home/gasior"
	if [ $1 != ~ ]; then
		remotedir="$remotedir/domains/$1"
	fi

	# run sshfs
	sshfs server_address.net:$remotedir $mountdir -o follow_symlinks -o auto_unmount -o idmap=user

fi

Jeśli uruchomię go bez parametrów, po prostu odmontuję katalog; gdy podam znak tyldy, zamontuję mój katalog domowy; a gdy podam nazwę domeny, zamontowany zostanie jej główny katalog. Oczywiście do innych zastosowań niż moje skrypt należałoby napisać inaczej. ;-)

W niniejszym wpisie zamierzałem opisać jeszcze graficzną aplikację SftpmanGTK opartą na SSHFS i umożliwiającą teoretycznie wygodne zarządzanie połączeniami SFTP. Niestety program ten …nie działa. Tak po prostu. Nie jestem w stanie zmusić go do poprawnego działania, mimo poszukiwań rozwiązania nawet w jego kodzie źródłowym. Być może jednak to ja czegoś nie umiem. ;-) Jeśli jesteś ciekawskim użytkownikiem, przetestuj go, a gdyby udałoby ci się coś w nim zdziałać, daj znać w komentarzu.

Dodaj komentarz