คำสั่ง SSH ระยะไกล - คำเตือนการเชื่อมโยง bash: ไม่ได้เปิดใช้การแก้ไขสาย


17

ฉันใช้ทุบตี 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'

คำตอบ:


28
ssh host 'ls -als'

เมื่อคุณขอให้ ssh รันคำสั่งบนระบบรีโมต ssh จะไม่จัดสรร PTY (pseudo-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

1
จริงๆแล้วคำตอบนี้ไม่ถูกต้องโปรดดูคำตอบของ @ alexander-vorobiev ด้านล่าง
Ahmed Masud

2

การมีเซสชันแบบโต้ตอบนั้นไม่เพียงพอสำหรับbindการทำงาน ตัวอย่างเช่น emacs shell ให้เซสชันแบบโต้ตอบซึ่งผ่านการ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

นี่ควรเป็นคำตอบที่ถูกต้อง
Ahmed Masud

1
วิธีที่ง่ายกว่าคือการใช้[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
Ahmed Masud

1

วางคำสั่ง bind ลงในคำสั่ง 'if' ที่ตรวจสอบว่าเซสชัน bash อนุญาตให้แก้ไขบรรทัดได้หรือไม่:

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

1

หากไม่มีการแก้ไขบรรทัดbindคำสั่งเหล่านี้จะไม่เป็นอันตราย ระงับคำเตือน:

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

นี่ค่อนข้างไม่เหมาะสม แต่ก็ควรใช้งานได้ คำตอบอื่น ๆ ไม่เห็นด้วยเกี่ยวกับการทดสอบที่ดีที่สุด / เพียงพอ แนวทางของฉันหลีกเลี่ยงสิ่งนี้ มันไม่ได้ปรับขนาดได้ดี สองคำสั่งเพียงอย่างเดียวไม่ควรสร้างความแตกต่างใหญ่ แต่ถ้าคุณมีมากกว่านั้นหลายสิบเงื่อนไขที่เหมาะสมน่าจะดีกว่า


จุดดี. มี upvote :-)
Jonathan Hartley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.