sftp видає помилку: "Надто довго отримане повідомлення", і в чому причина?


26

Я sftpвчора міг зробити коробку RHEL 5.4 (RedHat), а сьогодні не можу.

Повідомлення є "Received message too long 778199411", і після деякого розслідування, це було пов’язано з тим, що в моїй коробці RHEL .bashrcз'явилася лінія echo "running .bashrc"- або що-небудь повторюється, я думаю.

То чому б це впливало на друк ліній sftp? Це було трохи схоже на проблему дизайну, як друк рядка в .bashrcроботах в інших ситуаціях, таких як вхід у систему або, sshі їх важко відстежити, коли sftpне вдалося з такої дивної причини.

Тож питання полягає в тому, чому друк на лінії викликає таку помилку і що, якщо ми все-таки любимо щось надрукувати .bashrc? (головним чином, щоб побачити, коли цей файл отримати / виконати).


Відповіді:


26

Це давня проблема. Я знайшов це десять років тому, коли мені вперше довелося змішувати комерційні SSH на роботі та відкриті SSH вдома. Сьогодні я знову наткнувся на це і знайшов цю посаду.

Якби я шукав "sftp / scp fails, але ssh все в порядку", мені б нагадували про рішення швидше!

Простіше кажучи, .bashrc та .bash_profile тощо повинні бути беззвучними або вони заважають протоколу з'єднання sftp / scp.

Дивіться поширені запитання щодо відкритого SSH:

2.9 - sftp / scp не працює при з'єднанні, але ssh в порядку.


Самовикористовувані утиліти оболонок є хорошими винуватцями цієї проблеми. Для мене часто менеджер версій Ruby втручався в розгортання Дженкінса.
Ерік П.

Дякую за це, видаливши деякі налагодження ехо-заяв, які я мав у своєму bashrc, і bash_profile вирішив це для мене.
SgtPooki

3
Неправильний .bashrc повинен мовчати, .bash_profile може перегукуватися без проблем.
kubanczyk

2
Для всіх, хто тут приземлився: Як це запропоновано на сервері defaultfault.com/a/630714 , ви можете використовувати ssh yourhost /usr/bin/trueдля зондування виводу вашого ssh. У моєму випадку я знайшов якусь команду в ~ / .bashrc почав видавати помилки.
Юваль Ацмон

16

Принаймні для SFTP це можна виправити за допомогою internal-sftpпідсистеми, оскільки це не зчитується .bashrcабо /etc/motd.

Просто змініть /etc/ssh/sshd_configфайл і змініть підсистему SFTP:

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

І помилки вже немає.


Мені подобається цей .. просто цікаво, чи це має якісь наслідки для безпеки?
RoyM

internal-sftpІМО - це кращий спосіб запропонувати підтримку SFTP. Ви можете побачити цю пов’язану публікацію: serverfault.com/questions/660160/…
Кеннет

Після того, як ваша пропозиція змінити sshd_config, я вбив sshd та sftp (не впевнений, чи був демон). Перший раз отримане повідомлення отримало занадто довгу помилку, але все-таки було зареєстровано. Потім повернімося до тієї ж проблеми
ясне світло

2

Кожна відповідь, яку я бачив десь із цього приводу, стверджує, що це занадто багато друкованого виводу через /etc/motdабо .bashrcін. Якщо у вас є обліковий запис, у якого немає .bashrc, значення /etc/motdпусте, а за замовчуванням .bashrc- мінімальний, без друкованого виводу ВИ МОЖЕТЕ ВЗАЄМО проблеми. Якщо у вас є обліковий запис користувача із оболонкою /sbin/nologinабо /bin/falseця помилка все-таки відбудеться.

Навіщо ти це зробив ??? Якщо ви намагалися дозволити комусь в'язницю sftpбез доступу захищеної оболонки, це станеться.

Пообіцяйте: дозвольте sshі покладіть їх також у кореневу в'язницю. Це проблема, яку потрібно вирішити ssh, це ще занадто довго.


У мене була ця проблема саме через занадто довгий користувацький вихід у моєму .bashrc (у мене є screenfetch там). Але я все ще намагаюся з’ясувати, як змусити це ігнорувати це
vladkras

Так, це могло бути так. Ви повинні змінити ssh. У нашому випадку це була проблема з оболонкою. Ми фактично використовували sftp-клієнта спеціально для root-jail, тому не довелося робити всіх речей, що вкладаються у в'язницю.
TekOps

Справа в тому, що я не хочу змінювати свій .bashrc. Я хочу підключитися до сервера з будь-якою довжиною першого повідомлення. Тому я, мабуть, повинен змінювати настройки свого IDE, ймовірно,
vladkras

2

просто поставте наступну поверх ~ / .bashrc на ім'я користувача id на віддаленій машині, якщо цей ідентифікатор використовує bash

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

який просто виходить рано з ~ / .bashrc замість пошуку всього файлу ... це вирішує зробити .bashrc мовчазним, коли ви не входите в цей ідентифікатор і просто запускаєте scp або sftp з цим ім'ям користувача як віддалений ідентифікатор ... цитую @ Петра Скотта в іншій відповіді: "Попросту кажучи, .bashrc та .bash_profile тощо повинні бути безмовними або вони заважають протоколу з'єднання sftp / scp."

Крім того, якщо цей віддалений ідентифікатор використовує zsh, тоді слід дотримуватися наступного вгорі його ~ / .zshrc

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

Якщо оболонка на віддаленій машині не використовує ~ / .bashrc, тоді зробіть вище редагування у файлі ~ / .bashrc_profile або ~ / .profile або подібному, щоб відповідати вашій оболонці на цьому віддаленому вікні


1

Може бути ще одна причина. На RHEL 6 з openssh-5.3p1-122.el6.x86_64 ми виявили, що він поводиться неправильно, коли LOCALE залишається на "C". При зміні:

export LC_ALL="en_US.UTF-8"

Тоді sftp веде себе правильно. У попередньому openssh-5.3p1-118 ми не спостерігали такої поведінки, тому, ймовірно, є незначна помилка в цій збірці.


1
Ця, здавалося б, дивна пропозиція була тим, що спрацювало для моєї ситуації. Спасибі!
jwd630

0

У моєму випадку, для того, щоб це працювало, мені потрібно було відключити привітання Ubuntu.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.