Remote-SSH-Befehle - Bash-Bind-Warnung: Zeilenbearbeitung nicht aktiviert

Remote-SSH-Befehle - Bash-Bind-Warnung: Zeilenbearbeitung nicht aktiviert

Ich verwende Bash 4.3.11(1) und habe das folgende History-Plugin installiert (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'

Wenn ich mich bei einer interaktiven Sitzung anmelde, ist alles in Ordnung, aber wenn ich beispielsweise Remotebefehle ausführe ssh host 'ls -als', sehe ich die folgende Ausgabe:

: 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

Wenn ich das Verlaufs-Plugin echo -e '\0033\0143'nach jedem Bind-Aufruf ändere, erhalte ich keine Warnungen mehr, aber meine Konsole wird gelöscht. Das ist kein großer Nachteil, aber es wäre schön, eine sauberere Möglichkeit zu kennen, dies für Remote-Befehle zu unterdrücken.

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

Antwort1

Eine interaktive Sitzung reicht nicht aus, damit bindes funktioniert. Beispielsweise bietet die Emacs-Shell eine interaktive Sitzung, die den if [ -t 1 ]Test besteht, aber keine Zeilenbearbeitung unterstützt, sodass jedes binds in Ihrer ~/.bashrcSitzung Warnungen erzeugt. Stattdessen können Sie prüfen, ob die Zeilenbearbeitung aktiviert ist, indem Sie Folgendes tun (gibt es einen einfacheren/besseren Weg?):

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

Antwort2

ssh host 'ls -als'

Wenn Sie ssh auffordern, einen Befehl auf dem Remote-System auszuführen, weist ssh der Remote-Sitzung normalerweise kein PTY (Pseudo-TTY) zu. Sie können ssh mit ausführen, -tum es zur Zuweisung eines TTY zu zwingen:

ssh -t host 'ls -als'

Wenn Sie das nicht jedes Mal eingeben möchten, können Sie diese Zeile zur Datei „.ssh/config“ auf Ihrem lokalen Host hinzufügen:

RequestTTY yes

Alternativ können Sie die Datei „.bashrc“ auf Ihrem Remote-System reparieren, um die Ausführung von Befehlen zu vermeiden, die davon ausgehen, dass die Sitzung interaktiv ist, obwohl dies nicht der Fall ist. Eine Möglichkeit besteht darin, die Befehle in einen Test einzuschließen, dass die Sitzung über ein TTY verfügt:

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

Antwort3

Wenn keine Zeilenbearbeitung erfolgt, bindsind diese Befehle selbst harmlos. Unterdrücken Sie die Warnungen:

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

Das ist etwas unelegant, sollte aber trotzdem funktionieren. Andere Antworten stimmen nicht überein, was der beste/ausreichende Test ist. Mein Ansatz umgeht dies. Es ist jedoch nicht gut skalierbar. Die beiden Befehle allein sollten keinen großen Unterschied machen; aber wenn Sie mehr hätten, etwa Dutzende, wäre eine richtige Bedingung wahrscheinlich besser.

Antwort4

Ich würde wahrscheinlich einfach testen, ob meine Bash interaktiv ist.

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

verwandte Informationen