~/.profile
yalnızca giriş kabukları tarafından yürütülür. Kabuğu çağıran program, kabuğun bir oturum açma kabuğu olup olmayacağına karar verir ( -
kabuk çağrısında sıfırıncı bağımsız değişkenin ilk karakteri olarak a koyarak ). Belirli bir komutu yürütmek için oturum açtığınızda genellikle yürütülmez.
Özellikle OpenSSH, yalnızca bir komut belirtmezseniz bir oturum açma kabuğu çağırır. Yani bir komut belirtirseniz, ~/.profile
okunmaz.
OpenSSH, sunucu tarafında ortam değişkenlerinin ayarlanmasına izin verir. Bu , yönerge ile birlikte sunucu yapılandırmasında etkinleştirilmelidir PermitUserEnvironment
. Değişkenler dosyada ayarlanabilir ~/.ssh/environment
. Ortak anahtar kimlik doğrulamasını kullandığınızı varsayarsak, anahtar başına değişkenleri de ayarlayabilirsiniz ~/.ssh/authorized_keys
: environment="FOO=bar"
ilgili satırın başına ekleyin .
Ssh ayrıca ortam değişkenlerinin gönderilmesini de destekler. OpenSSH'de, içindeki SendEnv
yönergeyi kullanın ~/.ssh/config
. Ancak, belirli ortam değişkeninin AcceptEnv
sunucu yapılandırmasında bir yönerge ile etkinleştirilmesi gerekir , bu nedenle bu sizin için işe yaramayabilir.
Bence ortak anahtar kimlik doğrulaması kullandığınız sürece her zaman (yeterince garip) çalışır düşünüyorum (ab) dosyada command=
seçeneği kullanmaktırauthorized_keys
. Seçeneğe sahip bir anahtar command
yalnızca belirtilen komutu çalıştırmak için iyidir; ancak authorized_keys
dosyadaki komut , ortam değişkeni SSH_ORIGINAL_COMMAND
kullanıcının belirttiği komuta ayarlanmış olarak çalışır . Kullanıcı bir komut belirtmediyse ve bu nedenle etkileşimli bir kabuk bekleniyorsa bu değişken boştur. Böylece böyle bir şey kullanabilirsiniz ~/.ssh/authorized_keys
(elbette, kimlik doğrulamak için bu anahtarı kullanmazsanız geçerli olmaz):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Başka bir olasılık, sunucuya bir sarıcı komut dosyaları yazmaktır. Aşağıdaki gibi bir şey ~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Sonra adı verilen bu senaryoya sembolik bağ oluşturur rsync
, unison
vb Geçiş --rsync-path='bin/rsync'
üzerinde rsync
komut satırı ve böylece diğer programlar için üzerinde. Alternatif olarak, bazı komutlar uzaktan çalıştırmak için bir bütün kabuk snippet'ini belirtmenize izin verir, bu da komutu kendi içinde bulundurmanızı sağlar: örneğin, rsync ile kullanabilirsiniz --rsync-path='. ~/.profile; rsync'
.
Giriş kabuğunuzun bash veya zsh olmasına bağlı başka bir cadde var. Bash ~/.bashrc
, etkileşimli olmasa bile rshd veya sshd tarafından çağrıldığında her zaman okur (ancak olarak adlandırılmasa bile sh
). Zsh daima okur ~/.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