~/.profileyalnı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, ~/.profileokunmaz.
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 SendEnvyönergeyi kullanın ~/.ssh/config. Ancak, belirli ortam değişkeninin AcceptEnvsunucu 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 commandyalnızca belirtilen komutu çalıştırmak için iyidir; ancak authorized_keysdosyadaki komut , ortam değişkeni SSH_ORIGINAL_COMMANDkullanı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, unisonvb Geçiş --rsync-path='bin/rsync'üzerinde rsynckomut 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