Uruchom polecenie w interaktywnej powłoce z ssh po sourcingu .bashrc

11

Chcę ssh na zdalnym komputerze Ubuntu, pobrać mój .bashrci uruchomić polecenie, które zależy od ustawionych przez niego parametrów .bashrc. Wszystko to w interaktywnej powłoce, która nie zamyka się po wykonaniu polecenia.

Do tej pory próbowałem

ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'

Lub tylko

ssh user@remote_computer -t "my_alias;bash"

Działa to w przypadku ogólnych poleceń (jak lsna przykład), ale kiedy próbuję uruchomić zdefiniowany alias, pojawia .bashrcsię błąd:

bash: my_alias: command not found

Ale potem, gdy ponownie go napiszę i uruchomię, działa!

Jak mogę się upewnić, że .bashrcjest ono pozyskane przed wywołaniem polecenia?

Mehdi
źródło
Post jest mylący. Zalecam, aby nie nadużywać uruchamiania takich poleceń; niemniej jednak, jeśli wywoływane jest polecenie bash lub bash, powiedziałbym, że .bashrc ma działać. Istnieją najwyraźniej pewne różnice lub osobliwości związane z uruchomieniem takiego polecenia, aw przypadku poważniejszych aplikacji polecam Ansible lub marionetkę.
Rui F Ribeiro
Zredagowałem swoje pytanie. Drugie polecenie jest prostsze i robi to samo, ale nadal bez wcześniejszego pozyskiwania .bashrc.
Mehdi,
@RuiFRibeiro Abuse ?? jak nazwać takie proste nadużycie? automatyczne uruchomienie polecenia po zalogowaniu się do zdalnego komputera za pomocą ssh, jest to tak proste. Każde narzędzie zewnętrzne, które byłoby wdrożone do tak absurdalnie małego zadania, byłoby przesadą
Mehdi
1
Tylko jedna rzecz mówiąca, nie była przeznaczona do użycia w szerszym znaczeniu. Używaj ich, kiedy ich potrzebujesz, jednak korzystanie z nich nie jest tak spokojne, jak się wydaje. Niemniej jednak, w przypadku przyszłych referencji, spójrz na Ansible, byłbyś zaskoczony, jak bardzo jest lekki. Często uruchamiam również polecenia przez ssh.
Rui F Ribeiro

Odpowiedzi:

9

Problem polega na tym, że próbujesz uruchomić alias w nieinteraktywnej powłoce. Po uruchomieniu ssh user@computer command, commandjest prowadzony nieinteraktywnie.

Nieinteraktywne powłoki nie czytają aliasów (z man bash):

Aliasy nie są rozwijane, gdy powłoka nie jest interaktywna, chyba że ustawiono opcję powłoki expand_aliases za pomocą shopt (patrz opis shopt w POLECENIA WBUDOWANE POWŁOKI poniżej).

Działa, jeśli uruchomisz go ponownie ręcznie, ponieważ ostatnie bashpolecenie uruchamia interaktywną powłokę, dzięki czemu aliasy są teraz dostępne.

Alternatywnie, możesz uruchomić interaktywną powłokę ( bash -i) zamiast prostej powłoki logowania ( bash -l) na zdalnym komputerze, aby uruchomić swój alias:

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

To wydaje się bardzo skomplikowane podejście. Nie wyjaśniłeś, dlaczego dokładnie musisz to zrobić, ale rozważ te alternatywy:

  1. Wystarczy uruchomić normalną interaktywną powłokę logowania na zdalnym komputerze i uruchomić polecenie ręcznie:

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. Jeśli zawsze chcesz, aby ten alias był uruchamiany podczas łączenia się z tym komputerem, edytuj ~/.profile(lub ~/.bash_profile, jeśli jest obecny) komputer zdalny i dodaj ten wiersz na końcu:

    my_alias

    Ponieważ ~/.profilejest czytany za każdym razem, gdy uruchamiana jest powłoka logowania (a więc za każdym razem, gdy się łączysz ssh, na przykład), spowoduje to, że będzie my_aliasuruchamiany przy każdym połączeniu.

    Zauważ, że domyślnie powłoki logowania czytają ~/.profilelub ~/.bash_profileignorują ~/.bashrc. Niektóre dystrybucje (na przykład Debian i jego pochodne oraz Arch), takie jak Ubuntu, mają swoje domyślne ~/.profilelub ~/.bash_profileźródłowe pliki, ~/.bashrcco oznacza, że ​​zdefiniowane aliasy ~/.bashrcbędą również dostępne w powłoce logowania. Nie dotyczy to wszystkich dystrybucji, więc może być konieczne ~/.profileręczne edytowanie, aby mieć źródło ~/.bashrc. Zauważ też, że jeśli ~/.bash_profileistnieje, ~/.profilezostanie zignorowany przez bash.

terdon
źródło
Sugerowałbyś więc zdefiniowanie aliasów w pliku alias_profile i wywołanie ich z pliku .profile lub .bash_profile?
Mehdi,
@Mehdi, które będą zależeć od tego, co chcesz zrobić. W twoim systemie Ubuntu ~/.basyrcjest automatycznie odczytywany przez ~./profile, więc wszelkie zdefiniowane w nim aliasy ~/.bashrcbędą również dostępne dla czytających powłoki ~/.profile. Wszystko, co naprawdę trzeba było zrobić, aby to zadziałało, to jawne uruchomienie interaktywnej powłoki ( -i).
terdon
5

Musiałem skomentować część mojego .bashrc, która uniemożliwiła użycie aliasów i dodać komendę expand_aliases. To zostało skomentowane

# If not running interactively, don't do anything
#case $- in
#    *i*) ;;
#      *) return;;
#esac

I to zostało dodane

if [ -z "$PS1" ]; then
  shopt -s expand_aliases
fi

Wtedy moje polecenie zadziałało:

ssh user@remote_computer -t "my_alias;bash"
Mehdi
źródło