Tomasz Gąsior

Blog o oprogramowaniu, internecie, mediach i nie tylko.

Wpis

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

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

Pasek boczny

Ostatnie wpisy

Nowe komentarze

„Inteligentny wszystko zauważa. Głupi wszystko komentuje.”

Heinrich Heine