~/.profile
jest wykonywany tylko przez powłoki logowania. Program, który wywołuje powłokę, decyduje, czy powłoka będzie powłoką logowania (umieszczając -
jako pierwszy znak zerowego argumentu w wywołaniu powłoki). Zwykle nie jest wykonywany, gdy logujesz się, aby wykonać określone polecenie.
W szczególności OpenSSH wywołuje powłokę logowania tylko wtedy, gdy nie podano polecenia. Więc jeśli podasz polecenie, ~/.profile
nie zostanie odczytane.
OpenSSH pozwala ustawiać zmienne środowiskowe po stronie serwera. To musi być włączone w konfiguracji serwera z PermitUserEnvironment
dyrektywą. Zmienne można ustawić w pliku ~/.ssh/environment
. Zakładając, że korzystasz z uwierzytelniania za pomocą klucza publicznego, możesz również ustawić zmienne dla poszczególnych kluczy w ~/.ssh/authorized_keys
: dodaj environment="FOO=bar"
na początku odpowiedniego wiersza.
Ssh obsługuje również wysyłanie zmiennych środowiskowych. W OpenSSH użyj SendEnv
dyrektywy w ~/.ssh/config
. Jednak konkretna zmienna środowiskowa musi być włączona z AcceptEnv
dyrektywą w konfiguracji serwera, więc może to nie zadziałać.
Jedną rzeczą, która moim zdaniem zawsze działa (co dziwne), o ile korzystasz z uwierzytelniania za pomocą klucza publicznego, to (ab) użycie command=
opcji z authorized_keys
pliku . Klawisz z command
opcją nadaje się tylko do uruchomienia określonej komendy; ale polecenie w authorized_keys
pliku działa ze zmienną środowiskową SSH_ORIGINAL_COMMAND
ustawioną na polecenie określone przez użytkownika. Ta zmienna jest pusta, jeśli użytkownik nie określił polecenia i dlatego oczekiwał powłoki interaktywnej. Możesz więc użyć czegoś takiego w ~/.ssh/authorized_keys
(oczywiście nie będzie to miało zastosowania, jeśli nie użyjesz tego klucza do uwierzytelnienia):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Inną możliwością jest napisanie skryptów opakowania na serwerze. Coś takiego jak poniżej ~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Następnie wykonaj dowiązania symboliczne do tego skryptu o nazwie rsync
, unison
itd karnetów --rsync-path='bin/rsync'
na rsync
linii poleceń, i tak dalej do innych programów. Alternatywnie, niektóre polecenia umożliwiają określenie całego fragmentu powłoki, który ma być uruchamiany zdalnie, co pozwala na samodzielne wykonanie polecenia: na przykład możesz użyć rsync --rsync-path='. ~/.profile; rsync'
.
Istnieje inna droga, która zależy od tego, czy twoja powłoka logowania jest bash lub zsh. Bash zawsze czyta, ~/.bashrc
gdy jest wywoływany przez rshd lub sshd, nawet jeśli nie jest interaktywny (ale nie, jeśli jest wywoływany jako sh
). Zsh zawsze czyta ~/.zshenv
.
## ~/.bashrc
if [[ $- != *i* ]]; then
# Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
. ~/.profile
fi
## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
# Not a login shell, but this is an rsh/ssh session
. ~/.profile
fi