Đẩy dấu nhắc PS1 của tôi qua ssh


19

Tôi sử dụng một dấu nhắc "PS1" cụ thể mà tôi thích. Tôi chia sẻ một vài thông tin đăng nhập với người khác trên một vài máy chủ khác nhau. Tôi đã tự hỏi nếu có một cách để xác định trong hồ sơ bash cục bộ của tôi một lời nhắc từ xa, hoặc bất kỳ cách nào khác sau đó sao chép và dán mỗi khi tôi từ xa vào.

Câu trả lời:


17

Tải lên một tệp trên mỗi máy từ xa, giả sử ~/.my_custom_bashrc, với bashcấu hình tùy chỉnh của bạn , (trong trường hợp này PS1=...), sau đó khởi chạy sshvới:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

Bạn có thể dễ dàng sử dụng một bashchức năng như trình bao bọc để dễ đọc.


10

Nếu bạn chỉ muốn gửi PS1biến và nó không chứa '(trích dẫn đơn), hãy thử:

ssh targethost -t "PS1='$PS1'; exec bash"

Các địa phương .bashrccũng có thể ghi đè lên PS1(cảm ơn Dennis Williamson vì đã chỉ ra điều này).

Có nhiều cách để truyền các biến môi trường qua ssh , nhưng chúng thường bị vô hiệu hóa trong cấu hình máy chủ. Nếu lệnh PermitUserEnvironmentđược bật trong cấu hình máy chủ và mỗi người dùng có cặp khóa riêng (vâng, bạn có thể không may mắn như vậy), bạn có thể thêm environment="PS1=…"vào dòng ~/.ssh/authorized_keystương ứng với khóa của mình.

Nếu bạn muốn giữ cấu hình của riêng mình trên tài khoản người dùng chung, bạn có thể tạo thư mục tệp cấu hình của riêng mình và đặt HOMEbiến môi trường để trỏ đến thư mục đó.

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

Tạo các liên kết tượng trưng trong mrstatic.homethư mục trỏ lại mục tương ứng trong thư mục mẹ khi bạn muốn chia sẻ tệp với người dùng khác.

Sau đó, đăng nhập bằng

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

Nếu bạn sẵn sàng sửa đổi điều khiển từ xa .profile(hoặc tệp khởi tạo khác), có thể bạn có thể tự động hóa cài đặt của mình. Nhiều trang web cho phép LC_*các biến môi trường thông qua (thông thường chúng được sử dụng cho cài đặt ngôn ngữ). Nếu cả hai điều kiện này đều được đáp ứng, bạn có thể đặt một biến không thực sự được sử dụng cho các miền, giả sử LC_USER, ở phía máy khách và kiểm tra nó trong máy chủ .profile.

(Tất nhiên tài khoản được chia sẻ là một ý tưởng tồi, nhưng tôi nhận ra bạn có thể không ở vị trí để thay đổi tình huống đó.)


3
ssh -t user@host "remote='$PS1' bash -i"

Sau đó, tại dấu nhắc:

PS1=$remote

1
Một dấu nhắc bash tinh vi có khả năng bị hỏng nếu nó không được trích dẫn (đến từ bạn, tôi ngạc nhiên). Và tại sao lệnh bổ sung, và không chỉ "PS1='$PS1' bash -i"(và tại sao không exec, quá)?
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles: Thiếu trích dẫn: sự cẩu thả. Lệnh bổ sung: sẽ không có gì bất thường PS1khi bị ghi đè trong quá trình khởi động shell. Không thực hiện: trong quá trình thử nghiệm trên hệ thống của tôi, nó dường như không tạo ra bất kỳ sự khác biệt nào - không có quá trình bổ sung.
Tạm dừng cho đến khi có thông báo mới.

1
Ồ, vâng, đó là một điểm tốt, địa phương .bashrccó khả năng ghi đè lên PS1.
Gilles 'SO- ngừng trở nên xấu xa'

2

Đặt lời nhắc PS1 của bạn vào ~ / .ssh / môi trường và phiên ssh sẽ mang nó đến mọi máy chủ bạn đăng nhập. Nó hoạt động với tôi với openssh 4.3p2.


1
Điều này chỉ hoạt động nếu cấu hình của máy chủ đã được bật PermitUserEnvironment, mặc định là tắt.
Flimm

1

bạn có thể chỉ định các biến môi trường ở phía máy khách và nếu máy chủ ssh cho phép nó (kiểm tra man sshd-config), các biến này sẽ được sao chép vào phiên khi bạn đăng nhập vào máy.

