
Situação:Precisa fazer login em vários servidores remotos, alguns deles com casca de peixe
Requerimento:O shell padrão é bash. Se eu fizer login em um servidor e o peixe estiver presente, mude para o shell do peixe, caso contrário, permaneça 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 pensei que o echo
comando estava fazendo com que ele não funcionasse, mas também não funciona sem ele.
Responder1
Para sair do bashrc
arquivo quando a sessão shell que o origina 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 in $-
é uma sequência de letras que indica as opções de shell atualmente definidas. Se o i
caractere estiver presente na string, o shell será interativo.
Isso pode ser necessário, pois, como Terdon apontou nos comentários, o Bash trata as sessões de shell iniciadas pelo sshd
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 iniciar:
if command -v fish 2>/dev/null; then
exec fish
fi
Esteja ciente de que fish
pode ser o jogo "Go Fish" em alguns sistemas :-)
Sobre o uso de command -v
:Por que não usar "qual"? O que usar então?