Đặt $ PS1 khác nhau trên máy tính cục bộ và trong phiên ssh


9

Tôi giữ thư mục nhà của mình dưới sự kiểm soát phiên bản, để cấu hình cơ bản của tôi dễ dàng có sẵn trên bất kỳ máy tính nào.

Dấu nhắc lệnh bash của tôi trên máy tính cục bộ của tôi là một thứ phức tạp, nhiều màu sắc bao gồm kho git hiện tại và trạng thái của nó. Nhưng tôi muốn có một user@host ~ $dấu nhắc lệnh đơn giản khi tôi sshvào một máy từ xa.

Tôi muốn có thể cập nhật thông tin của mình .profileđể nó thiết lập một sự phức tạp $PS1khi chạy cục bộ và đơn giản hóa khi chạy trong một sshphiên.

Về cơ bản, tôi muốn một cái gì đó giống như một $AM_I_LOGGED_IN_VIA_SSHbiến để kiểm tra .profile. Điều đó có thể không?

Câu trả lời:


8

Khi bạn đăng nhập qua SSH, một số biến môi trường bổ sung sẽ được đặt. Bạn có thể sử dụng chúng làm thử nghiệm để đặt PS1 trong .profile của bạn.

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi

7

Nếu bạn kiểm tra môi trường của bạn ( env | grep SSH), bạn sẽ tìm thấy một số ứng cử viên như $SSH_CLIENT, $SSH_CONNECTION$SSH_TTY; danh sách chính xác sẽ phụ thuộc vào sshdphiên bản.


2

Nếu sshd của bạn không cung cấp các biến hữu ích, bạn có thể sử dụng

ps -p $PPID

hoặc một số thủ thuật ps ngẫu nhiên khác (nếu shell của bạn không được đặt $PPID) để xem liệu tiến trình cha của shell có phải là quá trình đăng nhập từ xa của bạn hay không. Sau đó, nếu cha-is-remote-thingie chuyển $ PS1. Và sau đó tải xuống OpenSSH và sử dụng các đề xuất của geekizard / Caleb vì máy chủ ssh của bạn là rác. ;)

Hoặc, bạn có thể sử dụng đầu ra của "tôi là ai", lấy trường cuối cùng (nghĩa là $( who am i | awk '$0=$NF')) và kiểm tra xem máy chủ lưu trữ là một điều khiển từ xa hay cục bộ để quyết định xem bạn đã đăng nhập cục bộ hay từ xa.

Hoặc bạn có thể bật đầu ra $(hostname)để có vỏ của bạn sử dụng $ PS1 thích hợp trên các máy chủ cụ thể.

Hoặc, hãy thực sự đi hạt. Nếu bạn đang sử dụng trình bao hiện đại - như bash, ksh93 hoặc zsh, bạn có thể tận dụng thực tế là $ PS1 được đánh giá lại khi thực hiện. Vì vậy, bạn có thể bao gồm một khối điều kiện nội tuyến để thực hiện các công cụ git điên nếu cwd của bạn nằm trong kho lưu trữ và một cái gì đó bên ngoài. Ví dụ, ở đây tôi đang thực hiện thay đổi nhanh chóng tùy thuộc vào thư mục tôi đang sử dụng [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" ), về cơ bản.

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

Chắc chắn, định nghĩa $ PS1 sẽ trông thật điên rồ trong hồ sơ của bạn, nhưng sau đó bạn chỉ nhận được những thứ git siêu sặc sỡ khi bạn thực sự ở trong kho git, trong khi bạn có màu sắc thông thường ở nơi khác. :) Lưu ý rằng bạn phải sử dụng các trích dẫn đơn xung quanh bài tập PS1. Bạn không muốn các biến được mở rộng khi PS1 được gán; bạn muốn chúng được mở rộng khi $ PS1 được đánh giá sau này. Vì vậy, dấu ngoặc đơn.


1

Nếu PermitUserEnvironmentđược bật trong sshd thì bạn có thể sử dụng ~/.ssh/environmentđể tạo $PS1và sau đó chỉ cần phát hiện sự hiện diện của một giá trị trong tập lệnh của bạn thường đặt nó.


0

Ngoài câu trả lời của Ignacio, để làm cho mọi thứ rõ ràng, PermitUSerEnvironmenttùy chọn phải được bật ở phía máy chủ để điều này hoạt động. Nếu máy chủ không kích hoạt tùy chọn này, bạn sẽ không có phiên ssh đầy màu sắc với máy chủ đó.

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.