vì vậy, bạn sẽ phải định cấu hình .bashrc trên máy chủ để kiểm tra PS1 hiện có (hoặc bất kỳ biến nào) và chỉ đặt PS1 nếu nó chưa được đặt.

hoặc, làm cho mọi thứ đơn giản hơn, bạn gói các cài đặt của mình vào một hàm .. và triển khai chức năng đó dưới dạng một tệp đặc biệt mà nguồn của bạn theo yêu cầu ( source joes_bashrc) hoặc trực tiếp đến .bashrc. có tập tin của riêng bạn có vẻ mạnh mẽ hơn một chút. những người khác có thể sử dụng cài đặt của bạn nhưng không bị buộc phải làm như vậy.


1

Không chia sẻ thông tin đăng nhập. SSH là chính mình, sau đó làm sudo -su shareduser( -scó nghĩa là "vỏ").

Hãy sudogiữ cho thư mục chính của bạn:

Defaults env_keep += "HOME"

Khi tôi được thăng chức, tôi sẽ thử và ban hành chính sách đó nhưng hiện tại tôi đang bị mắc kẹt với điều này.
Unundednut

1

Nếu bạn muốn làm điều đó mà không cần thêm một scp, bạn có thể làm một cái gì đó như thế này:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

Điều đó sẽ tạo ra một .bashrc.n dựa trên bashrc của máy chủ nhưng với phần ghi đè của bạn.


Đây là lý do tại sao một số người sợ thiết bị đầu cuối.

0

Nếu bạn sẵn sàng xâm nhập không đáng kể trên các đồng nghiệp của bạn, và bạn có thể tin tưởng họ không can thiệp vào sở thích của bạn, sau đó tôi đề nghị một sự kết hợp của câu trả lời Cyrus , câu trả lời của akiracâu trả lời Dennis Williamson .

  1. Trên mỗi máy chủ, chỉnh sửa ~/.bashrcvà thêm
    if ["$ Unl" = 1] # Mã đặc biệt cho Unundednut
    sau đó
        PS1 = " (lời nhắc mong muốn của bạn) "
         (bất kỳ tùy chỉnh nào bạn muốn) 
    fi
    cuối cùng. Mặc dù các đồng nghiệp của bạn không đánh giá cao [bạn] viết trên hồ sơ cơ sở, nhưng họ sẽ không nhận ra điều này trừ khi họ đi tìm nó.
  2. Khi bạn đăng nhập vào một máy chủ từ xa, hãy làm
    ssh -t user @ host "Unl = 1 bash -i"
    Mặc dù bạn có thể muốn đưa nó vào một bí danh hoặc hàm shell trong tài khoản cục bộ của mình, nhưng nó đủ ngắn - ngắn hơn bất kỳ câu trả lời nào khác - mà bạn có thể dễ dàng nhập bằng tay.

Tôi tin rằng điều này khá rõ ràng, nhưng: sshlệnh khiến Unfbiến được đặt trên máy chủ từ xa khi bạn đăng nhập vào nó. Điều đó sẽ gọi mã của bạn trong điều khiển từ xa .bashrc, điều này sẽ khiến (các) tùy chỉnh của bạn có hiệu lực. Vì bạn đặt mã của mình ở cuối .bashrc, nó sẽ ghi đè cài đặt chung trước đó trong tệp.

Tiết lộ: Tôi chưa thử nghiệm điều này.


-1

Cách dễ nhất là IMHO:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'

Tôi không chắc là nó hoạt động; nó dường như đang thiếu một lớp trích dẫn Ngay cả khi nó đã được thực hiện, việc thiết lập PROMPT_COMMAND(thực thi mỗi khi shell phát ra dấu nhắc) dường như là một cách rất nặng nề để giải quyết vấn đề này. Và, vì nó hơi phức tạp, bất kỳ câu trả lời nào cho thấy nó thực sự cần có một lời giải thích về cách thức hoạt động của nó.
Scott

-2

Bạn có thể làm những việc như gắn nhà của bạn qua sshfs / nfs, nhưng giải pháp đơn giản nhất là quét bashrc của bạn qua máy mới. Điều này cũng mang lại bí danh và công cụ.


Như tôi đã nói trong câu hỏi của mình, tôi chia sẻ những thông tin đăng nhập này với người khác. Tôi khá chắc chắn rằng họ sẽ không đánh giá cao tôi viết trên hồ sơ cơ sở.
Unundednut

1
Gắn $ HOME qua NFS là điên rồ. Chỉ cần nói.
Wesley Rice
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.