Problemas con scp si uso bashrc para abrir peces si están presentes

Problemas con scp si uso bashrc para abrir peces si están presentes

Situación:Es necesario iniciar sesión en varios servidores remotos y algunos de ellos tienen conchas de pescado.

Requisito:El shell predeterminado es bash. Si inicio sesión en un servidor y hay pescado, cambie a Fish Shell; de lo contrario, permanezca en bash.

Probé .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

Sin embargo, scp no parece funcionar. Cuando intento escanear un archivo, la salida detallada muestra que está atascado aquí.

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 pensé que el echocomando hacía que no funcionara, pero tampoco funciona sin él.

Respuesta1

Para salir del bashrcarchivo cuando la sesión de shell que lo genera no es interactiva, puede hacer lo siguiente en la parte superior (o en una ubicación conveniente) del archivo:

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

El valor en $-es una cadena de letras que denota las opciones de shell actualmente configuradas. Si el icarácter está presente en la cadena, entonces el shell es interactivo.

Esto puede ser necesario ya que, como terdon señaló en los comentarios, Bash trata las sesiones de shell iniciadas por sshd, el demonio SSH, como un caso especial.

Detalles:¿Por qué bashrc comprueba si el shell actual es interactivo?

Más abajo en el archivo, puede verificar si el fishshell está disponible e iniciarlo:

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

Tenga en cuenta que fishpuede ser el juego "Go Fish" en algunos sistemas :-)

Sobre el uso de command -v:¿Por qué no utilizar "cuál"? ¿Qué usar entonces?

información relacionada