~/.profile
hanya dieksekusi oleh shell login. Program yang memanggil shell memutuskan apakah shell akan menjadi shell login (dengan menempatkan -
sebagai karakter pertama dari argumen zeroth pada permintaan shell). Ini biasanya tidak dieksekusi ketika Anda masuk untuk menjalankan perintah tertentu.
OpenSSH secara khusus memanggil shell login hanya jika Anda tidak menentukan perintah. Jadi, jika Anda menentukan perintah, ~/.profile
tidak akan dibaca.
OpenSSH memungkinkan pengaturan variabel lingkungan di sisi server. Ini harus diaktifkan dalam konfigurasi server , dengan PermitUserEnvironment
arahan. Variabel dapat diatur dalam file ~/.ssh/environment
. Dengan asumsi Anda menggunakan otentikasi kunci publik, Anda juga dapat mengatur variabel per-kunci di ~/.ssh/authorized_keys
: tambahkan environment="FOO=bar"
di awal baris yang relevan.
Ssh juga mendukung pengiriman variabel lingkungan. Di OpenSSH, gunakan SendEnv
arahan dalam ~/.ssh/config
. Namun variabel lingkungan spesifik harus diaktifkan dengan AcceptEnv
arahan dalam konfigurasi server, jadi ini mungkin tidak berhasil untuk Anda.
Satu hal yang saya pikir selalu berfungsi (cukup aneh) selama Anda menggunakan otentikasi kunci publik adalah (ab) menggunakan command=
opsi dalam authorized_keys
file . Kunci dengan command
opsi hanya baik untuk menjalankan perintah yang ditentukan; tetapi perintah dalam authorized_keys
file berjalan dengan variabel lingkungan SSH_ORIGINAL_COMMAND
diatur ke perintah yang ditentukan pengguna. Variabel ini kosong jika pengguna tidak menentukan perintah dan karenanya mengharapkan shell interaktif. Jadi Anda dapat menggunakan sesuatu seperti ini di ~/.ssh/authorized_keys
(tentu saja, itu tidak akan berlaku jika Anda tidak menggunakan kunci ini untuk otentikasi):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Kemungkinan lain adalah menulis skrip wrapper di server. Sesuatu seperti yang berikut ini di ~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Kemudian membuat link simbolik ke script ini disebut rsync
, unison
, dll Lulus --rsync-path='bin/rsync'
pada rsync
baris perintah, dan sebagainya untuk program lain. Sebagai alternatif, beberapa perintah memungkinkan Anda untuk menentukan potongan seluruh shell untuk dijalankan dari jarak jauh, yang memungkinkan Anda untuk membuat perintah lengkap: misalnya, dengan rsync, Anda dapat menggunakan --rsync-path='. ~/.profile; rsync'
.
Ada jalan lain yang tergantung pada shell login Anda menjadi bash atau zsh. Bash selalu membaca ~/.bashrc
ketika dipanggil oleh rshd atau sshd, bahkan jika itu tidak interaktif (tetapi tidak jika itu disebut sebagai sh
). Zsh selalu membaca ~/.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