Ketika saya menggunakan rsync untuk menyalin file dari satu komputer ke komputer lain, proses rsync dimulai pada kedua ujungnya. Namun, pada ujung jarak jauh, file inisialisasi shell tampaknya tidak dibaca, jadi saya tidak dapat mengatur variabel lingkungan untuk proses rsync jarak jauh. Sayangnya, ada satu server yang saya perlu rsync di mana rsync memerlukan variabel lingkungan untuk bekerja. Saya bukan admin di server, jadi saya tidak bisa mengubah konfigurasi global. Apa yang bisa saya lakukan untuk mengatur lingkungan varaibles untuk proses rsync jarak jauh?
ssh
rsync
environment-variables
remote-connection
Ryan C. Thompson
sumber
sumber
rsync localfilename remotehost:remotefilename
, proses rsync dimulai di server. Saya tidak yakin bagaimana, tetapi tidak membaca file inisialisasi shell.Jawaban:
~/.profile
biasanya tidak dibaca ketika Anda menjalankanssh 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 denganAcceptEnv
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
: tambahkanenvironment="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 dalamauthorized_keys
file. Kunci dengancommand
opsi hanya baik untuk menjalankan perintah yang ditentukan; tetapi perintah dalamauthorized_keys
file berjalan dengan variabel lingkunganSSH_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):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 sepertiKemudian sampaikan
--rsync-path='bin/rsync-wrapper'
padarsync
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 sebagaish
). Zsh selalu membaca~/.zshenv
.sumber
$PATH
skrip init shell saya.PATH
, Anda harus dapat mengatur variabel lain di sana. (Jika itu tidak berhasil, cobalah untuk menambahkan jejak sebanyak yang Anda bisa, mulai denganset -x
skrip shell apa pun; gantirsync
biner dengan skrip pembungkus yang membuang lingkungan ke file kemudian memanggil biner yang sebenarnya.)~/.ssh/rc
?~/.ssh/rc
dijalankan oleh proses shell yang terpisah. Saya pikir taruhan terbaik Anda adalah skrip pembungkus atau--rsync-path='. ~/.profile; rsync'
. Atau kompilasi ulangrsync
dengan jalur yang cocok sesuai pertanyaan Anda yang lain.