Удаленные команды SSH — предупреждение bash bind: редактирование строк не включено

Удаленные команды SSH — предупреждение bash bind: редактирование строк не включено

Я использую bash 4.3.11(1) и у меня установлен следующий плагин истории (через.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'

Когда я вхожу в интерактивный сеанс, все хорошо, но когда я запускаю удаленные команды, ssh host 'ls -als'например, через , я вижу следующий вывод:

: 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

Когда я изменяю плагин истории echo -e '\0033\0143'после каждого вызова привязки, я больше не получаю предупреждений, но моя консоль очищается. Не большой недостаток, но было бы неплохо узнать более чистый способ подавить это для удаленных команд.

# 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'

решение1

Наличие интерактивного сеанса недостаточно для bindработы. Например, оболочка emacs предоставляет интерактивный сеанс, который проходит if [ -t 1 ]тест, но в нем нет редактирования строк, поэтому любые binds в вашем ~/.bashrcбудут генерировать предупреждения. Вместо этого вы можете проверить, включено ли редактирование строк, сделав что-то вроде этого (есть ли более простой/лучший способ?):

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

решение2

ssh host 'ls -als'

Когда вы просите ssh выполнить команду на удаленной системе, ssh обычно не выделяет PTY (псевдо-TTY) для удаленного сеанса. Вы можете запустить ssh с помощью, чтобы -tзаставить его выделить tty:

ssh -t host 'ls -als'

Если вы не хотите вводить это каждый раз, вы можете добавить эту строку в файл «.ssh/config» на локальном хосте:

RequestTTY yes

В качестве альтернативы вы можете исправить файл ".bashrc" на удаленной системе, чтобы избежать запуска команд, которые предполагают, что сеанс интерактивный, когда это не так. Один из способов — заключить команды в тест, что сеанс имеет TTY:

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

решение3

Если нет редактирования строки, то эти bindкоманды сами по себе безвредны. Подавите предупреждения:

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

Это несколько неэлегантно, но все же должно работать. Другие ответы не сходятся во мнении о лучшем/достаточном тесте. Мой подход обходит это. Однако он плохо масштабируется. Две команды сами по себе не должны иметь большого значения; но если бы у вас было больше, например, десятки, то надлежащее условие, вероятно, было бы лучше.

решение4

Я бы, наверное, просто проверил, является ли мой bash интерактивным.

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

Связанный контент