Bash nhắc đổi màu khi tôi đăng nhập vào máy chủ


15

Có cách nào để làm cho bash prompt động, để nó thay đổi màu sắc khi đăng nhập vào máy chủ không?

Vì vậy, tôi muốn màu giống như màu xanh lá cây khi trên hệ thống của tôi và chuyển sang màu đỏ khi được kết nối với máy chủ. Tôi có một số lượng lớn máy chủ mà tôi không muốn đặt khác nhau .bashrctrên tất cả các máy chủ.


Chắc là không. Nhưng quay lại với nó superuser.com/questions/33712/ từ
ngẫu nhiên

1
Tại sao không làm cho thiết bị đầu cuối của bạn màu đỏ (hoặc một số màu khác) để khi bạn kết nối với chúng, bạn sẽ có một màu trắng mặc định?
Phục hồi Monica - ζ--

Câu trả lời:


9

Dấu nhắc từ xa được đặt bởi điều khiển từ xa ~/.bashrc. Vì vậy, bạn vẫn cần phải sao chép nó vào máy chủ từ xa. Tuy nhiên, bạn có thể sử dụng một đơn ~/.bashrccho tất cả các máy chủ và đặt màu nhắc nhở dựa trên tên máy chủ:

[ "$PS1" ] || return 0                           # continue only when interactive
case $(hostname -s) in
laptop*)
    prompt_color='\033[48;5;16m\033[38;5;46m'    # green(46) on black(16)
    ;;
server*)
    prompt_color='\033[48;5;16m\033[38;5;196m'   # red(196) on black(16)
    ;;
esac
ORIG_PS1=$PS1                                    # in case needed
PS1='<\['${prompt_color}'\]\h\[\033[m\]:\w>\$ '
unset prompt_color

Ghi chú:

  • Không đặt PS1nếu nó chưa được đặt (nghĩa là, nếu vỏ không tương tác). Kiểm tra nếu PS1không trống là một cách rất phổ biến để quyết định xem shell có tương tác hay không và bạn không muốn nhầm lẫn các chương trình làm điều đó. (Có thể kiểm tra chính xác hơn là kiểm tra nếu $-i.)

  • Nếu bạn muốn mã này chạy khi đăng nhập vào máy chủ từ xa, bạn nên có một trong các tệp hồ sơ luôn luôn là nguồn ~/.bashrc. Nhưng tôi giả sử bạn biết điều đó.

  • Trong PS1, các mã thoát phải được đính kèm \[...\].

  • \[033[mĐặt lại tiền cảnh và nền để mặc định. Vì vậy, ở đây, :\wxuất hiện trong thiết bị đầu cuối / nền.

  • \[033[48;5;XXXm\033[38;5;YYYmđặt nền / tiền cảnh thành XXX/ YYY.

  • Đối với một kịch bản kết xuất các màu có sẵn, hãy thử colortest.

  • Để kiểm tra lời nhắc sẽ như thế nào:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "

7

Nếu bạn không muốn (không thể) làm cho các điều khiển từ xa có một điều riêng biệt PS1, thì tôi sẽ nói "không", điều đó ít nhất sẽ vô cùng khó khăn. Hãy xem xét rằng trên kết nối SSH, phía cục bộ không có ý tưởng thực sự về dấu nhắc shell là gì và cái gì khác, và vì vậy, việc đặt màu cho dấu nhắc thực sự phải đến từ xa. Bạn có thể đặt màu trước khi bắt đầu phiên, nhưng chúng có hiệu quả đối với tất cả đầu ra, đó là cho đến khi một lshoặc một trình soạn thảo thiết lập màu của chính nó.

Tất nhiên bạn có thể đưa ra một số trình bao bọc cho phiên để phát hiện mọi thứ trông giống như một dấu nhắc và tô màu nó, nhưng nó sẽ dễ dẫn đến dương tính giả (màu trên mỗi dòng với một $?) Và cực kỳ phức tạp so với việc bỏ một dòng duy nhất cho bạn .profilehoặc .bashrctrên mỗi máy.

Với một số máy, có thể hữu ích trong mọi trường hợp để tìm kiếm giải pháp để đồng bộ hóa các thay đổi cấu hình trên tất cả các máy. Có thể là một số công cụ được tạo cho nó, hoặc chỉ là một tập lệnh, hoặc chỉ chạy một vòng lặp để sao chép (các) tập tin cấu hình (s) trên tất cả chúng.


2
Đoạn cuối đó là chìa khóa. Nếu OP đang quản lý "một số lượng lớn máy chủ" thì thật đáng ngạc nhiên khi mỗi máy chủ phải được cấu hình riêng lẻ ngay từ đầu.
Cuộc đua nhẹ nhàng với Monica

5

Tôi đang sử dụng tập lệnh bao bọc với sshpass trước tiên sẽ tải lên một hồ sơ tạm thời và sau đó ssh sử dụng hồ sơ này (và xóa tệp tạm thời).

Hai điều chính của kịch bản là:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Sử dụng điều này bạn có thể dễ dàng xác định màu sắc của các phiên từ xa.

Tôi biết điều này không trực tiếp trả lời câu hỏi của bạn, nhưng nó có thể được sử dụng để giải quyết nó.


3
Đừng sử dụng sshpass -pnếu có thể! Đối số dòng lệnh cho các chương trình đang chạy thường được hiển thị cho tất cả người dùng psvà do đó sẽ là mật khẩu. Ngay cả khi bạn không có tài khoản người dùng nào khác trên máy, bạn vẫn có thể vô tình in nó trên màn hình. sshpasscó thể đọc mật khẩu từ một biến môi trường, không quá khó sử dụng. Ngoài ra, hãy xem xét các khóa ssh nếu bạn sẽ lưu thông tin đăng nhập vào một tệp nào.
ilkkachu

Bạn đã đúng và tôi đã không cố gắng thúc đẩy việc sử dụng nó. Tôi chỉ dán như một ví dụ từ kịch bản của mình, nó chỉ được sử dụng cho mục đích phát triển và không có rủi ro bảo mật. Biến SSHPASS sẽ được để trống cho các hệ thống sản xuất có sử dụng khóa ssh. Tôi sẽ cập nhật.
Mikael Kjær

1

Bạn có thể quan tâm context-color, mà tôi đã kết hợp với mục đích chính xác đó: https://github.com/ramnes/context-color

Đó là một tập lệnh đơn giản, khi được thực thi, sẽ tạo ra màu dựa trên hàm băm của đầu ra lệnh. Với nó được cài đặt ở đâu đó trong bạn $PATH, bạn có thể làm một cái gì đó như thế này trong .bashrc:

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(nơi --prompt/-pchuyển đổi để màu được thoát ra cho lời nhắc và\[\e[0m\] trình tự thoát để đặt lại màu)

Theo mặc định, lệnh được sử dụng để tạo ra hàm băm là whoami; hostname. Nếu bạn chỉ muốn màu thay đổi theo tên máy chủ, bạn có thể thay đổi $CONTEXTmôi trường biến ( export CONTEXT="hostname") hoặc chỉ cần sử dụng --context/-ctùy chọn ( context-color -c "hostname").

Xem ví dụ bên dưới:

bản giới thiệu

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.