Problemas com scp se eu usar o bashrc para abrir peixes se estiver presente

3

Situação: É necessário fazer login em vários servidores remotos, sendo que alguns deles têm fish shell

Requisito: O shell padrão é bash. Se eu fizer login em um servidor e o peixe estiver presente, mude para o fish shell, caso contrário, fique no bash.

Tentei .bashrc:

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Source global definitions
if [ -f /etc/bash.bashrc ]; then
        . /etc/bash.bashrc
fi

# Update Path
export PATH=/sbin:/usr/sbin:/usr/local/sbin:$PATH:$HOME/.bin

# Open fish shell if present, otherwise stick to bash
if hash fish 2>/dev/null; then
        # echo "Fish detected, shifting shell"
        fish "$@"; exit
fi

No entanto, o scp não parece estar funcionando. Quando tento scp um arquivo, a saída detalhada mostra que ele está preso aqui.

debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending env LC_ADDRESS = en_US.UTF-8
debug1: Sending env LC_IDENTIFICATION = en_US.UTF-8
debug1: Sending env LC_MEASUREMENT = en_US.UTF-8
debug1: Sending env LC_MONETARY = en_US.UTF-8
debug1: Sending env LC_NAME = en_US.UTF-8
debug1: Sending env LC_NUMERIC = en_US.UTF-8
debug1: Sending env LC_PAPER = en_US.UTF-8
debug1: Sending env LC_TELEPHONE = en_US.UTF-8
debug1: Sending env LC_TIME = en_US.UTF-8
debug1: Sending command: scp -v -f test_file

Inicialmente, achei que o comando echo estava fazendo com que ele não funcionasse, mas também não funciona sem ele.

    
por yamatau 24.04.2017 / 15:46

1 resposta

2

Para sair do arquivo bashrc quando a sessão do shell que está obtendo não é interativa, você pode fazer o seguinte na parte superior (ou em um local conveniente) do arquivo:

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

O valor em $- é uma sequência de letras indicando as opções de shell atualmente definidas. Se o caractere i estiver presente na sequência, o shell será interativo.

Isso pode ser necessário, pois, como apontado nos comentários, o Bash trata as sessões shell iniciadas por sshd , o daemon SSH, como um caso especial.

Detalhes: Por que o bashrc verifica se o shell atual é interativo?

Mais abaixo no arquivo, você pode verificar se o fish shell está disponível e começar assim:

if command -v fish 2>/dev/null; then
   exec fish
fi

Esteja ciente de que fish pode ser o jogo de "Go Fish" em alguns sistemas: -)

Sobre o uso de command -v : Por que não usar "qual"? O que usar então?

    
por 24.04.2017 / 16:34