Chcę ssh na zdalnym komputerze Ubuntu, pobrać mój .bashrc
i 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 ls
na przykład), ale kiedy próbuję uruchomić zdefiniowany alias, pojawia .bashrc
się błąd:
bash: my_alias: command not found
Ale potem, gdy ponownie go napiszę i uruchomię, działa!
Jak mogę się upewnić, że .bashrc
jest ono pozyskane przed wywołaniem polecenia?
Odpowiedzi:
Problem polega na tym, że próbujesz uruchomić alias w nieinteraktywnej powłoce. Po uruchomieniu
ssh user@computer command
,command
jest prowadzony nieinteraktywnie.Nieinteraktywne powłoki nie czytają aliasów (z man bash):
Działa, jeśli uruchomisz go ponownie ręcznie, ponieważ ostatnie
bash
polecenie 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:To wydaje się bardzo skomplikowane podejście. Nie wyjaśniłeś, dlaczego dokładnie musisz to zrobić, ale rozważ te alternatywy:
Wystarczy uruchomić normalną interaktywną powłokę logowania na zdalnym komputerze i uruchomić polecenie ręcznie:
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:Ponieważ
~/.profile
jest czytany za każdym razem, gdy uruchamiana jest powłoka logowania (a więc za każdym razem, gdy się łączyszssh
, na przykład), spowoduje to, że będziemy_alias
uruchamiany przy każdym połączeniu.Zauważ, że domyślnie powłoki logowania czytają
~/.profile
lub~/.bash_profile
ignorują~/.bashrc
. Niektóre dystrybucje (na przykład Debian i jego pochodne oraz Arch), takie jak Ubuntu, mają swoje domyślne~/.profile
lub~/.bash_profile
źródłowe pliki,~/.bashrc
co oznacza, że zdefiniowane aliasy~/.bashrc
będą również dostępne w powłoce logowania. Nie dotyczy to wszystkich dystrybucji, więc może być konieczne~/.profile
ręczne edytowanie, aby mieć źródło~/.bashrc
. Zauważ też, że jeśli~/.bash_profile
istnieje,~/.profile
zostanie zignorowany przez bash.źródło
~/.basyrc
jest automatycznie odczytywany przez~./profile
, więc wszelkie zdefiniowane w nim aliasy~/.bashrc
bę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
).Musiałem skomentować część mojego .bashrc, która uniemożliwiła użycie aliasów i dodać komendę expand_aliases. To zostało skomentowane
I to zostało dodane
Wtedy moje polecenie zadziałało:
źródło