ssh, uruchomić określoną powłokę i uruchomić polecenie na zdalnym komputerze?

11

Mam sytuację, w której kilku użytkowników udostępnia to samo konto użytkownika na zdalnym komputerze. Mam katalog „osobisty”, w którym napisałem własny .zshrcplik, i chciałbym mieć sposób na:

  1. Rozpocznij sesję ssh na zdalnym komputerze z dyrektywami z mojego pliku konfiguracyjnego ssh (np. ControlMaster auto)
  2. Ta sesja uruchamia powłokę Z.
  3. Działa .zshrcw moim „osobistym” katalogu (nie w katalogu osobistym współdzielonego użytkownika)

Byłoby miło mieć alias lub prosty sposób na rozpoczęcie takich sesji ssh (dlatego pomyślałem o użyciu pliku konfiguracyjnego OpenSSH), ale jestem otwarty na wszelkie inne pomysły!

Korzystasz z pliku konfiguracyjnego OpenSSH?

Czytałem na ssh_config OpenSSH w manualu , że mogę użyć dyrektywy LocalCommandokreślić komendę, aby uruchomić lokalnie po pomyślnym podłączeniu do serwera. To sprawiło, że pomyślałem, że może istnieć sposób, aby powiedzieć configplikowi, które polecenie uruchomić zdalnie po połączeniu z serwerem, ale wydaje się, że nie ma.

Amelio Vazquez-Reina
źródło
Nie sądzę, że możesz. Ale zastanawiam się, dlaczego tego chcesz. W wierszu poleceń ssh znajduje się już polecenie. Dlaczego nie możesz biegać ssh mycommand? A jeśli chcesz uruchomić jakieś polecenie instalacyjne przed każdym poleceniem pojawiającym się po ssh, dlaczego nie skonfigurować strony serwera?
Gilles „SO- przestań być zły”
Dzięki @Guilles. Mam sytuację, w której wielu użytkowników dzieli to samo zdalne konto, dlatego chciałbym szybko skonfigurować kilka rzeczy, gdy loguję się zdalnie. Mówiąc dokładniej, chciałbym uruchomić powłokę Z i poprosić ją o uruchomienie .zshrcw określonym katalogu (tj. „Osobistym” katalogu domowym). Próbowałem, ssh -t host_name 'zsh & source /path/to/my_zshrc'ale to nie zadziałało (mam FPATH variable not defined, i myślę, że to dlatego, że zshkończy się przed uruchomieniem my_zshrc, nie mówiąc już o tym, że nie dało mi to powłoki Z)
Amelio Vazquez-Reina
Myślę, że to zasługuje na aktualizację OP, więc właśnie ją zaktualizowałem.
Amelio Vazquez-Reina,
Poszukując mojej podobnej odpowiedzi, przychodzi mi do głowy, że to pytanie jest bardzo bliskie temu, co próbujesz zrobić.
Gilles „SO- przestań być zły”

Odpowiedzi:

15

Najbardziej oczywistym sposobem na zdalne uruchomienie polecenia jest podanie go w wierszu polecenia ssh. Polecenie ssh jest zawsze interpretowane przez powłokę użytkownika zdalnego.

ssh [email protected] '. ~/.profile; command_that_needs_environment_variables'
ssh -t [email protected] '. ~/.profile; exec zsh'

Wspólne konta to ogólnie zły pomysł; jeśli to możliwe, uzyskaj osobne konta dla każdego użytkownika. Jeśli utkniesz na wspólnym koncie, możesz utworzyć alias:

ssh -t [email protected] 'HOME=~/bob; . ~/.profile; exec zsh'

Jeśli używasz uwierzytelniania za pomocą klucza publicznego (ponownie zalecane), możesz zdefiniować polecenia dla poszczególnych kluczy w ~/.ssh/authorized_keys. Zobacz tę odpowiedź, aby uzyskać więcej wyjaśnień. Edytuj wiersz swojego klucza ~/.ssh/authorized_keysna serwerze (wszystko w jednym wierszu):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== [email protected]
Gilles „SO- przestań być zły”
źródło
Fantastyczne @Guilles. Twój wkład w tę witrynę czyni z niej niezwykle przydatne źródło informacji dla nas wszystkich. Dziękuję bardzo, naprawdę. Nawiasem mówiąc, nie wiedziałem o execpoleceniu. Czym exec zshróżni się od zshbezpośredniego połączenia ? Dlaczego jest to ważne w tym konkretnym przypadku?
Amelio Vazquez-Reina,
Hmm, kiedy biegnę ssh -t [email protected] 'HOME=~/bob; exec zsh', dostaję HOME=~/bob: command not found. Myślę, że jestem włączony tcsh. Mam ten sam problem, jeśli spróbuję HOME=/home/bob. Próbowałem na bash i zsh. Wszelkie wskazówki, co może być tego przyczyną? Wreszcie, czy powyższa składnia zostawi mnie z otwartą sesją ssh? (czego chcę). Dzięki jeszcze raz.
Amelio Vazquez-Reina,
1
@intrpc execzamienia oryginalną powłokę na zsh; bez zsh, oryginalna powłoka pozostałaby w pamięci, dopóki zsh nie wyjdzie, a następnie wyjdzie. Główną różnicą jest oszczędność pamięci, nie jest to bardzo ważne. Jeśli twoją powłoką logowania jest (t) csh, użyj setenv HOME ~/bob; exec zsh. Wreszcie, ponieważ zsh jest uruchamiany bez argumentów, otrzymujesz sesję powłoki, tak jak byś to sshzrobił, gdybyś właśnie uruchomił i miał zsh jako powłokę logowania.
Gilles „SO- przestań być zły”
Jeszcze raz dziękuję za pomoc. Jedno pytanie uzupełniające tutaj. Czy jest jakiś sposób na uruchomienie większej liczby poleceń po exec zshpoleceniu?
Amelio Vazquez-Reina,
1
@ AmelioVazquez-Reina Nie jest to wygodne, chyba że masz kontrolę nad jednym z plików kropek. Możesz ustawić zmienną środowiskową, ZDOTDIRaby zsh szukał plików kropek w innym katalogu. Jeśli masz pewną kontrolę nad kropka plików to można zrobić coś takiego dodatku eval $LC_STARTUP_CODEdo $ZDOTDIR/.zshrci przekazać kod do wykonania w zmiennej środowiskowej LC_STARTUP_CODE.
Gilles „SO- przestań być zły”
-3

Aby uruchomić polecenie zdalnie po podłączeniu serwera, dodaj do pliku .ssh / config następujący fragment kodu

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*
parth115
źródło
2
Dzięki @ user626129, ale jak wspomniałem w pierwotnym pytaniu, LocalCommanddyrektywa ma uruchamiać polecenie na lokalnej powłoce, a nie na zdalnej powłoce.
Amelio Vazquez-Reina,