~/.profile
biasanya tidak dibaca ketika Anda menjalankan ssh somecommand
, sebagai lawan dari sesi ssh interaktif (atau metode login lain di mana Anda memulai sesi interaktif).
Ssh 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.
OpenSSH juga memungkinkan pengaturan variabel lingkungan di sisi server. Sekali lagi, ini harus diaktifkan dalam konfigurasi server, di sini 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.
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 (kosong untuk sesi 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="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
Perhatikan bahwa saya meletakkan garis putus di atas untuk keterbacaan, tetapi ini sebenarnya harus semuanya dalam satu baris.
Kemungkinan lain adalah menulis skrip wrapper ~/bin/rsync-wrapper
di server, sesuatu seperti
#!/bin/sh
. ~/.profile
exec rsync "$@"
Kemudian sampaikan --rsync-path='bin/rsync-wrapper'
pada rsync
baris perintah. Argumen untuk --rsync-path
diperluas oleh shell, jadi jika Anda mau, Anda dapat membuat baris perintah rsync mandiri dengan melewatkan sesuatu seperti --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