Mój zespół jest odpowiedzialny za tysiące komputerów z systemem Linux / Unix, więc oczywiście konto root jest „współdzielone” przez administratorów. Wolę tryb vi, inni wolą tryb emacs.
Jak mogę ustawić readline basha na tryb vi po zalogowaniu SSH na dowolnym komputerze, bez zmuszania wszystkich innych do używania trybu vi?
Zasadniczo chciałbym mieć efekt set -o vi
po zalogowaniu bez konieczności wpisywania go za każdym razem i bez narzucania go wszystkim innym (o ile tryb emacs jest dla mnie denerwujący, tryb vi jest denerwujący dla nich).
Wiem, że nie byłoby problemu, gdyby wszyscy używali własnych kont w sudo do wykonywania uprzywilejowanych poleceń, ale z powodu okoliczności poza moją kontrolą niestety nie jest to możliwe.
set -o vi
zanim daje mi kontrolę nad powłoką.set -o vi
polecenie, a następnie przejść do trybu interaktywnego.sshd
konfiguruje kilka zmiennych środowiskowych, które mogą pomóc ci ustalić, kto jest po drugiej stronie. Na przykładSSH_CLIENT
zawiera łączący adres IP (a także port wychodzący / przychodzący klienta). Zajmowanie się tym~/.bashrc
może pozwolić ci robić rzeczy tylko dla ciebie .Odpowiedzi:
Oto głupi sposób, aby to zrobić, który naprawdę działa dobrze tylko z uwierzytelnianiem za pomocą klucza publicznego:
Najpierw upewnij się, że masz na nim lokalną maszynę
nc
.Po drugie, wciąż na komputerze lokalnym, stwórz skrypt (zadzwonię
connect-to-server
) i umieść go w miejscu,${PATH}
o którym wiesz *:Następnie zmodyfikuj
.bashrc
w systemie zdalnym, aby zawierał gdzieś:Na koniec w lokalnej maszynie edytuj,
~/.ssh/config
aby dodać:Wady tego podejścia (i dlaczego nazywam to głupotą):
.yourname
plik nie zostanie jeszcze usunięty, w którym to przypadku również otrzymaset -o vi
.ssh serverNickname command
,command
uruchomi się, ale (ponieważ.bashrc
nigdy nie jest pozyskiwany).yourname
plik pozostaje, więc byłoby grzecznie mieć drugi alias w konfiguracji ssh, który nie używa pseudo-proxy.W rzeczywistości jedyną zaletą tego podejścia jest to, że twoje
ssh
polecenie nie wymaga dodatkowych argumentów.* Jeśli nie chcesz nic zmieniać na zdalnych systemach, oto alternatywny pseudo-proxy, który tworzy tymczasowe
.bashrc
:Ma to te same wady co druga metoda, więc nadal potrzebujesz drugiego aliasu w
ssh
konfiguracji, który nie wywołuje pseudo-proxy.źródło
Wybrałbym:
ale jeśli jesteś administratorem, możesz spróbować czegoś czystszego. Na przykład można użyć
SendEnv
opcji ssh po stronie klienta, aby przesłać określoną zmienną, użyćAcceptEnv
wsshd
konfiguracji (po stronie serwera), aby ją zaakceptować, i na tej podstawie zmodyfikować.bashrc
plik root, aby dostosować zachowanie zgodnie z wartością zmiennej.Oznacza to zmianę
sshd
konfiguracji na wszystkich hostach, a także ich.bashrc
. Jednak nie do końca „samodzielny” sposób ...źródło
Dla łatwego rozwiązania po stronie klienta:
To nie powieść, jeśli skrypty inicjalizacji powłoki korzeniem jest wyraźnie zastosowania
set -o emacs
lub zestawyEDITOR
doemacs
, lub jeśli root.initrc
wywołuje plikemacs
kluczy powiązań.Pozostała część odpowiedzi dotyczy rozwiązań po stronie serwera.
Działa to, gdy wchodzisz
ssh
do komputera, a następnie używaszsudo -i
:Dla twojego
/root/.bashrc
:Dzięki temu możesz mieć osobisty
bashrc
plik o nazwie, w/root/.bashrc-patrick
którym możesz robić, co chcesz, jak chceszset -o vi
.Łącząc to z nieco naiwnym podejściem do pobierania tego pliku rc w zależności od
$SSH_CLIENT
:To oczywiście działa tylko wtedy, gdy cały czas łączysz się z tym samym adresem IP ...
Inne podejście, które wykorzystuje pole komentarza konkretnego używanego klucza SSH, które działa, jeśli przekazujesz agenta SSH na serwer:
Spowoduje to wybranie pola komentarza dla klucza użytego do połączenia z serwerem. Występuje
head -n 1
na wypadek, gdybyś miał kilka kluczy wauthorized_keys
pliku.Możesz następnie użyć
$ssh_comment
do wybrania pliku rc do źródła, albo bezpośrednio, jak w$SUDO_USER
powyższym podejściu (w którym komentarz$ssh_comment
może wymagać pewnych porządków, jeśli jest to nazwa ścieżki), lub za pomocącase
instrukcji, jak w przypadku$SSH_CLIENT
podejścia.źródło
SSH_CLIENT
iSUDO_USER
używam go, ale wymaga modyfikacji po stronie serwera i nie jest szczególnie niezawodny. Miałem nadzieję na rozwiązanie wyłącznie po stronie klienta. Dziękuję za sugestię.Jeśli naprawdę chcesz to zrobić bez modyfikacji po stronie serwera:
1) Uruchom coś takiego
Nie sądzę, żeby dokumentacja była na to zbyt jasna, ale
-o option
jest wspomniana i wydaje się, że działa.2) Użyj spodziewać:
expect
Skrypt:Spraw, by był wykonywalny i uruchom:
Zakłada się, że możesz się zalogować bez wprowadzania haseł (dla zdalnego hosta lub dla swoich kluczy), w przeciwnym razie skrypt oczekiwań musiałby to wziąć pod uwagę. Ale przy wielu maszynach prawdopodobnie już to masz. Ponadto, oczekiwano na znak dolara i przestrzeni, edytować, że zgodnie z własnymi monit:
"# "
być może.Chociaż jeśli coś wydrukowane przed pytaniem zawiera te same znaki, musisz dołączyć coś bardziej szczegółowego do oczekiwanego ciągu.
Ponadto ten skrypt nie obsługuje przekazywania dodatkowych argumentów
ssh
. Jeśli zamierzasz wydać jednoznaczne polecenie, prawdopodobnie nie potrzebujesz trybu vi, ale jeśli potrzebujesz powiedzieć tunelowanie portów, może to być problem.Ale w każdym razie naprawdę uważam, że należy to rozwiązać w systemach docelowych z osobnymi kontami (
sudo
lub zwykłym starym identyfikatorem UID 0). Spersonalizowana konfiguracja przydałaby się również w wielu innych przypadkach, i ogólnie miałbyś wiele plików konfiguracyjnych i zmiennych środowiskowych, które chciałbyś ustawić. (Weź pod uwagę, że administratorzy mogą nie zgadzać się co do wartości$EDITOR
, zawartościvirc
lub jakiejkolwiek innej).Również usuwanie użytkowników byłoby łatwiejsze dzięki oddzielnym kontom.
Każdy sposób synchronizacji plików na wszystkich hostach rozwiązałby to w trywialny sposób, umożliwiając zalogowanie się za pomocą czegoś takiego jak
ssh -t user@host 'patricks_shell.sh'
lubssh -t user@host 'bash --rcfile patrick.rc'
.źródło
interact
. Nie istnieje, monity mogą być zupełnie inne, podobnie jak motds / wyjście z profili. Dziękuję za sugestię.możesz mieć niestandardowy plik rc zgodnie z tym przewodnikiem:
Plik użytkownika rc | Bezpieczna powłoka: ostateczny przewodnik
lub wstaw akcję wiersza poleceń do swojego pliku uprawnionego:
Konfiguracja SSH automatycznie uruchom zdalne polecenie | Wymiana stosów Unix i Linux
źródło