Obecnie konfiguruję dość złożoną konfigurację bash, która będzie używana na wielu komputerach. Próbuję dowiedzieć się, czy można ustalić, czy jestem zalogowany przez SSH, czy na komputerze lokalnym. W ten sposób mogłem na przykład ustawić pewne aliasy w zależności od tego faktu. Podobnie jak aliasing halt
do restart
zatrzymania zdalnego serwera może nie być najlepszym rozwiązaniem.
Wiem do tej pory, że zmienna środowiskowa SSH_CLIENT
jest ustawiana, gdy loguję się przez ssh. Niestety ta zmienna jest odrzucana, gdy uruchamiam powłokę superużytkownika sudo -s
. Wiem również, że mogę przekazać parametr sudo, który instruuje sudo, aby skopiować wszystkie moje zmienne środowiskowe do nowego środowiska powłoki, ale jeśli nie chcę tego robić, czy jest inny sposób?
ps afx
a TTY dla powłoki, która nie działa,ps
będzie drugim loginem.who am i
.who am i
, abyś mógł stamtąd ustalić, czy korzystasz z SSHing, czy nie. Działa to:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
who
dowolnych dwóch dodatkowych argumentów.who am i
jest taki sam jakwho is me
lubwho is awesome
lubwho potato potato
. Fakt był dla mnie trochę interesujący.Oto świetna odpowiedź, którą znalazłem na unix.stackexchange :
SSH_CLIENT
lubSSH_TTY
jest zdefiniowana, jest to sesja ssh.ps -o comm= -p $PPID
. Jeśli taksshd
, to sesja ssh.źródło
Można dodać
SSH_*
doenv_keep
wsudoers
tak, że może to zostać wykryte podczas włączony do innego użytkownika.źródło
Jeśli chcesz wiedzieć, czy bash shell jest bezpośrednio potomnym procesem sshd (nie n> 1 warstwy głębokości)
powinien dać ci
sshd
nazwę cokolwiek nadrzędnego twojej bieżącej powłoki.źródło
ps -o cmd= $PPID
lubawk '/^Name:/ {print $2}' /proc/$PPID/status
Myślę, że chcesz przemyśleć sposób, w jaki myślisz o problemie. Pytanie nie brzmi „czy jestem zalogowany przez SSH, ponieważ chcę wyłączyć niektóre polecenia”. „Jestem zalogowany na konsoli, ponieważ wtedy włączę określone polecenia”.
źródło
Tak, jak zauważyli inni, informacje są w obecności twojego adresu IP w nawiasach wyjściowych
who am i
.Możesz użyć wyrażeń regularnych Bash, aby je wykryć:
źródło
Wymyśliłem następujące, oparte na wskazówkach innych tutaj.
Wykorzystuje zmienną do buforowania - używam jej w motywie powłoki.
Źródło:
is_ssh
w https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .źródło
Poszukaj cmdline rodzica twojej powłoki i powtórz. Może coś takiego:
Edytowane, aby faktycznie działało :)
źródło
Wszystkie pozostałe odpowiedzi działają, jeśli jesteś na pierwszym poziomie logowania. Ale jeśli po zalogowaniu uruchomisz „su” lub „sudo” (w moim przypadku ze względów bezpieczeństwa przełączysz się na konto użytkownika bez powłoki, musiałem uruchomić: sudo su - <userid> -s / bin / bash - l) ich rozwiązanie zawodzi.
Poniżej znajduje się uniwersalne rozwiązanie; używając pstree, sprawdzasz sshd jako rodzic.
Oto wynik działania polecenia egrep, po usunięciu opcji --quiet. Pokazuje całą pasującą hierarchię, jeśli jedna jest połączona zdalnie.
źródło
Proszę pamiętać, że ta odpowiedź jest bardzo, bardzo specyficzna dla Linuksa.
To powoduje kluczowe założenie: proces logowania nie będzie miał kontrolnego TTY; prawdopodobnie chcesz, aby sprawdzić, czy mają kontrolę TTY przed uruchomieniem tego kodu (który, na podstawie wymagań, prawdopodobnie jest to bezpieczny zakład, w każdym razie).
Kod iteruje w górę przez drzewo procesów, dopóki nie znajdzie procesu, który nie kontroluje TTY.
$initiator_name
będzie nazwą tego procesu (na przykład „sshd”).źródło