sftp wyświetla błąd: „Za długo odebrano wiadomość” iz jakiego powodu?

26

sftpWczoraj mogłem zrobić z urządzeniem RHEL 5.4 (RedHat), a dziś nie mogę.

Wiadomość jest taka "Received message too long 778199411", a po pewnym dochodzeniu wynikała z tego, że moja skrzynka RHEL .bashrcma linię echo "running .bashrc"- lub w ogóle coś echa, tak myślę.

Dlaczego więc miałoby to wpływać na wydrukowanie linii sftp? Wydawało się to trochę problemem projektowym, ponieważ drukowanie linii w .bashrcpracach w innych sytuacjach, takich jak logowanie lub sshjest dość trudne do wyśledzenia, gdy sftpzawodzi z tak dziwnego powodu.

Pytanie brzmi: dlaczego wydrukowanie linii powoduje taki błąd i co jeśli nadal chcemy coś wydrukować .bashrc? (głównie, aby zobaczyć, kiedy ten plik zostanie pobrany / wykonany).

nopole
źródło

Odpowiedzi:

26

To długotrwały problem. Znalazłem to dziesięć lat temu, kiedy po raz pierwszy musiałem mieszać komercyjny SSH w pracy i open-SSH w domu. Znalazłem go dzisiaj i znalazłem ten post.

Gdybym szukał „sftp / scp nie powiedzie się, ale ssh jest OK”, przypomniałbym sobie o rozwiązaniu wcześniej!

Mówiąc prościej, .bashrc i .bash_profile itp. Muszą być ciche lub zakłócają protokół połączenia sftp / scp.

Zobacz otwarte SSH FAQ:

2.9 - sftp / scp kończy się niepowodzeniem przy połączeniu, ale ssh jest w porządku.

Peter Scott
źródło
Samouaktualniające się narzędzia powłoki są dobrym winowajcą tego problemu. Dla mnie często był to menedżer wersji Ruby, który przeszkadzał w wdrożeniu nad ssh Jenkinsa.
Eric P.
Dzięki za usunięcie niektórych instrukcji echa debugowania, które miałem w moim bashrc i bash_profile rozwiązało to dla mnie.
SgtPooki
3
Nieprawidłowy plik .bashrc musi być cichy, plik .bash_profile może bez problemu wywoływać echo.
kubańczyk
2
Dla każdego, kto wyląduje tutaj: Jak sugerowano w serverfault.com/a/630714 , możesz użyć ssh yourhost /usr/bin/truedo zbadania wyjścia twojego ssh. W moim przypadku znalazłem jakieś polecenie w ~ / .bashrc zaczęło generować błędy.
Yuval Atzmon
16

Przynajmniej w przypadku SFTP można to naprawić za pomocą internal-sftppodsystemu, ponieważ nie czyta .bashrcani /etc/motd.

Po prostu zmień /etc/ssh/sshd_configplik i zmień podsystem SFTP:

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Błąd zniknął.

Kenneth
źródło
Podoba mi się ten ... po prostu zastanawiam się, czy to ma wpływ na bezpieczeństwo?
RoyM
internal-sftpjest, IMO, lepszym sposobem oferowania wsparcia SFTP. Możesz zobaczyć ten powiązany post: serverfault.com/questions/660160/…
Kenneth
Po twojej sugestii zmiany sshd_config zabiłem sshd i sftp (nie jestem pewien, czy był demon). Za pierwszym razem otrzymałem zbyt długi błąd otrzymanej wiadomości, ale mimo to został zalogowany. Następnie wróć do tego samego problemu
wyczyść
2

Każda odpowiedź widziałem nigdzie na tym wszyscy twierdzą, że jest zbyt dużo wydruku poprzez /etc/motd, lub .bashrcitp nie zawsze prawdziwe. Jeśli masz konto, które nie ma .bashrc, oznacza /etc/motdto , że jest puste, a wartość domyślna .bashrcjest minimalna i nie ma wydruków. Jeśli masz konto użytkownika z powłoką /sbin/nologinlub /bin/falseten błąd nadal będzie występował.

Dlaczego miałbyś to zrobić??? Jeśli próbujesz przyznać komuś aresztowanie roota sftp, bez dostępu do bezpiecznej powłoki tak się stanie.

Obejdź: pozwól sshim również umieścić je w więzieniu. Jest to problem, którym należy się zająć ssh. Nadchodzi zbyt długo.

TekOps
źródło
Miałem ten problem właśnie z powodu zbyt długiego niestandardowego wyjścia w moim .bashrc (mam tam screenfetch). Ale wciąż próbuję wymyślić, jak to zignorować
vladkras,
Tak, może tak być. Musisz zmodyfikować ssh. W naszym przypadku był to problem ze skorupą. Właściwie użyliśmy klienta sftp specjalnie dla więzienia roota, więc nie musieliśmy robić wszystkich rzeczy związanych z więzieniem roota.
TekOps,
Chodzi o to, że nie chcę modyfikować mojego .bashrc. Chcę połączyć się z serwerem z dowolną długością pierwszej wiadomości. Więc prawdopodobnie muszę zmodyfikować ustawienia mojego IDE
vladkras
2

po prostu wstaw następujący znak na początku ~ / .bashrc na nazwie użytkownika id na zdalnym komputerze, jeśli ten identyfikator używa bash

# If not running interactively, don't do anything and return early
[[ $- == *i* ]] || return  

który po prostu wychodzi wcześniej z ~ / .bashrc zamiast pozyskiwać cały plik ... rozwiązuje to wyciszenie .bashrc, gdy nie logujesz się do tego identyfikatora i po prostu uruchamiasz scp lub sftp z tą nazwą użytkownika jako zdalnym identyfikatorem ... cytując @Peter Scott w innej odpowiedzi: „Mówiąc wprost, .bashrc i .bash_profile itp. muszą milczeć lub zakłócają protokół połączenia sftp / scp.”

Alternatywnie, jeśli ten zdalny identyfikator korzysta z zsh, umieść następujące na jego ~ / .zshrc

# If not running interactively, don't do anything and return early
[[ -o interactive ]] || exit 0

Jeśli powłoka na zdalnym komputerze nie używa ~ / .bashrc, wykonaj powyższą edycję w pliku ~ / .bashrc_profile lub ~ / .profile lub podobnym, aby dopasować ją do powłoki na tym zdalnym komputerze

Scott Stensland
źródło
1

Może być jeszcze jeden powód. Na RHEL 6 z openssh-5.3p1-122.el6.x86_64 stwierdziliśmy, że zachowuje się źle, gdy LOCALE pozostaje w „C”. Po zmianie za pomocą:

export LC_ALL="en_US.UTF-8"

Następnie sftp zachowuje się poprawnie. W poprzednim openssh-5.3p1-118 nie doświadczyliśmy takiego zachowania, więc prawdopodobnie jest to niewielki błąd w tej wersji.

Jaroslav Kucera
źródło
1
Ta z pozoru dziwna sugestia zadziałała w mojej sytuacji. Dzięki!
jwd630,
0

W moim przypadku, aby to działało, musiałem wyłączyć wiadomość powitalną Ubuntu.

Walty Yeung
źródło