Przesuwając mój monit PS1 przez ssh

19

Używam konkretnego monitu „PS1”, który mi się podoba. Udostępniam kilka loginów innym osobom na kilku różnych serwerach. Zastanawiałem się, czy istnieje sposób na określenie w moim lokalnym profilu bash zdalnego monitu, czy w jakikolwiek inny sposób niż kopiowanie i wklejanie za każdym razem, gdy się zdalnie włączam.

Unfundednut
źródło

Odpowiedzi:

17

Prześlij plik na każdy komputer zdalny, powiedzmy ~/.my_custom_bashrc, z niestandardową bashkonfiguracją (w tym przypadku PS1=...), a następnie uruchom za sshpomocą:

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

Możesz łatwo użyć bashfunkcji jako opakowania dla czytelności.

Cyrus
źródło
10

Jeśli chcesz tylko wysłać PS1zmienną, która nie zawiera '(pojedynczego cudzysłowu), spróbuj:

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

Lokalny .bashrcmoże PS1jednak nadpisać (dzięki Dennis Williamson za zwrócenie na to uwagi).

Istnieją sposoby przesyłania zmiennych środowiskowych przez ssh , ale zwykle są one wyłączone w konfiguracji serwera. Jeśli PermitUserEnvironmentdyrektywa jest włączona w konfiguracji serwera, a każdy użytkownik ma własną parę kluczy (tak, możesz nie mieć tyle szczęścia), możesz dodać environment="PS1=…"do linii ~/.ssh/authorized_keysodpowiadającą kluczowi.

Jeśli chcesz zachować własną konfigurację na wspólnym koncie użytkownika, możesz utworzyć własny katalog plików konfiguracyjnych i ustawić HOMEzmienną środowiskową tak, aby wskazywała ten katalog.

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

Utwórz dowiązania symboliczne w mrstatic.homekatalogu wskazujące odpowiedni wpis w katalogu nadrzędnym, gdy chcesz udostępnić plik innym użytkownikom.

Następnie zaloguj się za pomocą

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

Jeśli chcesz zmodyfikować zdalny .profile(lub inny plik inicjujący), prawdopodobnie możesz zautomatyzować swoje ustawienia. Wiele witryn zezwala na LC_*zmienne środowiskowe (zwykle są używane do ustawień regionalnych). Jeśli oba te warunki są spełnione, możesz ustawić zmienną, która nie jest używana w lokalizacjach, powiedzmy LC_USER, po stronie klienta i przetestować ją na serwerze .profile.

(Oczywiście wspólne konta to zły pomysł, ale zdaję sobie sprawę, że możesz nie być w stanie zmienić tej sytuacji).

Gilles „SO- przestań być zły”
źródło
3
ssh -t user@host "remote='$PS1' bash -i"

Następnie w odpowiedzi na monit:

PS1=$remote
Wstrzymano do odwołania.
źródło
1
Wyrafinowane podpowiedź bashowa może się złamać, jeśli nie zostanie zacytowana (jestem zaskoczony, że pochodzi od ciebie). A dlaczego dodatkowe polecenie, a nie tylko "PS1='$PS1' bash -i"(i dlaczego nie execteż)?
Gilles „SO- przestań być zły”
1
@Gilles: Brak cytatu: niechlujstwo. Dodatkowe polecenie: PS1zastąpienie go podczas uruchamiania powłoki nie byłoby niczym niezwykłym . Bez exec: podczas testowania na moim systemie nie miało to żadnego znaczenia - bez dodatkowego procesu.
Wstrzymano do odwołania.
1
Och, tak, to dobra uwaga, lokalny .bashrcprawdopodobnie nadpisze PS1.
Gilles „SO - przestań być zły”,
2

Umieść swój monit PS1 w ~ / .ssh / environment, a sesja ssh przeniesie go do każdego zalogowanego hosta. Działa dla mnie z openssh 4.3p2.

Valmik
źródło
1
Działa to tylko wtedy, gdy konfiguracja serwera jest włączona PermitUserEnvironment, która jest domyślnie wyłączona.
Flimm,
1

możesz określić zmienne środowiskowe po stronie klienta, a jeśli serwer ssh na to pozwala (sprawdź man sshd-config), zmienne te są kopiowane do sesji po zalogowaniu się do komputera.

