Các lệnh SSH từ xa - cảnh báo liên kết bash: không bật chỉnh sửa dòng


17

Tôi đang sử dụng bash 4.3.11 (1) và đã cài đặt plugin lịch sử sau (thông qua .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'

Khi tôi đăng nhập vào một phiên tương tác thì tất cả đều ổn nhưng khi tôi chạy các lệnh từ xa qua ssh host 'ls -als', tôi thấy đầu ra sau:

: 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

Khi tôi sửa đổi plugin lịch sử với echo -e '\0033\0143'sau mỗi cuộc gọi liên kết, tôi không còn nhận được cảnh báo nhưng bảng điều khiển của tôi bị xóa. Không phải là một nhược điểm lớn nhưng sẽ rất tuyệt nếu biết một cách sạch hơn để triệt tiêu điều này cho các lệnh từ xa.

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

Câu trả lời:


28
ssh host 'ls -als'

Khi bạn yêu cầu ssh chạy một lệnh trên hệ thống từ xa, ssh thường không phân bổ PTY (giả-TTY) cho phiên từ xa. Bạn có thể chạy ssh với -tđể buộc nó phân bổ một tty:

ssh -t host 'ls -als'

Nếu bạn không muốn gõ liên tục, bạn có thể thêm dòng này vào tệp ".ssh / config" trên máy chủ cục bộ của mình:

RequestTTY yes

Thay phiên, bạn có thể sửa tệp ".bashrc" trên hệ thống từ xa của mình để tránh các lệnh chạy giả định phiên là tương tác khi không. Một cách là gửi các lệnh trong bài kiểm tra rằng phiên có TTY:

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

1
Trên thực tế câu trả lời này là không chính xác, xem câu trả lời của @ alexander-vorobiev dưới đây.
Ahmed Masud

2

Có một phiên tương tác là không đủ bindđể làm việc. Ví dụ, vỏ emacs cung cấp một phiên tương tác vượt qua if [ -t 1 ]bài kiểm tra nhưng nó không có chỉnh sửa dòng để bất kỳ binds nào trong bạn ~/.bashrcsẽ tạo ra các cảnh báo. Thay vào đó, bạn có thể kiểm tra xem liệu chỉnh sửa dòng có được bật hay không bằng cách thực hiện một cái gì đó như thế này (có cách nào đơn giản hơn / tốt hơn không?):

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

Đây phải là câu trả lời đúng
Ahmed Masud

1
Cách dễ dàng hơn là sử dụng[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
Ahmed Masud

1

Đặt các lệnh liên kết vào câu lệnh 'if' để kiểm tra xem phiên bash có cho phép chỉnh sửa dòng hay không:

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

1

Nếu không có chỉnh sửa dòng, bindbản thân các lệnh này là vô hại. Ức chế các cảnh báo:

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

Điều này là hơi không phù hợp, vẫn nên làm việc. Các câu trả lời khác không đồng ý về bài kiểm tra tốt nhất / đầy đủ. Cách tiếp cận của tôi phá vỡ điều này. Nó không có quy mô tốt mặc dù. Chỉ riêng hai lệnh sẽ không tạo ra sự khác biệt lớn; nhưng nếu bạn có nhiều hơn, như hàng tá, thì một điều kiện thích hợp có lẽ sẽ tốt hơn.


Điểm tốt. Có một upvote. :-)
Jonathan Hartley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.