Jak automatycznie uruchamiać polecenia przy logowaniu SSH?

18

Za każdym razem, gdy loguję się na mój serwer Linux, chciałbym, aby kilka poleceń było uruchamianych automatycznie (ustaw niektóre zmienne, zmień lokalizację itp.)

Należy to zrobić przy logowaniu użytkownika, a nie przy uruchamianiu systemu.

Jak mogę to ustawić?

Alasdair
źródło
Musisz przeczytać sekcję ZAPROSZENIE w bash (1) ( man bash).
Andrew Schulman,

Odpowiedzi:

31

Wprowadź polecenia ~/.bashrc. Wszystko tam jest wykonywane przy każdym logowaniu.

Jeśli potrzebujesz komend do uruchamiania tylko podczas logowania przez ssh (ale nie przy logowaniu fizycznym), prawdopodobnie możesz przetestować obecność SSH_CONNECTIONzmiennej środowiskowej i uruchamiać komendy tylko wtedy, gdy ona istnieje.

David Z
źródło
Nie loguję się jako root, jest to serwer AWS, więc muszę zalogować się jako „użytkownik ec2”, a następnie przejść do rootowania przy użyciu „sudo su -”. Więc powinienem umieścić polecenia w „/home/ec2-user/.bashrc”?
5
Zakłada się, że ~ / .bashrc pochodzi z twojego ~ / .bash_profile. ~ / .bash_profile będzie skryptem wywoływanym dla powłoki logowania, takiej jak ssh. Wierzę, że ~ / .bashrc zostanie wywołany, jeśli otworzysz terminal Gnome, na przykład PO, po zalogowaniu się.
dgrant
Zdezorientowałeś mnie, pozwól mi wyjaśnić więcej: jest to instancja Amazon Web Services, która jest wirtualnym serwerem, więc nikt nigdy się fizycznie nie zaloguje (nawet nie jestem pewien, czy fizycznie istnieje jako jedna maszyna). Loguję się przy użyciu PUTTY z nazwą użytkownika ec2-user. To upuszcza mnie do katalogu / home / ec2-user. Następnie zmieniam się na użytkownika root, wpisując „sudo su -”, co następnie upuszcza mnie do „/ root”, a następnie muszę wpisać szereg poleceń, w tym zmienić mnie z powrotem na „/ home / ec2-user” i ustawić niektóre zmienne, aliasy itp. Więc ... jak mógłbym to zrobić?
Ponadto, ponieważ zmieniam użytkownika, oczekuję, że w profilu bash użytkownika ec2 powinienem umieścić tylko „sudo su -”, a następnie pozostałe polecenia w głównym pliku bash?
UWAGA: tak naprawdę to .profile jest wywoływany, jeśli istnieje, chyba że istnieje .bash_profile, wówczas jest wywoływany.
dgrant
14

Wystarczy umieścić to w ~ / .bashrc lub /etc/bash.bashrc, jeśli chcesz, aby dla wszystkich użytkowników:

if [[ -n $SSH_CONNECTION ]] ; then
    echo "I'm logged in remotely"
fi
Llamageddon
źródło
i jak stracę sesję po zamknięciu wykonania?
e-info128
1
@WHK Co rozumiesz przez utratę sesji?
Llamageddon
@Lamageddon: Myślę, że zastanawia się nad tym, czym ja jestem. Gdybym chciał włączyć całą sesję SSH screen, mógłbym użyć twojej odpowiedzi i umieścić screenją zamiast echa. Problem polega na tym, że zakończenie sesji ekranu powróci do monitu SSH zamiast wylogowania. Jednak napisanie tego komentarza dało mi odpowiedź: dodaj logoutpolecenie po screenpoleceniu.
zondo
Nie działa to jednak w przypadku sesji ssh, która nie korzysta z bash, np. Kiedy otwieram sesję sftp.
Fabio
@zondo @ e-info128 exec commandzastąpi bieżącą powłokę tym, co uruchomisz.
Llamageddon
6

Alternatywnie możesz określić polecenie, które zostanie uruchomione podczas wywoływania ssh:

$ ssh -t server 'cmd; exec bash -l'

Ostatnie polecenie na liście powinno rozpocząć interaktywną sesję w preferowanej powłoce. Jeśli masz wiele poleceń do uruchomienia, rozważ utworzenie pliku skryptu na serwerze SSH.

Dmitrij Grigoriew
źródło
1
TO jest bardzo przydatne. Nie jestem pewien, czy jest to dokładnie odpowiedź, którą zadał pytający, ale ludzie powinni o tym wiedzieć, ponieważ może to nie być oczywiste. Na przykład „ssh user @ host” export x = 5; bash "Następnie w wyskakującym terminalu echo $ x wyświetla 5.
wyczyść
3

Właściwie ~/.ssh/rcjest to właściwe miejsce dla Ciebie, aby dodać polecenie do uruchomienia, gdy ty się zalogować, zamiast każdego użytkownika systemu.

 ~/.ssh/rc
         Commands in this file are executed by ssh when the user logs in,
         just before the user's shell (or command) is started.  See the
         sshd(8) manual page for more information.
strumyk hong
źródło
Niekoniecznie. Jest miejsce, w którym można umieścić polecenia.
Daniel B,
To NAPRAWDĘ może wpędzić kogoś w kłopoty, jeśli nie będzie wiedział, co robią. Jest to potencjalnie przydatne w narożnych przypadkach, ale może NAPRAWDĘ kogoś zepsuć, jeśli zapomni, że umieścił tam polecenia lub nazwę i ścieżkę do tego pliku. Zasadniczo byłoby wysoce zalecane, aby umieścić komendy uruchamiania w oczekiwanym miejscu, .bashrc po stronie zdalnej i przetestować $ SSH_CONNECTION, jak sugerują inne odpowiedzi tutaj.
wyczyść