web-dev-qa-db-ja.com

sftpは「受信したメッセージが長すぎます」というエラーを出し、その理由は何ですか?

昨日はRHEL 5.4ボックス(RedHat)でsftpを行うことができましたが、今日はできません。

メッセージは"Received message too long 778199411"であり、調査の結果、RHELボックスの.bashrcecho "running .bashrc"という行が含まれていたか、何も表示されなかったことが原因だと思います。

では、なぜ行を印刷するとsftpに影響するのでしょうか?ログインやsshなどの他の状況で.bashrcの行を印刷すると機能し、sftpを追跡するのが難しいので、デザインの問題のように感じましたそのような奇妙な理由で失敗します。

だから問題は、なぜ行を出力するとそのようなエラーが発生するのか、そして.bashrcで何かを出力したい場合はどうなるのかということです。 (主にこのファイルがいつソース/実行されるかを確認するため)。

27
nonopolarity

これは長年の問題です。 10年前に、業務用の商用SSHと自宅でのオープンSSHを最初に混在させなければならなかったことがわかりました。今日もそれに遭遇し、この投稿を見つけました。

「sftp/scpは失敗しますが、sshはOKです」を検索していたとしたら、すぐに解決策を思い出すでしょう。

簡単に言うと、.bashrcや.bash_profileなどはサイレントである必要があります。そうしないと、sftp/scp接続プロトコルに干渉します。

Open-SSH FAQをご覧ください:

2.9-sftp/scpは接続に失敗しますが、sshは問題ありません。

27
Peter Scott

少なくともSFTPの場合、internal-sftpまたは.bashrcを読み取らないため、/etc/motdサブシステムを使用して修正できます。

/etc/ssh/sshd_configファイルを変更して、SFTPサブシステムを変更するだけです。

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

そして、エラーはなくなりました。

18
Kenneth

そのIDがbashを使用している場合は、リモートマシンのIDのユーザー名の〜/ .bashrcの先頭に以下を追加するだけです

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

これは、ファイル全体をソースするのではなく、単に〜/ .bashrcから早期に終了します...これにより、そのIDにログインせず、そのユーザー名をリモートIDとしてscpまたはsftpを実行しているときに.bashrcをサイレントにすることができます...他の回答で@Peter Scottを引用するには:「簡単に言うと、.bashrcや.bash_profileなどはサイレントである必要があります。そうしないと、sftp/scp接続プロトコルに干渉します。」

または、そのリモートIDがzshを使用している場合は、〜/ .zshrcの先頭に以下を追加します

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

リモートマシンのシェルが〜/ .bashrcを使用しない場合は、上記のファイル〜/ .bashrc_profileまたは〜/ .profileなどを編集して、そのリモートボックスのシェルに合わせます。

3
Scott Stensland

私がこれについてどこかで見たすべての応答は、それが/etc/motd、または.bashrcなどを介して出力された出力が多すぎると主張しています。常に正しいとは限りません。 .bashrcのないアカウントをお持ちの場合、/etc/motdは空で、デフォルトの.bashrcminimalであり、印刷出力はありません。 。シェルが/sbin/nologinまたは/bin/falseのユーザーアカウントを持っている場合、このエラーは引き続き発生します。

なぜあなたはこれをしますか?誰かがroot-jailed sftpを許可しようとしていて、セキュアシェルアクセスがない場合、これが発生します。

回避策:sshを許可し、同様にルートの刑務所に入れます。これはsshで対処する必要のある問題であり、まだ先の話です。

2
TekOps

もう1つの理由が考えられます。 openssh-5.3p1-122.el6.x86_64が適用されたRHEL 6では、LOCALEが「C」のままであると正しく動作しないことがわかりました。次のように変更した場合:

export LC_ALL="en_US.UTF-8"

その後、sftpは正しく動作します。以前のopenssh-5.3p1-118では、このような動作は発生していなかったため、おそらくこのビルドのマイナーなバグの可能性があります。

1
Jaroslav Kucera

私の場合、それを機能させるために、Ubuntuウェルカムメッセージを無効にする必要がありました。

0
Walty Yeung