dynamiczne ładowanie lokalnych aliasów powłoki do sesji ssh

24

Kiedy loguję się do jakiegoś komputera za pomocą ssh, chcę, żeby były tam moje aliasy i funkcje . Innymi słowy, zaloguj się do komputera, który chciałbym móc używać skrótów poleceń.

Potrzebuję dynamiki, za każdym razem, gdy się loguję, chciałbym zaktualizować aliasy.

Uwagi: Bardzo często jest to pierwsze logowanie, bez znajomości komputera i plików. Czasami jest to pojedyncze logowanie. Tylko raz dla tej maszyny. Należy go później wyczyścić, należy również przywrócić poprzednią konfigurację.

Tomek Wyderka
źródło

Odpowiedzi:

18

Możesz tymczasowo skopiować swój .bashrckomputer na zdalne urządzenie pod inną nazwą. Na przykład za pomocą .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

Następnie możesz zalogować się do zdalnego komputera:

user@local$ ssh user@remote

i sourceplik .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Teraz możesz korzystać ze swoich .bashrci swoich funkcji. Po zakończeniu pracy możesz usunąć plik ~ / .bashrc_temp ze zdalnego komputera i wylogować się.

Kopiowanie pliku i logowanie do zdalnego komputera można uzyskać za pomocą funkcji bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Aktualizacja :

Można również rozważyć, aby skopiować .bashrcdo /tmpna zdalnej maszynie i źródła /tmp/.bashrc_temp.

Aktualizacja 2 :

Możesz zalogować się do zdalnego komputera za pomocą ssh -t . Spowoduje to automatyczne użycie temp .bashrc. Zaktualizowana funkcja s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}
jens-na
źródło
To jest zdecydowanie to, czego szukam. Dzięki! Ale czy można to zrobić bardziej funkcjonalnie? W jednym kroku? Ponieważ teraz potrzebujemy 3 kroków: zaloguj się, źródło, usuń przed wylogowaniem.
OK, widzę teraz po twojej aktualizacji. Świetny. Jeszcze jedna poprawka: „bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp”
Dodałem twoją poprawkę do mojej aktualizacji 2. Dzięki.
5
Prawie wszystkie odpowiedzi (w tym ta) używają przewidywalnej nazwy pliku w /tmp/. Może to być trywialnie wykorzystane przez każdego innego użytkownika do uruchomienia dowolnego kodu jako użytkownik, który się zaloguje. Powinno to być użyte, mktempaby upewnić się, że plik tymczasowy ma unikalną nazwę.
Tometzky
9

jens-na zapewnił doskonałą odpowiedź. Spędziłem trochę czasu i przerobiłem to, aby trochę lepiej pracować. W ten sposób możesz przekazać dowolny parametr do SSH, np. Numery portów. Różnica polega na tym, że używa sshpolecenia do przesłania .bashrcpliku, zamiast tego scp, który używa różnych nazw parametrów polecenia.

Zauważysz również, że przesyła on inny plik, .bashrc_remotedzięki czemu możesz wybrać dokładnie to, co chcesz uzyskać na zdalnych serwerach, zamiast wszystkiego

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Uruchom w następujący sposób:

sshs user@server

Nazwa „ sshs” oznacza „Źródło SSH”. Użyj, sshgdy nie chcesz źródła, i użyj, sshsgdy to zrobisz.

https://gist.github.com/jonahbron/5549848

Jonasz
źródło
To się przydaje. Ten sam zestaw parametrów, nie trzeba dodawać wpisu do ~ / .ssh / config tylko po to, aby określić inny numer portu!
Tomek Wyderka
Ponieważ jest to ta sama nazwa polecenia, być może można to zrobić za jednym razem i wpisać hasło tylko raz ... Niestety łączenie poleceń w jeden raport:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka
@TomekWyderka Tak, próbowałem przez około 20 minut, aby sprowadzić się do jednego polecenia, ale nie znalazłem sposobu. Być może osoba bardziej zorientowana w BASH niż mogłabym to rozgryźć, ale nie wydaje się to możliwe.
Jonasz
2
Wziąłem tę odpowiedź i powtarzałem ją przez kilka tygodni. W rezultacie powstaje pełne narzędzie, które miażdży problem: github.com/Russell91/sshrc
RussellStewart
1
@Jonah, możesz mi wyjaśnić, dlaczego użyłeś $ {*: 1} zamiast $ @.
RussellStewart
8

