当.bashrc中的回声时SCP不起作用?

时间:2012-09-15 19:17:55

标签: bash ssh scp

我在Fedora中有两个用户:

  1. root(非常明显!)
  2. 用户Wani的.bashrc的内容是:

    # .bashrc
    echo "Hello"
    # Source global definitions
    if [ -f /etc/bashrc ]; then
        . /etc/bashrc
    fi
    
    # User specific aliases and functions
    

    现在登录到root后,我输入以下命令:

    [root@Dell Wani]# touch try.txt
    [root@Dell Wani]# service sshd start
    [root@Dell Wani]# scp try.txt Wani@localhost:~/
    Wani@localhost's password: 
    Hello
    [root@Dell Wani]# 
    

    现在我登录Wani,输入:

    [Wani@Dell ~]$ cat try.txt
    cat: try.txt: No such file or directory
    [Wani@Dell ~]$ 
    

    现在我再次登录root并使用-v输入相同的命令:

    [root@Dell Wani]# scp -v morph.log Wani@localhost:
    Executing: program /usr/bin/ssh host localhost, user Wani, command scp -v -t -- .
    OpenSSH_5.6p1, OpenSSL 1.0.0j-fips 10 May 2012
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: Applying options for *
    debug1: Connecting to localhost [127.0.0.1] port 22.
    debug1: Connection established.
    debug1: permanently_set_uid: 0/0
    debug1: identity file /root/.ssh/id_rsa type -1
    debug1: identity file /root/.ssh/id_rsa-cert type -1
    debug1: identity file /root/.ssh/id_dsa type -1
    debug1: identity file /root/.ssh/id_dsa-cert type -1
    debug1: Remote protocol version 2.0, remote software version OpenSSH_5.6
    debug1: match: OpenSSH_5.6 pat OpenSSH*
    debug1: Enabling compatibility mode for protocol 2.0
    debug1: Local version string SSH-2.0-OpenSSH_5.6
    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: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
    debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
    debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
    debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
    debug1: Host 'localhost' is known and matches the RSA host key.
    debug1: Found key in /root/.ssh/known_hosts:2
    debug1: ssh_rsa_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,gssapi-keyex,gssapi-     with-mic,password
    debug1: Next authentication method: gssapi-keyex
    debug1: No valid Key exchange context
    debug1: Next authentication method: gssapi-with-mic
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Credentials cache file '/tmp/krb5cc_0' not found
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Credentials cache file '/tmp/krb5cc_0' not found
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    
    
    debug1: Next authentication method: publickey
    debug1: Trying private key: /root/.ssh/id_rsa
    debug1: Trying private key: /root/.ssh/id_dsa
    debug1: Next authentication method: password
    Wani@localhost's password: 
    debug1: Authentication succeeded (password).
    Authenticated to localhost ([127.0.0.1]:22).
    debug1: channel 0: new [client-session]
    debug1: Requesting no-more-sessions@openssh.com
    debug1: Entering interactive session.
    debug1: Sending environment.
    debug1: Sending env XMODIFIERS = @im=none
    debug1: Sending env LANG = en_US.UTF-8
    debug1: Sending command: scp -v -t -- .
    Hello
    [root@Dell Wani]# 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 1664, received 1976 bytes, in 0.1 seconds
    Bytes per second: sent 22961.5, received 27266.8
    debug1: Exit status 0
    

    (我输入后)

    [root@Dell Wani]# 
    

    任何人都可以了解一下这里到底发生了什么?为什么文件没有从root用户复制到Wani?

10 个答案:

答案 0 :(得分:66)

echo中使用.bashrc会中断scp,因为scp期望通过stdin / stdout频道查看其协议数据。有关此问题的更多讨论,请参阅https://bugzilla.redhat.com/show_bug.cgi?id=20527

有几种可用的解决方法:

  • “互动”标记上的条件(例如,由tripleee建议的case $- in *i*
  • 使用tty实用程序检测交互式shell(例如if tty > /dev/nullif [ -t 0 ]
  • 检查$SSH_TTY
  • 的值

我想你应该使用适合你的那个。不幸的是,我不知道什么是最好的(最便携/最可靠)选项。

答案 1 :(得分:18)

要添加到nneonneo的选项,您还可以使用带有

的交互式标记进行调节
if [[ $- =~ "i" ]]

我认为这可能是bash中最清晰的方式。

答案 2 :(得分:14)

这对我有用,
.bashrc中将第一行添加为:

if [ -z "$PS1" ]; then
    return
fi

https://superuser.com/questions/690735/can-i-tell-if-im-in-an-scp-session-in-my-bashrc

答案 3 :(得分:7)

默认 Ubuntu .bashrc包含以下已解决问题的代码段:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
    *) return;;
esac

答案 4 :(得分:4)

.bashrc中,使用STDERR作为输出:

echo "# Important Notice" >&2

更新:不要使用它!我们最近遇到一个问题,即由于echo中的.bashrc到STDERR,(闭源)工具失败了。该工具(使用rcp)在STDOUT和STDERR上都没有输出。当它得到回声时它会卡住。获得的经验教训:为人类和机器(脚本)创建单独的帐户,或者只是停止通过.bashrc进行调整。

答案 5 :(得分:1)

测试交互式shell的最便携方式似乎是:

test -t 0
if [ $? -eq 0 ]
then
    # interactive
    ;
else
    # non-interactive
    ;
fi

答案 6 :(得分:0)

nneonneo的解决方案也适用于我。但由于我的默认shell是TCSH,我不得不稍微编辑修复程序,如下所示(在.tcshrc中):

if ( $?SSH_TTY ) then
    exec /bin/bash
endif

我想我会分享给大家带来的好处。

答案 7 :(得分:0)

if [ 0 -eq $(shopt -q login_shell; echo $?) ]; then
  echo "do something?"
fi

Source

答案 8 :(得分:0)

如果您使用的是Red Hat Enterprise Linux(RHEL)或变体,请将执行echo或任何所需操作的脚本放入/etc/profile.d /

答案 9 :(得分:0)

如果您还想要echo语句(来自@Blauhirn的答案),则可以继续将您的echo语句放置在大小写条件之后。

case $- in
    *i*) ;;
    *) return;;
esac

echo "Your Greeting/Warning Message/s here!"