scp nie działa, ale działa ssh

56

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

$ scp file server:
                   _____  _____  _____
$

, następnie drukowane są trzy linie i plik nie jest kopiowany. Jednak mogę połączyć się z serwerem przez ssh bez problemu:

$ ssh server

Jak sprawić, by scp działał?

scdmb
źródło
Podaj więcej informacji, takich jak system operacyjny, plik konfiguracyjny ssh itp.
qroberts
A jakie są te trzy wiersze, które są drukowane?
jjlin
W normalnym przypadku po uruchomieniu scp file server:(zakładając, że „serwer” jest prawidłową nazwą hosta), plik jest kopiowany do katalogu konta.
dan_linder
3
Czy możesz podać dane wyjściowe po uruchomieniu „serwera plików scp -v:”.
dan_linder
Możesz spróbować scpwybrać inną lokalizację na serwerze, a następnie a cplub mvpóźniejssh
Jesse W. Collins,

Odpowiedzi:

68

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

Sprawdź wszystkie skrypty logowania na serwerze, a także spróbuj użyć innego użytkownika. Inną metodą identyfikacji źródła błędu jest użycie w komendzie opcji -v, aby śledzić postęp transakcji i zobaczyć, gdzie się ona nie powiedzie. W razie potrzeby możesz użyć do -vvv, aby zwiększyć gadatliwość. Sprawdzanie różnych form scp może być również pouczające, jak wymieniono w poście przez InChargeOfIT.