Myślę, że sshrc jest tym, czego szukasz: https://github.com/Russell91/sshrc

sshrc działa tak samo jak ssh, ale po zdalnym zalogowaniu się pozyskuje ~ / .sshrc.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Możesz użyć tego do ustawiania zmiennych środowiskowych, definiowania funkcji i uruchamiania komend po zalogowaniu. To takie proste i nie wpłynie na innych użytkowników na serwerze - nawet jeśli używają również sshrc. Aby uzyskać bardziej zaawansowaną konfigurację, kontynuuj czytanie.

RussellStewart
źródło
Miły. Lubię hack xxd!
Tomek Wyderka
@Tomek - tak, hack xxd jest całkowicie niesamowity. Naprawdę próbowałem załatwić sprawę scp. Następnie z potokowaniem do ssh. Nie można tego zrobić bez 2 połączeń z serwerem - 2 wpisów hasła - 2 podróży w obie strony. To było nie do przyjęcia. Zrobiłem więc nie do pomyślenia.
RussellStewart
Mam błąd. sshrc zawiesza się bez odpowiedzi. Czy możesz wstawić jakiś kod debugowania (może być w komentarzach) do sshrc, abym mógł go prześledzić.
Tomek Wyderka
Ciekawy. Jest to po prostu skrypt bashowy, więc zwykle wszelkie błędy lub ostrzeżenia zostaną automatycznie wydrukowane na ekranie. Ile bajtów znajduje się w pliku .sshrc.d? Również po prostu wpisz vim $(which sshrc)i zobaczysz plik bash. Możesz dodać polecenia echa po każdej linii, aby zobaczyć, gdzie się zawiesza.
RussellStewart
5

Nie jestem pewien ograniczeń, ale udało mi się sprawić, aby działało z czymś takim jak:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"
Ćwiek
źródło
To jest dla mnie najlepsza odpowiedź, ponieważ jest to pojedyncze polecenie ssh, bez scp. Jedyną pozostałą dla mnie poprawą byłoby znalezienie sposobu na uniknięcie RC_DATAzmiennej.
Sridhar Sarnobat
2

Właśnie to wymyśliłem. Pozwala na utrzymanie normalnego pliku rc, ale także robienie wszystkiego w jednym połączeniu ssh (tj. Wystarczy zalogować się tylko raz, a nie najpierw wykonać scp).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Nie jestem pewien, jak duży może być ten plik rc, ponieważ w pewnym momencie może się on maksymalnie wydłużyć.

mlathe
źródło
Musiałem zawinąć część polecenia w pojedyncze cudzysłowy, aby wszystko działało poprawnie. echo 'base64 .... sh`' - potem działało pięknie. Dzięki!!
K Robinson,
Jeśli rozmiar staje się problemem, możesz przesłać zawartość pliku przez narzędzie do kompresji, takie jak gzip przed kodowaniem base64.
K Robinson,
2

Myślę, że https://github.com/fsquillace/pearl-ssh robi to, czego potrzebujesz.

Napisałem to dawno temu, zanim narodził się sshrc i ma więcej zalet w porównaniu do sshrc:

  • Nie wymaga zależności od xxd dla obu hostów (które mogą być niedostępne na zdalnym hoście)
  • Pearl-ssh wykorzystuje wydajniejszy algorytm kodowania
  • To tylko ~ 20 linii kodu (naprawdę łatwe do zrozumienia!)

Na przykład:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit
użytkownik967489
źródło
1

Jedną z opcji umożliwiającą pracę z jedną sesją SSH jest użycie zmiennej do przechowywania pliku bash, a nie kopiowanie go.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Wydaje się dla mnie pracować.

gibsop1
źródło
1

Chciałem rozwiązać problem taki jak twój i zdałem sobie sprawę, że tak naprawdę szukam sshfs. Może ty też możesz tego użyć?

Mój problem polegał na tym, że podczas ssh'ing chciałem zachować swoje kolory, aliasy, funkcje i skrypty podczas pracy zdalnej.

http://fuse.sourceforge.net/sshfs.html

Deifyed
źródło
Lol, to też nigdy nie przyszło mi do głowy. To dość kreatywne rozwiązanie.
Sridhar Sarnobat