Plik źródłowy po opuszczeniu logowania przez ssh do monitu
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
Dzięki temu bash
moż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_COMMAND
później się rozbrajamy .
Będziesz chciał usunąć unset PROMPT_COMMAND
if /tmp/my-rc
faktycznie 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).
Biorąc pod uwagę, że możesz pisać do zdalnego hosta /tmp
, możesz utworzyć w nim /tmp/myhome
katalog, umieścić tam profil swojej powłoki i pliki inicjalizacyjne, a następnie uruchomić Zsh z ZDOTIDR
ustawieniem na /tmp/myhome
i Bash z HOME
ustawieniem na /tmp/myhome
.
Domyślnie Zsh wyszukuje swoje pliki inicjalizacyjne w programie $ZDOTDIR
, domyślnie $HOME
jeśli ZDOTDIR
nie 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 HOME
bardziej 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/myhome
już istnieje, np. Jeśli łączysz się ponownie ze zdalnym hostem i wiesz już, że katalog tam jest).
Biorąc ProxyCommand
pod 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ż source
polecenie jest wykonywane tylko po zamknięciu powłoki interaktywnej.
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.
Zwykle robisz to w $HOME/.profile
wariantach lub.
ssh
ustawia zmienne środowiskowe, zaczynając od SSH_
, możesz ich użyć do określenia, czy logowałeś się przez ssh
, czy bezpośrednio.