Comandos SSH remotos - aviso de ligação bash: edição de linha não ativada

14

Estou usando o bash 4.3.11 (1) e tenho o seguinte plug-in de histórico instalado (via .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'

Quando efetuo login em uma sessão interativa, tudo está bem, mas quando executo comandos remotos via ssh host 'ls -als' , por exemplo, vejo a seguinte saída:

: 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

Quando modifico o plug-in de histórico com echo -e '%code%3343' após cada ligação, não recebo mais os avisos, mas meu console é limpo. Não é uma grande desvantagem, mas seria bom saber uma maneira mais limpa de suprimir isso para 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 '
# 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'
3343' bind '"^[[B":history-search-forward' echo -e '
: 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
3343'
    
por Brian 22.03.2015 / 21:43

2 respostas

26
ssh host 'ls -als'

Quando você pede ao ssh para executar um comando no sistema remoto, o ssh normalmente não aloca um PTY (pseudo-TTY) para a sessão remota. Você pode executar ssh com -t para forçá-lo a alocar um tty:

ssh -t host 'ls -als'

Se você não quiser digitar o tempo todo, você pode adicionar essa linha ao arquivo ".ssh / config" no seu host local:

RequestTTY yes

Como alternativa, você poderia corrigir o arquivo ".bashrc" em seu sistema remoto para evitar a execução de comandos que presumem que a sessão é interativa quando não é. Uma maneira é incluir os comandos em um teste em que a sessão possui um TTY:

if [ -t 1 ]
then
    # standard output is a tty
    # do interactive initialization
fi
    
por 22.03.2015 / 22:59
0

Ter uma sessão interativa não é suficiente para que bind funcione. Por exemplo, o shell do emacs fornece uma sessão interativa que passa no teste if [ -t 1 ] , mas não tem a linha editada, portanto, qualquer bind s no ~/.bashrc gerará os avisos. Em vez disso, você pode verificar se a edição de linha está ativada fazendo algo assim (existe uma maneira mais simples / melhor?):

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

Tags