Plik źródłowy po opuszczeniu logowania przez ssh do monitu

Aug 16 2020

Jedno-liniowe pytanie: Jak automatycznie pobrać zdalny plik na zdalnym hoście po zalogowaniu się przez SSH za pośrednictwem hosta bastionu?

Muszę pobrać plik zawierający listę aliasów + zdefiniowane przez użytkownika funkcje powłoki na zdalnym hoście po ssh-in do niego.

Plik istnieje podczas obróbki zdalnej w folderze / tmp, np. / Tmp / my-rc

Przeszukując inne posty i internet znalazłem

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

Problem polega na tym, że dostaję terminal, ale żaden z aliasów nie jest ustawiony, ponieważ jest to nowa powłoka bash '

Myśląc, że źródło powinno być zrobione po podłączeniu powłoki, wypróbowałem poniższe, ale to też nie działa. Nie ma błędu, otrzymuję terminal, ale nie sądzę, że plik został pozyskany (zweryfikowany przez wyświetlenie fałszywego komunikatu z pliku / tmp / my-rc)

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

Próbowałem nawet z „.” zamiast źródła, nie ma szczęścia.

Jakaś pomoc.

Uwaga 1: Bash lub ZSH wystarczyłoby każde rozwiązanie powłoki.

Uwaga 2: W rzeczywistości ssh odbywa się za pomocą polecenia proxy, tj. Hosta przeskoku nad bastionem (wystarczy wspomnieć, czy w ogóle jest to istotne)

Uwaga 3: Nie mam uprawnień do profilu rc lub bashrc ani nawet do katalogu domowego na zdalnym hoście.

Uwaga 4: Dokładne polecenie, którego użyłem do zalogowania się do bezpiecznego hosta, pochodzi z hosta bastion, jak poniżej

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

Odpowiedzi

4 StéphaneChazelas Sep 01 2020 at 23:09

Dzięki temu bashmożesz:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

Co spowodowałoby, /tmp/my-rcże byłyby pozyskiwane przed podpowiedzią, i tylko ta podpowiedź, ponieważ PROMPT_COMMANDpóźniej się rozbrajamy .

Będziesz chciał usunąć unset PROMPT_COMMANDif /tmp/my-rcfaktycznie ostatecznie go definiuje.

Powyższe zakłada, że ​​powłoka logowania zdalnego użytkownika jest podobna do Bourne'a, ale powinieneś być w stanie dostosować ją do większości innych typów powłok (csh / rc / fish).

2 fra-san Sep 01 2020 at 22:30

Biorąc pod uwagę, że możesz pisać do zdalnego hosta /tmp, możesz utworzyć w nim /tmp/myhomekatalog, umieścić tam profil swojej powłoki i pliki inicjalizacyjne, a następnie uruchomić Zsh z ZDOTIDRustawieniem na /tmp/myhomei Bash z HOMEustawieniem na /tmp/myhome.

Domyślnie Zsh wyszukuje swoje pliki inicjalizacyjne w programie $ZDOTDIR, domyślnie $HOMEjeśli ZDOTDIRnie jest ustawione.

Dlatego możesz uruchomić Zsh na zdalnym hoście jako:

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

I Bash jako:

ssh -t user@host HOME=/tmp/myhome bash

Oczywiście możesz wykazać się kreatywnością ze swoim profilem / plikami inicjalizacyjnymi - np. Użyj ich do ustawienia HOMEbardziej odpowiedniej ścieżki, źródła innych plików (jeśli zdarzyło ci się już mieć pliki z kropkami gdzieś na zdalnym hoście) itp.

Minimalne zastosowanie tego podejścia, skondensowane w jednym poleceniu, mogłoby polegać na:

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

(Użyj, mkdir -p ...aby zapobiec wyświetlaniu błędu, jeśli /tmp/myhomejuż istnieje, np. Jeśli łączysz się ponownie ze zdalnym hostem i wiesz już, że katalog tam jest).

Biorąc ProxyCommandpod uwagę, może to być:

ssh -t -o ProxyCommand='ssh -W \
  %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
  10.0.31.122 \
  'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

Na koniec, jeśli chodzi o twoje próby: ssh -t [email protected] 'bash -l; source /tmp/my-rc'nie działa, ponieważ sourcepolecenie jest wykonywane tylko po zamknięciu powłoki interaktywnej.

1 jakethefinn Sep 04 2020 at 19:40

Jeśli parametr UsePAM jest ustawiony na yes w pliku sshd_config zdalnego hosta, to plik konfiguracyjny /etc/pam.d/sshd umożliwia automatyzację wykonywania poleceń po pomyślnym zalogowaniu, między innymi w procesie uwierzytelniania. Dodaj tę linię kodu

session    required     pam_exec.so /etc/myscripts/./sourcing-script

bezpośrednio nad tymi liniami

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

gdzie / etc / myscripts / sourcing-script to po prostu plik na zdalnym hoście z poleceniem do wykonania po pomyślnym zalogowaniu.

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

Używam tej metody, aby zatrzymać usługę i zgłosić ją do pliku dziennika, zanim moja sesja ssh zostanie otwarta. Przed wylogowaniem ustawiłem plik crontab, aby uruchomić usługę, aby nigdy nie działał równolegle z moją sesją ssh.

dirkt Aug 16 2020 at 13:40

Zwykle robisz to w $HOME/.profilewariantach lub.

sshustawia zmienne środowiskowe, zaczynając od SSH_, możesz ich użyć do określenia, czy logowałeś się przez ssh, czy bezpośrednio.