Problem z odpowiedzią @jakuje jest taki: działa tylko z gniazdami , ale nie można używać standardowych narzędzi UNIX oczekujących plików :
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: Brak takiego urządzenia lub adresu
Istnieje również problem polegający na tym, że plik lokalnego gniazda nie jest usuwany na zdalnym hoście; po następnym uruchomieniu tego samego polecenia pojawi się ostrzeżenie, a gniazdo nie zostanie poprawnie utworzone ponownie. Można dać opcję -o StreamLocalBindUnlink=yes
, aby ssh
się rozłączyć to stare gniazdo, ale w moich testów nie było na tyle; musisz również edytować cię, sshd_config
aby zawierał StreamLocalBindUnlink=yes
tę opcję, aby zadziałała.
Ale możesz użyć socat
lub netcat
dowolnego innego podobnego narzędzia obsługującego lokalne gniazda UNIX ( netcat-traditional
to NIE wystarczy!), Aby użyć lokalnego przekazywania gniazd do przesyłania plików:
# start local process listening on local socket, which receives the data when ssh opens the connections and saves it to a local file
nc -l -N -U /tmp/sock.local >/tmp/file.local &
# connect to remote $HOST and pipe the remote file into the remote socket end
ssh \
-o ExitOnForwardFailure=yes \
-o StreamLocalBindUnlink=yes \
-R /tmp/sock.remote:/tmp/sock.local \
"$HOST" \
'nc -N -U /tmp/sock.remote </tmp/file.remote'
Możesz także uruchamiać interaktywne polecenia, w takim przypadku należy użyć ssh -t
do przydzielenia TTY.
Problem z tym rozwiązaniem polega na tym, że musisz na stałe zakodować ścieżki lokalnych gniazd systemu UNIX: lokalnie nie jest to tak duży problem, jak można uwzględnić $$
w ścieżce, aby był unikalny dla procesu lub użytkownika jako katalog tymczasowy, ale w katalogu Zdalnie, lepiej nie używaj katalogu do zapisu na świecie, /tmp/
jak w moim przykładzie. Katalog musi już istnieć podczas ssh
uruchamiania sesji. A i-węzeł gniazda pozostanie nawet po zamknięciu sesji, więc użycie czegoś takiego jak „$ HOME / .ssh. $$” zaśmieci twój katalog martwymi i-węzłami z czasem.
Możesz także użyć połączonych gniazd TCP localhost
, co pozwoli ci uniknąć bałagania systemów plików martwymi i-węzłami, ale nawet przy nich nadal będziesz miał problem z wyborem (unikalnego) nieużywanego numeru portu. Więc nadal nie jest idealny. ( ssh
ma kod do dynamicznego przydzielania portów, ale nie znalazłem sposobu na odzyskanie tych informacji na zdalnym hoście).
Prawdopodobnie najłatwiejszym rozwiązaniem do skopiowania plików jest skorzystanie z wbudowanej funkcji udostępniania połączenia ssh i wykonanie polecenia scp
lub sfrp
podczas, gdy sesja interaktywna jest nadal uruchomiona równolegle. Zobacz Skopiuj plik z powrotem do systemu lokalnego za pomocą ssh .
closefrom(STDERR_FILENO + 1)
wywołania w kodzie źródłowym OpenSSH. Czego chcesz to zrobić?