SCP 失败且没有错误

mtv*_*vec 57 scp

一段时间以来,我一直在经历 SCP 非常奇怪的行为:每当我尝试复制文件时,SCP 的输出都包含一堆下划线,并且文件没有被复制。

$ scp test.txt 192.168.0.2:~
job@192.168.0.2's password: 
 ________________________________________
Run Code Online (Sandbox Code Playgroud)

当我使用 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
Run Code Online (Sandbox Code Playgroud)

我正在运行 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
Run Code Online (Sandbox Code Playgroud)

$ type scp
scp is hashed (/usr/bin/scp)
Run Code Online (Sandbox Code Playgroud)

mtv*_*vec 97

好的,大声笑,我刚刚弄清楚问题是什么。

因为我非常喜欢奶牛,所以我把它放在fortune | cowsay我的.bashrc文件的顶部,它在启动时会产生如下输出bash

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

当以bash交互方式运行时,这一切都很好(有时很有趣)。但是,~/.bashrc当bash是交互式的而不是登录 shell 时,或者当它是登录 shell 并且其父进程是rshdsshd时,bash 会读取。当你运行时scp,服务器启动一个 shell,它启动一个远程scp实例。的输出令人.bashrc困惑,scp因为它的发送方式与scp协议数据的发送方式相同。这显然是一个已知的错误,有关更多详细信息,请参见此处

另请注意,我在问题中提到的下划线是文本气球顶行中的下划线。

所以解决方案很简单:我将以下内容.bashrc放在远程(目标)机器的顶部:

# If not running interactively, don't do anything
[[ $- == *i* ]] || return
Run Code Online (Sandbox Code Playgroud)

该行在默认情况下存在,.bashrc但由于我的许多(显然是粗心的)编辑而被搁置。


Mar*_*son 6

AFAIK,启用scp不受阻碍的正确方法不是关于~/.bashrc脚本中标准输出的条件,而是关于简单地将屏幕输出限制为~/.bash_profile脚本。至少我的发行版 (CentOS) 是这样工作的。

为清楚起见编辑:

  1. 根据“所有”远程连接的要求,仅在您的 ~/.bashrc 文件中放置行(即设置某些 ENV 变量是可以的,但回显人类可读的文本则不然。)
  2. 青年会