Saya ingin dapat menjalankan perintah dari mesin saya menggunakan ssh dan melewati variabel lingkungan $BUILD_NUMBER
Inilah yang saya coba:
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
diatur pada mesin yang melakukan panggilan ssh dan karena variabel tidak ada pada host jarak jauh, variabel tidak diambil.
Bagaimana cara menyampaikan nilai $BUILD_NUMBER
?
Jawaban:
Jika Anda menggunakan
dari pada
shell Anda akan menginterpolasi
$BUILD_NUMBER
sebelum mengirim string perintah ke host jarak jauh.sumber
Variabel dalam tanda kutip tunggal tidak dievaluasi. Gunakan tanda kutip ganda:
Shell akan memperluas variabel dalam tanda kutip ganda, tetapi tidak dalam tanda kutip tunggal. Ini akan berubah menjadi string yang Anda inginkan sebelum diteruskan ke
ssh
perintah.sumber
(Jawaban ini mungkin tampak tidak perlu rumit, tetapi mudah diperluas dan kuat terkait spasi putih dan karakter khusus, sejauh yang saya tahu.)
Anda dapat memasukkan data langsung melalui input standar
ssh
perintah danread
dari lokasi jarak jauh.Dalam contoh berikut,
ssh
baris yang diakhiri dengan null yang memberikan nama dan nilai variabel.shh
perintah itu sendiri, kami melakukan perulangan melalui baris-baris ini untuk menginisialisasi variabel yang diperlukan.Keluaran:
Jika Anda tidak perlu
export
orang-orang, Anda harus dapat menggunakandeclare
bukanexport
.Versi yang sangat sederhana (jika Anda tidak memerlukan ekstensibilitas, memiliki satu variabel untuk diproses, dll.) Akan terlihat seperti:
sumber
Daftar variabel lingkungan yang diterima di SSHD secara default disertakan
LC_*
. Jadi:sumber
Seperti yang telah dijawab sebelumnya, Anda tidak perlu menyetel variabel lingkungan pada host jarak jauh. Sebagai gantinya, Anda cukup melakukan perluasan meta pada host lokal, dan meneruskan nilainya ke host jarak jauh.
Jika Anda benar-benar ingin menyetel variabel lingkungan pada host jarak jauh dan menggunakannya, Anda dapat menggunakan
env
program iniDalam hal ini ini adalah sedikit berlebihan, dan perhatikan
env BUILD_NUMBER=$BUILD_NUMBER
melakukan ekspansi meta pada host lokalBUILD_NUMBER
variabel lingkungan jarak jauh akan digunakan olehshell jarak jauh
sumber
Dimungkinkan juga untuk melewatkan variabel lingkungan secara eksplisit melalui ssh. Itu memang membutuhkan beberapa pengaturan sisi server, jadi ini bukan jawaban universal.
Dalam kasus saya, saya ingin meneruskan kunci enkripsi repositori cadangan ke perintah di server penyimpanan cadangan tanpa kunci itu disimpan di sana, tetapi perhatikan bahwa variabel lingkungan apa pun terlihat di
ps
! Solusi meneruskan kunci pada stdin juga akan berfungsi, tetapi saya merasa itu terlalu rumit. Bagaimanapun, berikut ini cara meneruskan variabel lingkungan melalui ssh:Di server, edit
sshd_config
file, biasanya/etc/ssh/sshd_config
dan tambahkanAcceptEnv
perintah yang cocok dengan variabel yang ingin Anda teruskan. Lihatman sshd_config
. Dalam kasus saya, saya ingin meneruskan variabel ke borg backup jadi saya memilih:Sekarang, pada klien gunakan
-o SendEnv
opsi untuk mengirim variabel lingkungan. Baris perintah berikut menetapkan variabel lingkunganBORG_SECRET
dan kemudian menandainya untuk dikirim ke mesin klien (dipanggilbackup
). Ini kemudian berjalan diprintenv
sana dan memfilter output untuk variabel BORG:sumber
LC_*
Variabel yang diizinkan untuk dikirim, jadi gunakan saja$LC_TvE_foo
, atau$LC_BORG_SECRET
, pastikan Anda tidak "bertabrakan" dengan variabel bawaan .Escape variabel untuk mengakses variabel di luar sesi ssh: ssh [email protected] "~ / tools / myScript.pl \ $ BUILD_NUMBER"
sumber
'$FOO'
sama dengan"\$FOO"
. pertanyaannya adalah "bagaimana cara melewatkan variabel shell dengan SSH?". Seperti yang telah dinyatakan oleh @PatrickTrentin, ini bukan jawaban yang benar karenaBUILD_NUMBER
variabel lingkungan tidak disetel dari jarak jauh.