SCP doesn't work when echo in .bashrc?

霸气de小男生 提交于 2019-11-28 16:56:40

Using echo in a .bashrc will break scp, as scp expects to see its protocol data over the stdin/stdout channels. See https://bugzilla.redhat.com/show_bug.cgi?id=20527 for more discussion on this issue.

There's a few workarounds available:

  • Condition on the 'interactive' flag (e.g. case $- in *i* as suggested by tripleee)
  • Use the tty utility to detect an interactive shell (e.g. if tty > /dev/null or if [ -t 0 ])
  • Check the value of $SSH_TTY

I suppose you should use whichever one works for you. I don't know what the best (most portable/most reliable) option is, unfortunately.

To add to nneonneo's options, you can also condition with the interactive flag with

if [[ $- =~ "i" ]]

which I think is possibly the clearest way in bash.

Manoj Ashok

This works for me,
In .bashrc add first line as:

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

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

The default Ubuntu .bashrc contains the following snippet which already takes care of the problem:

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

In .bashrc, use STDERR as output instead:

echo "# Important Notice" >&2

Update: do not use it! We had an issue recently that a (closed source) tool failed due to an echo to STDERR in .bashrc. The tool (using rcp) expected no output at all, neither on STDOUT nor STDERR. And it stuck when it got the echo. Lesson learned: make separate accounts for humans and for machines (scripts), or just stop tattling via .bashrc.

The most portable way of testing for an interactive shell seems to be:

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

nneonneo's solution worked for me as well. But since my default shell is TCSH, I had to slightly edit the fix as follows (in .tcshrc):

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

Just thought I would share for everyone's benefit.

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

Source

If you're on Red Hat Enterprise Linux (RHEL) or variant, drop a script that does the echo, or whatever you want, into /etc/profile.d/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!