Dlaczego SSH nie wywołuje pliku .bash_profile?

2

Zrozumiałem, .bash_profileże zawsze będzie się przywoływać przy użyciu loginu SSH.

Nie widzę jednak włączonych różnych ustawień, chyba że wykonam następujące czynności:

ssh $host "source ~/.bash_profile ; echo $PATH "

.:/mnt/spark-1.4.1/bin:/mnt/spark-1.4.1/sbin:/mnt/scala-2.11.2/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Kiedy po prostu to robię:

ssh $host "echo $PATH "

Informacje o ŚCIEŻCE są tylko domyślnymi

 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Użytkownik jest rootem, a domyślną powłoką jest bash.

$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Aug  6 19:54 /bin/sh -> bash

Aktualizacja powłoki root'a to bash

grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
javadba
źródło
Właśnie to zauważyłem: z twoich przykładów jestem pewien, że nie wykonałeś poleceń, które według ciebie wykonałeś. Na przykład, ssh $host "echo $PATH"wywoła echo lokalnego komputera / konta $PATH, ponieważ podwójne cudzysłowy nie blokują rozwijania parametrów ani rozszerzania tyldy, więc te rzeczy są rozwijane na lokalnym komputerze przed wykonaniem sshpolecenia. Jeśli chcesz zobaczyć $PATHmaszynę, na której SSHing, musisz użyć pojedynczych cudzysłowów wokół polecenia zdalnego:ssh $host 'echo $PATH'
Spiff
@Spiff Wystarczająco. Napisałem to prawie miesiąc temu i ostatnio wykonałem „lepszą” robotę, robiąc cytaty właściwie. Dziś rano uruchomiłem ssh $ host 'echo $ SPARK_HOME'. Używał pojedynczych cytatów i wrócił z niczym. Ta zmienna jest ustawiona w .bash_profile
javadba

Odpowiedzi:

3

Czy masz .bashrczestaw plików? Może być uszkodzony, zepsuty lub ma coś, co powoduje, że przetwarzanie .bashrcdławika i awarii. W rezultacie nie dochodzi do punktu, w którym może on czysto strawić / przetworzyć .bash_profile.

Jak pokazano na tej stronie , .bashrcładuje się przed .bash_profile:

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

Poleciłbym to sprawdzić, .bashrca może nawet tymczasowo zmienić jego nazwę, na przykład .bashrc_offwyłączyć, aby przetestować teorię przed dalszym debugowaniem.

JakeGould
źródło
Zero ~ / .bashrc, /etc/bash.bashrc, ~ / .bash_login, ~ / .profile w tych systemach. Tylko ~ / .bash_profile i ~ / .bash_logout
javadba
@javadba Spójrz na powyższą tabelę. Możliwe, że bardziej ogólne konfiguracje startowe Bash dławią się, tak jak /etc/profilelub nawet /etc/bash.bashrc. Sprawdź je, a być może na końcu pliku znajduje się „gremlin”.
JakeGould,
Dzięki, to AMI dla Spark'a, dla którego nie dotknąłem / etc / profile-i który wygląda dość ogólnie. Brak pliku /etc/.bash.bashrc.
javadba,
Czy masz coś przeciwko temu, że zaktualizowałem OP. Ten problem mnie zabija - ponieważ bez .bash_profile nie ma sposobu na skonfigurowanie zdalnego środowiska ssh.
javadba
@javadba Nie mam pojęcia, co się dzieje. Przepraszam. Nie mogę ci już pomóc.
JakeGould,
2

ssh z poleceniem NIE uruchomi powłoki logowania. Zatem bash_profile nie jest pozyskiwany.

Zobacz szczegóły tutaj

nullas
źródło
0

O czym był ten ostatni kawałek /bin/sh? Jeśli domyślna powłoka root jest ustawiona na /bin/sh, wówczas bashzostanie wywołana w trybie kompatybilności powłoki POSIX Bourne, gdzie bashnie zostaną uruchomione skrypty startowe -specyficzne.

Spiff
źródło
Był to komentarz, że / bin / sh jest dowiązaniem symbolicznym do bash w systemie - na wypadek, gdyby ssh domyślnie używał / bin / sh (czego nie jestem pewien).
javadba,
@javadba Więc idź i powiedz nam, na co ustawiona jest powłoka użytkownika root w systemie, w którym SSHing. SSH wykonuje tylko logowanie. Domyślną powłoką konta, na które się logujesz, jest powłoka, z której się korzysta. Jeśli jest ustawiony na /bin/sh, to twój problem. Jeśli chcesz użyć .bash_profile, musisz wywołać bashas bash, ponieważ bashwygląda na to, czy zostało wywołane jako shi zmienia zachowanie, aby było bardziej shpodobne.
Spiff,
Powłoka roota to bash (OP zaktualizowany)
javadba