SCPはエラーなしで失敗します


45

私はしばらくの間、SCPの非常に奇妙な動作を経験してきました。ファイルをコピーしようとすると、SCPの出力にはアンダースコアがたくさん含まれ、ファイルはコピーされません。

$ scp test.txt 192.168.0.2:~
job@192.168.0.2's password: 
 ________________________________________

Midnight Commanderを使用してSSH接続を作成し、ファイルをコピーすると機能します。

私のマシンに関する情報:

$ ssh -V
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010

$ uname -a
Linux squatpc 2.6.38-10-generic #46-Ubuntu SMP Tue Jun 28 15:05:41 UTC 2011 i686 i686 i386 GNU/Linux

そして、私はKubuntu 11.04を実行しています。

編集:コメントで要求された詳細情報:

$ scp -v test.txt 192.168.0.2:~
Executing: program /usr/bin/ssh host 192.168.0.2, user (unspecified), command scp -v -t -- ~
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 192.168.0.2 [192.168.0.2] port 22.
debug1: Connection established.
debug1: identity file /home/job/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: identity file /home/job/.ssh/id_rsa-cert type -1
debug1: identity file /home/job/.ssh/id_dsa type -1
debug1: identity file /home/job/.ssh/id_dsa-cert type -1
debug1: identity file /home/job/.ssh/id_ecdsa type -1
debug1: identity file /home/job/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.8p1 Debian-1ubuntu3
debug1: match: OpenSSH_5.8p1 Debian-1ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.8p1 Debian-1ubuntu3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA 28:f3:2b:31:36:43:9b:07:d8:33:ca:43:4f:ca:6c:4c
debug1: Host '192.168.0.2' is known and matches the ECDSA host key.
debug1: Found key in /home/job/.ssh/known_hosts:20
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/job/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /home/job/.ssh/id_dsa
debug1: Trying private key: /home/job/.ssh/id_ecdsa
debug1: Next authentication method: password
job@192.168.0.2's password: 
debug1: Authentication succeeded (password).
Authenticated to 192.168.0.2 ([192.168.0.2]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: scp -v -t -- ~
 ________________________________________
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
Transferred: sent 2120, received 1872 bytes, in 0.3 seconds
Bytes per second: sent 7783.1, received 6872.6
debug1: Exit status 0

そして

$ type scp
scp is hashed (/usr/bin/scp)

1
-vを使用して、コピー中にデバッグ情報を取得してください。
EightBitTony

また、念のため...の出力はtype scp何ですか?
rozcietrzewiacz

@EightBitTony:私の編集をご覧ください。
ジョブ

@rozcietrzewiacz:あまりにも私の編集を参照してください:-)
仕事を

2
もしそうならssh 192.168.0.2 echo hello、あなたは以外の出力を取得しますhelloか?
ジル「SO-悪であるのをやめる」

回答:


77

わかりました、問題が何であるかがわかりました。

私は牛がとても好きなので、開始時に次のような出力を生成するファイルfortune | cowsayの先頭に配置しました:.bashrcbash

 _______________________________________
< You will lose an important disk file. >
 ---------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

bashインタラクティブに実行する場合、これはすべて大丈夫です(そして時々面白い)。しかし、bashは読み込み~/.bashrc、それがログインシェルのインタラクティブおよびでない場合、またはそれがログインシェルであり、その親プロセスがあるときrshdsshd。を実行するscpと、サーバーはリモートscpインスタンスを起動するシェルを起動します。プロトコルデータの送信と同じ方法で送信されるため、.bashrc混乱scpからの出力scpです。これは明らかに既知のバグです。詳細については、こちらを参照してください。

また、質問で言及したアンダースコアは、テキストバルーンの最上行にあるアンダースコアであることに注意してください。

そのため、解決策は簡単でし.bashrcた。リモート(宛先)マシンの先頭に次のものを追加しました。

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

この行はデフォルトで存在します.bashrcが、多くの(明らかに不注意な)編集のために下に置かれました。


echo "don't have a cow" | cowsay
ステファンギメネス

うわー、数ヶ月のscpが壊れた直後に、あなたはついに答えを照らしてくれました。私はこれを考えたことがなかったでしょう。私はただそれmv ~/.bashrc ~/.bashrc.bakをテストし、それが問題であることを確認しました。
ジョンドルム

@ScottStenslandこれは、リモートの最上部に移動する必要があります.bashrc。ローカルなものは無関係です。(答えが正解である)私のコメントにタイプミスがあったことに注意してください:それは*i*、ありません*-*
ジル 'SO-悪であるのをやめる'

ダメダメダメ。rtfm。bashrcは、非対話型シェルに対して実行されます。ログイン時に幸せな牛のメッセージが必要な場合は、bash_profileを変更します。あなたは牛の知恵をしたい場合は、その後、X-ウィンドウを開くたびに、これはの一つである場合に動作するようにしようとMANY -あなたは、端末を書いすべきでないシナリオunix.stackexchange.com/questions/9605/...
symcbean

5

知る限り、妨げられscpていない状態を有効にする正しい方法は、~/.bashrcスクリプトの標準出力の条件に関するものではなく、~/.bash_profileスクリプトへの画面出力を単に制限することです。少なくともそれが私のディストリビューション(CentOS)での動作です。

明確にするために編集します。

  1. 〜/ .bashrcファイルには、「すべて」のリモート接続で必要な行のみを挿入します(つまり、特定のENV変数を設定しても問題ありませんが、人間が読み取れるテキストをエコーすることはできません)。
  2. YMMV

心を説明する?すなわち、画面出力を.bash-profileに制限する方法は?
javadba 14

1
することによりscreen、出力、私が意味するecho "Greetings, Master"か、ターミナルウィンドウに何かそのディスプレイ出力を。それを〜/ .bashrcに入れないでください-〜/ .bash_profileスクリプトに保管してください。
マークハドソン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.