2012-02-29 15:44:22 +0000 2012-02-29 15:44:22 +0000
60
60

scp nie działa, ale ssh tak

Jeśli chcę wysłać coś przez scp na serwer:

$ scp file server:
                   __________  _____
$

, to wypisywane są trzy linie, a plik nie jest kopiowany. Mogę natomiast bez problemu połączyć się z serwerem przez ssh:

$ ssh server

Jak sprawić, żeby scp działał?

Odpowiedzi (6)

72
72
72
2012-03-04 02:57:22 +0000

Jedną z możliwych przyczyn tego typu zachowania jest wydrukowanie jakiejkolwiek wiadomości podczas procesu logowania na serwerze. Scp zależy od ssh, aby zapewnić całkowicie przezroczysty szyfrowany tunel pomiędzy klientem a serwerem.

Sprawdź wszystkie skrypty logowania na serwerze, a także spróbuj użyć innego użytkownika. Inną metodą zidentyfikowania źródła błędu jest użycie -v w poleceniu, aby prześledzić postęp transakcji i zobaczyć, gdzie się nie powiodła. Możesz użyć aż do -vvv, aby zwiększyć szczegółowość, jeśli to konieczne. Sprawdzanie różnych form scp może być również pouczające, jak wymienione w poście przez InChargeOfIT.

scp, pod maską, tworzy tunel używając ssh, a następnie przesyła plik przez ten tunel, z poleceniem ssh na dalekim końcu, aby złapać plik, gdy nadchodzi. Ilustruje to użycie tar i ssh do skopiowania struktury katalogów z zachowaniem własności i czasu utworzenia za pomocą następujących poleceń:

tar czf - ./* | ssh jf@otherserver.com tar xzf - -C ~/saved_tree

aby go przesłać, oraz

ssh jf@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C ./

aby go odzyskać.

61
61
61
2014-06-03 18:20:48 +0000

Sprawdź plik .bashrc lub jego odpowiednik u użytkownika docelowego. ~/.bashrc jest pobierany dla nieinteraktywnych loginów. Jeśli jest tam echo lub polecenie, które wypisuje cokolwiek, złamie to protokół SCP.

15
15
15
2012-02-29 17:21:01 +0000

Edit: Czy jesteś pewien, że wpisujesz poprawną ścieżkę w poleceniu scp? Na przykład:

scp test.txt username@remoteserver.com

nie powiedzie się (w rzeczywistości po prostu wydrukuje polecenie takie jak widzisz). W tym przypadku należy podać poprawną ścieżkę do zdalnego serwera, np. scp test.txt username@remoteserver.com:~/

Przykładowe zastosowania:

Wyślij plik:

scp /path/to/local/file yourremoteusername@servername.com:/path/to/remote/directory

Pobierz plik:

scp yourremoteusername@servername.com:/path/to/remote/file /path/to/local/directory

Przykładowe zastosowania:

Wyślij plik z mojego Pulpitu do mojego folderu domowego na zdalnym serwerze:

scp ~/Desktop/myfile.txt john_doe@10.1.1.10:~/

Pamiętaj, że ~ to skrót do katalogu domowego… np. /home/

Wyślij plik do webroota:

scp ~/Documents/working/index.html john_doe@johndoe.com:/var/www/index.html

W tym przykładzie, użytkownik john_doe potrzebowałby uprawnień do zapisu w zdalnym katalogu /var/www.

5
5
5
2018-12-02 14:21:35 +0000

Na niektórych hostach niepoprawnie podają źródło .bash_profile dla nieinteraktywnych logowań, takich jak scp. Wiadomości, które są drukowane do terminala mogą powodować, że scp nie działa poprawnie. Jeśli masz wiadomości w swoim .bash_profile, może to być przyczyną.

Aby nadal mieć wyświetlane komunikaty logowania, baner, itp. przy interaktywnym logowaniu i nadal móc używać scp przy nieinteraktywnym logowaniu, dodaj poniższe przed każdą wiadomością, która byłaby drukowana w pliku .bash_profile.

# **********If not running interactively, don't do anything more!***********

[-z "$PS1"] && return

Alternatywny kod to:

[[$- == *i*]] || return

I jeszcze jeden alternatywny kod:

case $- in
    *i*) ;;
      *) return;;
esac

Który moim zdaniem jest dłuższą wersją pierwszego alternatywnego kodu. Odkryłem, że na niektórych hostach pierwszy kod nie działa poprawnie, ale drugi tak.

Podczas nieinteraktywnego logowania scp przerwie dalsze wykonywanie pliku .bash_profile i pozwoli na działanie scp, ale wyświetli komunikaty logowania, gdy logujesz się przez ssh.

Uwaga: To może być również użyte w twoim pliku .bashrc, jeśli umieścisz go w źródle .bash_profile (dla $PATH), tak aby tylko jego część była pobierana podczas nieinteraktywnych logowań.

0
0
0
2018-10-14 14:34:43 +0000

Wywoływałem exec /bin/bash w .cshrc.

Usunięcie tego rozwiązało dla mnie problem.

0
0
0
2018-10-02 14:01:50 +0000

To nie odpowiada bezpośrednio na pytanie, ale może być pomocne dla ludzi takich jak ja, szukających rozwiązania z zamrażającym scp podczas przesyłania plików między 2 zdalnymi hostami.

Jeśli scp zawiesza się z powodu wiadomości z ssh, może to pomóc je stłumić:

scp -o "StrictHostKeyChecking no"

i / lub

scp -B

Z mana scp:

-B Wybiera tryb wsadowy (zapobiega pytaniu o hasła lub passphrase).

-o sshoption Może służyć do przekazywania opcji do ssh w formacie używanym w nie ma osobnej flagi wiersza poleceń scp. Pełne szczegóły dotyczące opcji wymienionych poniżej, oraz ich możliwych wartości, zobacz sshconfig(5).

W moim przypadku wydawało się to pomocne, ale nie rozwiązało całego problemu. Nie mogliśmy znaleźć przyczyny, dla której scp zawiesza się podczas przesyłania plików ze zdalnego na zdalne. Zawieszał się w połowie pliku. 9 razy zadziałało, próba numer 10 nie. Podejrzewaliśmy, że może to być spowodowane tym, że scp zawiesza się, gdy nasze połączenie VPN dostaje skokowy ruch na chwilę, a następnie scp nie odzyskuje sprawności. To naprawdę po prostu zawiesza się na zawsze i nie daje nawet komunikatu o błędzie.

Jednakże, poddałem się i przełączyłem się na sftp. Jest on relatywnie szybszy, ponieważ używa bezpośredniego połączenia pomiędzy zdalnymi hostami. Musisz jednak włączyć opcję

Host example.com
    AgentForward yes

w pliku ~/.shh/config maszyny, na której uruchomiony jest skrypt. Oczywiście jest to rozwiązanie tylko wtedy, gdy zdalne maszyny znajdują się w zaufanej sieci.