Comandos SSH remotos: advertencia de vinculación de bash: edición de línea no habilitada

Comandos SSH remotos: advertencia de vinculación de bash: edición de línea no habilitada

Estoy usando bash 4.3.11(1) y tengo instalado el siguiente complemento de historial (a través de.bash_it):

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'

Cuando inicio sesión en una sesión interactiva, todo está bien, pero cuando ejecuto comandos remotos, ssh host 'ls -als'por ejemplo, veo el siguiente resultado:

: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled

Cuando modifico el complemento de historial echo -e '\0033\0143'después de cada llamada de enlace, ya no recibo las advertencias, pero mi consola se borra. No es un gran inconveniente, pero sería bueno conocer una forma más limpia de suprimir esto para los comandos remotos.

# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
echo -e '\0033\0143'
bind '"^[[B":history-search-forward'
echo -e '\0033\0143'

Respuesta1

Tener una sesión interactiva no es suficiente para bindque funcione. Por ejemplo, emacs shell proporciona una sesión interactiva que pasa la if [ -t 1 ]prueba pero no tiene la línea de edición, por lo que cualquier bindcorreo electrónico en su ~/.bashrcgenerará las advertencias. En su lugar, puede verificar si la edición de líneas está habilitada haciendo algo como esto (¿existe una manera mejor o más simple?):

if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
  echo "line editing is on"
fi

Respuesta2

ssh host 'ls -als'

Cuando le pide a ssh que ejecute un comando en el sistema remoto, ssh normalmente no asigna un PTY (pseudo-TTY) para la sesión remota. Puedes ejecutar ssh para -tforzarlo a asignar un tty:

ssh -t host 'ls -als'

Si no desea escribir eso todo el tiempo, puede agregar esta línea al archivo ".ssh/config" en su host local:

RequestTTY yes

Alternativamente, puede arreglar el archivo ".bashrc" en su sistema remoto para evitar ejecutar comandos que suponen que la sesión es interactiva cuando no lo es. Una forma es incluir los comandos en una prueba de que la sesión tiene un TTY:

if [ -t 1 ]
then
    # standard output is a tty
    # do interactive initialization
fi

Respuesta3

Si no hay edición de línea, estos bindcomandos en sí son inofensivos. Suprimir las advertencias:

bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward'  2>/dev/null

Esto es algo poco elegante, aún así debería funcionar. Otras respuestas no están de acuerdo sobre cuál es la prueba mejor/suficiente. Mi enfoque evita esto. Aunque no escala bien. Los dos comandos por sí solos no deberían marcar una gran diferencia; pero si tuvieras más, como docenas, entonces probablemente sería mejor un condicional adecuado.

Respuesta4

Probablemente simplemente probaría si mi bash es interactivo.

if [[ "$-" = *i* ]]
then
    debug "interactive mode"
    source ~/.bash_lib/bindings
else
    debug "non interactive mode"
fi

información relacionada