więc musisz skonfigurować .bashrc na serwerze, aby sprawdzić istniejącą PS1 (lub dowolną zmienną) i ustawić PS1 tylko wtedy, gdy nie jest jeszcze ustawione.

lub, co upraszcza, łączenie ustawień w funkcję .. i wdrażanie tej funkcji jako specjalny plik źródłowy na żądanie ( source joes_bashrc) lub bezpośrednio w .bashrc. posiadanie własnego pliku wydaje się nieco bardziej niezawodne. inni ludzie mogą korzystać z twoich ustawień, ale nie są do tego zmuszeni.

akira
źródło
1

Nie udostępniaj loginów. SSH jak ty, a następnie zrób sudo -su shareduser( -soznacza „shell”).

Stwórz sudoswój katalog domowy:

Defaults env_keep += "HOME"
użytkownik1686
źródło
Kiedy dostanę awans, spróbuję wprowadzić tę politykę, ale na razie utknąłem w tym.
Unfundednut,
1

Jeśli chcesz to zrobić bez potrzeby dodatkowego scp, możesz zrobić coś takiego:

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'

To wygeneruje plik .bashrc.n oparty na serwerach bashrc, ale z twoimi zastąpieniami.

neuron
źródło
Dlatego niektórzy ludzie boją się terminali.
0

Jeśli jesteś skłonny wtrącać niepostrzeżenie na swoich kolegów, i można im zaufać, aby nie kolidować z własnymi preferencjami, to proponuję kombinację odpowiedzi Cyrusa , odpowiedź Akiry i odpowiedzi Dennisa Williamsona .

  1. Na każdym serwerze edytuj ~/.bashrci dodaj
    if ["$ Unf" = 1] # Kod specjalny dla Unfundednut
    następnie
        PS1 = „ (żądany monit)(dowolne inne dostosowania, które chcesz) 
    fi
    na końcu. Podczas gdy twoi koledzy „nie doceniliby [pisania] profilu podstawowego”, nie będą tego świadomi, chyba że zaczną go szukać.
  2. Po zalogowaniu się na zdalnym serwerze zrób to
    ssh -t użytkownik @ host "Unf = 1 bash -i"
    Chociaż prawdopodobnie będziesz chciał umieścić to w funkcji aliasu lub funkcji powłoki na swoim koncie lokalnym, jest ono wystarczająco krótkie - krótsze niż jakakolwiek inna odpowiedź - że możesz łatwo po prostu wpisać ręcznie.

Uważam, że jest to dość jasne, ale: sshpolecenie powoduje ustawienie Unfzmiennej na zdalnym serwerze po zalogowaniu się do niego. Spowoduje to wywołanie Twojego kodu na pilocie .bashrc, co spowoduje wprowadzenie Twoich dostosowań. Ponieważ umieścisz kod na końcu .bashrc, zastąpi on ogólne ustawienia wcześniej w pliku.

Ujawnienie: Nie testowałem tego.

Scott
źródło
-1

Najprostszym sposobem jest IMHO:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'
Matias Barrios
źródło
Nie jestem pewien, czy to działa; wydaje się, że brakuje warstwy cytatów. Nawet jeśli tak, to ustawienie PROMPT_COMMAND(które uruchamia się za każdym razem, gdy powłoka wydaje monit) wydaje się bardzo trudnym sposobem rozwiązania tego problemu. A ponieważ jest to nieco tajemnicze, każda odpowiedź sugerująca, że ​​naprawdę powinna zawierać wyjaśnienie, jak to działa.
Scott
-2

Możesz robić rzeczy takie jak montowanie domu na sshfs / nfs, ale najłatwiejszym rozwiązaniem jest przeszukanie twojego bashrc na nowej maszynie. To także przynosi aliasy i takie tam.

Dentrasi
źródło
Jak powiedziałem w moim pytaniu, udostępniam te loginy innym osobom. Jestem pewien, że nie doceniliby mnie, pisząc nad profilem podstawowym.
Unfundednut,
1
Montowanie $ HOME przez NFS jest szalone. Tylko mówię'.
Wesley Rice,