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.

Смотрите open-SSH FAQ:

2.9 - ошибка sftp / scp при соединении, но ssh в порядке.


Самообновляющиеся утилиты оболочки являются хорошими виновниками этой проблемы. Для меня это часто был менеджер версий Ruby, мешавший Jenkins 'deploy-over-ssh.
Эрик П.

Спасибо за это, удаление некоторых отладочных эхо-операторов, которые были в моем bashrc и bash_profile, решило это для меня.
SgtPooki

3
Неправильный .bashrc должен молчать, .bash_profile может отображать без проблем.
Кубанчик

2
Для любого, кто приземлится здесь: Как предлагается в serverfault.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-sftpIMO - лучший способ предложить поддержку SFTP. Вы можете увидеть этот связанный пост: serverfault.com/questions/660160/…
Кеннет

После вашего предложения по изменению sshd_config я убил sshd и sftp (не уверен, был ли демон). В первый раз полученное сообщение получило слишком длинную ошибку, но все равно было зарегистрировано. Тогда вернемся к той же проблеме
ясный свет

2

В каждом ответе, который я видел где-либо на этом, все утверждается, что это слишком много печатных выводов через /etc/motd, или .bashrcи т. Д. Не всегда верно. Если у вас есть учетная запись , которая имеет не .bashrc, то /etc/motdпусто, и по умолчанию .bashrcявляется минимальным , не отпечатком ПОЗВОЛЯЮЩИХ иметь проблему. Если у вас есть учетная запись пользователя с оболочкой /sbin/nologinили /bin/falseэта ошибка все равно произойдет.

Зачем ты это делаешь ??? Если вы пытаетесь предоставить кому-либо root-jailed sftp, без доступа к защищенной оболочке это произойдет.

Обойти: разрешить sshи положить их в корневую тюрьму, а также. Это проблема, с которой нужно бороться ssh, она слишком долгая.


У меня была эта проблема именно из-за слишком длинного пользовательского вывода в моем .bashrc (там у меня есть screenfetch). Но я все еще пытаюсь понять, как заставить это игнорировать это
vladkras

Да, это может быть так. Вы должны изменить SSH. В нашем случае это была проблема с оболочкой. На самом деле мы использовали клиент sftp специально для root-jail, поэтому нам не пришлось делать все, что касается 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 с этим именем пользователя в качестве удаленного идентификатора ... процитировать @Peter Scott в другом ответе: «Проще говоря, .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.