Uzak SSH Komutları - bash bind uyarısı: satır düzenleme etkin değil


17

Bash 4.3.11 (1) kullanıyorum ve aşağıdaki geçmiş eklentisini ( .bash_it aracılığıyla) yükledim :

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

Etkileşimli bir oturumda oturum açtığımda her şey yolunda ama ssh host 'ls -als'örneğin uzaktan komutları çalıştırdığımda aşağıdaki çıktıyı görüyorum:

: 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

Her eklenti echo -e '\0033\0143'çağrısından sonra geçmiş eklentisini değiştirdiğimde artık uyarı almıyorum ancak konsolum temizlendi. Büyük bir dezavantaj değil, ancak uzaktan komutlar için bunu bastırmanın daha temiz bir yolunu bilmek güzel olurdu.

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

Yanıtlar:


28
ssh host 'ls -als'

Ssh'den uzak sistemde bir komut çalıştırmasını istediğinizde, ssh normalde uzak oturum için bir PTY (sözde TTY) ayırmaz. -tBir tty ayırmaya zorlamak için ssh ile çalıştırabilirsiniz :

ssh -t host 'ls -als'

Bunu her zaman yazmak istemiyorsanız, bu satırı yerel ana makinenizdeki ".ssh / config" dosyasına ekleyebilirsiniz:

RequestTTY yes

Alternatif olarak, oturumun etkileşimli olmadığında etkileşimli olduğunu varsayan komutları çalıştırmaktan kaçınmak için uzak sisteminizdeki ".bashrc" dosyasını düzeltebilirsiniz. Bunun bir yolu, oturumun bir TTY'ye sahip olduğu bir sınama komutları dahil etmektir:

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

1
Aslında bu cevap yanlış, aşağıdaki @ alexander-vorobiev'in cevabına bakınız.
Ahmed Masud

2

Etkileşimli bir oturuma sahip olmak bindçalışmak için yeterli değildir . Örneğin emacs kabuk için geçer interaktif bir oturum sağlar if [ -t 1 ]testi ama o kadar herhangi düzenleme hattı yoksa bindsenin de s ~/.bashrcuyarıları üretecektir. Bunun yerine, böyle bir şey yaparak satır düzenlemenin etkin olup olmadığını kontrol edebilirsiniz (daha basit / daha iyi bir yol var mı?):

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

Bu doğru cevap olmalı
Ahmed Masud

1
[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
Ahmed Masud

1

Bind komutlarını bash oturumunun satır düzenlemeye izin verip vermediğini kontrol eden bir 'if' ifadesine yerleştirin:

if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
    bind '"^[[A":history-search-backward'
    bind '"^[[B":history-search-forward'
fi

1

Satır düzenlemesi yoksa, bu bindkomutların kendileri zararsızdır. Uyarıları bastırın:

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

Bu biraz yetersiz, yine de işe yaramalı. Diğer cevaplar en iyi / yeterli testi kabul etmez. Benim yaklaşımım bunu atlatıyor. Gerçi iyi ölçeklenmiyor. İki komut tek başına büyük bir fark yaratmamalıdır; ancak düzinelerce gibi daha fazlasına sahip olsaydınız, uygun bir koşul muhtemelen daha iyi olurdu.


İyi bir nokta. Bir oy verin. :-)
Jonathan Hartley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.