scp, pod maską, konfiguruje tunel za pomocą ssh, a następnie przesyła plik przez ten tunel, z komendą ssh na drugim końcu, aby złapać plik w miarę jego nadawania. Ilustruje to użycie tar i ssh do skopiowania struktury katalogów z zachowaniem własności i czasów tworzenia za pomocą następujących poleceń:

  tar czf - ./* | ssh [email protected] tar xzf - -C ~/saved_tree

wysłać to i

ssh [email protected] "tar czf - ~/saved_tree" | tar xzvf - -C ./

odzyskać.

faitjx
źródło
To jest naprawdę pomocne
klon
Czy można wykryć scp w .bashrc? Czyli możesz sprawdzać i drukować tylko wtedy, gdy powłoka nie jest scp?
Alexandros,
Użytkownik musi również mieć poziom uprawnień 15. Jeśli użytkownik nie ma poziomu uprawnień 15, ASA po prostu zamknie połączenie po uwierzytelnieniu bez komunikatu o błędzie wskazującego na problem z uprawnieniami. Również fakt, że użytkownik może wpisać enablei wprowadzić hasło, nie oznacza, że ​​jest on prywatny 15. Jeśli nie widzisz gdzieś „przywileju 15” show run | inc USERNAME, nie będzie w stanie scp.
Tyler Abair
Zasadniczo usunąłem „zsh” z mojego .bashrc na zdalnym serwerze i scp zaczął działać!
Geek
Rozbija również jeśli zmienia zmiennej powłoki (np export SHELL=/bin/zsh) w ~/.bashrc. Czasami używa się tego pod nieobecność chsh.
Suuuehgi,
57

Sprawdź .bashrc lub równoważny plik docelowego użytkownika. ~ / .bashrc jest pozyskiwany dla nieinteraktywnych loginów. Jeśli pojawi się echo lub polecenie, które coś wyprowadza, zepsuje protokół SCP.

spoulson
źródło
10
EUREKA! To był mój problem, ponieważ miałem fortunę | cowsay przy każdym logowaniu w moim zdalnym .bashrc. Teraz działa idealnie.
Thomas Browne,
3
Panie, jesteś ratownikiem. :)
Gaurav Manchanda
4
Jeśli nadal chcesz fortune | cowsay, po prostu włóż go do .bash_profile. Dotyczy to tylko interaktywnych loginów i nie powinno być pozyskiwane podczas sesji SCP.
spoulson
Mój problem polegał na tym, że pozyskiwałem inny plik .bashrc, który nie istniałby na innym komputerze. Możesz użyć logiki w tej odpowiedzi, aby pominąć, ~/.bashrcgdy nie jest interaktywny (tak jest w przypadku scp).
wisbucky
15

Edycja: Czy masz pewność, że wpisujesz prawidłową ścieżkę w poleceniu scp? Na przykład:

scp test.txt [email protected]

zawiedzie (w rzeczywistości wydrukuje polecenie tak, jak widzisz). W takim przypadku musisz podać prawidłową ścieżkę do zdalnego serwera .. np.scp test.txt [email protected]:~/

Przykładowe zastosowania:

Wyślij plik:

scp /path/to/local/file [email protected]:/path/to/remote/directory

Uzyskaj plik:

scp [email protected]:/path/to/remote/file /path/to/local/directory

Przykłady:

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

scp ~/Desktop/myfile.txt [email protected]:~/

Pamiętaj, że ~jest to skrót do twojego katalogu domowego ... np. / Home /

Wyślij plik do katalogu głównego:

scp ~/Documents/working/index.html [email protected]:/var/www/index.html

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

InChargeOfIT
źródło
2
nie odpowiadasz na pytanie. wiersz polecenia podany przez OP wygląda całkiem dobrze, interesującą częścią jest ------... żaden z twoich przykładów się z tym nie wiąże.
akira
@akira może, może nie. Brak podania prawidłowych ścieżek spowoduje, że polecenie scp nie powiedzie się. Np. scp somefile [email protected]:Brak odpowiednich uprawnień do zdalnego katalogu również spowoduje problemy. Zredagowałem moją odpowiedź, aby była trochę jaśniejsza
InChargeOfIT
1
żaden z twoich przykładów nie obejmuje „plik nie istnieje”, żaden z twoich przykładów nie obejmuje „niewłaściwych uprawnień po stronie serwera” ...
akira
4

Na niektórych hostach niepoprawnie .bash_profilepobierają nielogiczne loginy, takie jak scp. Komunikaty drukowane na terminalu mogą spowodować scpnieprawidłowe działanie. Jeśli masz w sobie wiadomości, .bash_profilemoże to być przyczyną.

Aby nadal wyświetlać komunikaty logowania, banery itp. Przy logowaniu interaktywnym i nadal móc korzystać scpz nieinteraktywnego logowania, dodaj następujące elementy przed każdą wiadomością wydrukowaną w .bash_profilepliku.

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

[ -z "$PS1" ] && return

Alternatywny kod to:

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

I inny alternatywny kod:

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

Uważam, że jest to dłuższa wersja pierwszego alternatywnego kodu. Znalazłem na niektórych hostach, że pierwszy kod nie działa poprawnie, ale drugi działa.

Podczas nieinteraktywnego logowania SCP przerwie dalsze wykonywanie .bash_profile i pozwoli scp działać, ale wyświetli twoje komunikaty logowania podczas logowania przez ssh.

Uwaga: Można tego również użyć w twoim .bashrcpliku, jeśli go źródło .bash_profile(dla $ PATH), więc tylko część jest pozyskiwana podczas nieinteraktywnych logowań.

Frederickjh
źródło
dzięki działa jak urok ........
coś
0

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

Jeśli scpzawiesza się z powodu wiadomości od ssh, może pomóc w ich zniesieniu:

scp -o "StrictHostKeyChecking no"

i / lub

scp -B

Od człowieka scp:

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

-o ssh_option Można użyć do przekazania opcji do ssh w formacie używanym w tym przypadku, że nie ma oddzielnej flagi wiersza polecenia scp. Aby uzyskać szczegółowe informacje na temat opcji wymienionych poniżej i ich możliwych wartości, patrz ssh_config (5).

W moim przypadku to wydawało się pomóc, ale nie rozwiązało całego problemu. Nie mogliśmy dowiedzieć się, dlaczego scp zawiesza się podczas przesyłania ze zdalnego do zdalnego. Zawieszony na środku pliku. 9 razy zadziałało, próba numer 10 nie. Podejrzewaliśmy, że może się zawiesić, gdy nasze połączenie VPN na chwilę zwiększy ruch, a następnie scp nie zostanie przywrócony. Naprawdę po prostu zawiesza się na zawsze i nawet nie wyświetla komunikatu o błędzie.

Jednak poddałem się i przestawiłem na sftp. Jest to znacznie szybsze, ponieważ wykorzystuje bezpośrednie połączenie między zdalnymi hostami. Musisz włączyć

Host example.com
    AgentForward yes

w pliku ~ / .shh / config komputera, na którym działa skrypt. Oczywiście jest to rozwiązanie tylko wtedy, gdy oba zdalne komputery znajdują się w zaufanej sieci.

anarchist912
źródło
0

I dzwoni exec /bin/bashw .cshrc.

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

spadki
źródło