Ketika saya ssh
masuk ke server, bagaimana saya bisa mengirimkan variabel lingkungan dari klien ke server? Variabel lingkungan ini berubah antara pemanggilan ssh yang berbeda jadi saya tidak ingin menimpa $HOME/.ssh2/environment
setiap kali saya melakukan pemanggilan ssh. Bagaimana saya bisa melakukan ini?
ssh
environment-variables
Ross Rogers
sumber
sumber
ssh
halaman manual, saya tidak melihat cara untuk melakukan itu selain mengatur variabel secara manual setelah Anda masuk ke server, kecuali jika Anda memodifikasi ~ / .ssh2 / environment.Jawaban:
Tentu saja, Anda dapat mengatur variabel lingkungan di dalam perintah, namun Anda harus berhati-hati mengutip: ingat bahwa shell Anda akan mengurai baris perintah lokal Anda, dan kemudian shell remote akan mencoba-coba string itu. menerima.
Jika Anda ingin variabel mendapatkan nilai yang sama pada server yang dimilikinya pada klien, coba
SendEnv
opsi:Ini membutuhkan dukungan dari server. Dengan OpenSSH, nama variabel harus diotorisasi dalam
/etc/sshd_config
.Jika server hanya mengizinkan nama variabel tertentu, Anda dapat mengatasinya; misalnya pengaturan umum memungkinkan
LC_*
melalui, dan Anda dapat melakukan hal berikut:Bahkan jika
LC_*
bukan pilihan, Anda dapat meneruskan informasi dalamTERM
variabel lingkungan, yang selalu disalin (mungkin ada batas panjangnya). Anda masih harus memastikan bahwa shell jarak jauh tidak membatasiTERM
variabel untuk menunjuk tipe terminal yang dikenal. Lewati-t
opsi ke ssh jika Anda tidak memulai shell interaktif jarak jauh.Kemungkinan lain adalah mendefinisikan variabel secara langsung dalam perintah:
Jadi, jika melewati variabel lokal:
Namun, waspadalah terhadap masalah mengutip: nilai variabel akan diinterpolasi langsung ke potongan shell yang dijalankan di sisi jarak jauh. Contoh terakhir di atas mengasumsikan bahwa
$LOCALVAR
tidak mengandung tanda kutip tunggal ('
).sumber
AcceptEnv
arahansshd_config
sesuai yang diinginkan oleh administrator. TetapiTERM
diperlakukan secara khusus, sejauh yang saya tahu tidak ada cara untuk memfilternya di sisi server (sudah diatur dalam lingkungan shell terlepas dari pengaturan konfigurasi). Apakah Anda yakin tidak ada skrip profil yang menimpanya (suka/etc/profile
atau~/.profile
atau tidak~/.bashrc
)?TERM
hanya dikirimkan jika klien meminta server untuk mengalokasikan tty. Jika tidak ada terminal di sisi jarak jauh, akan sia-sia mengirimkannyaTERM
. Saat Anda menentukan perintah, jika Anda ingin memiliki terminal di sisi jarak jauh, Anda memerlukan-t
opsi baris perintah (atauRequestTTY
dalam~/.ssh/config
).Jika Anda dapat mengadministrasi host target Anda dapat mengkonfigurasi sshd untuk memungkinkan melewati variabel lingkungan lokal Anda ke host target.
Dari halaman manual sshd_config:
konfigurasi sshd biasanya hidup di
/etc/ssh/sshd_config
sumber
Jadi, pada klien Anda, Anda memiliki beberapa variabel lingkungan, dan Anda ingin itu tersedia untuk perintah jarak jauh? Saya tidak berpikir ada cara agar ssh secara ajaib meneruskannya, tetapi Anda mungkin dapat melakukan sesuatu seperti ini. Alih-alih menggunakan, katakan:
Kamu bisa melakukan ini:
sumber
Tanggapan @ emptyset (yang tidak berhasil untuk saya) mengarahkan saya ke jawaban ini:
Anda dapat menambahkan perintah ini ke
~/.ssh/authorized_keys
file Anda :export VARIABLE=<something>
segera keluar, dan koneksi SSH ditutup (mengunci saya keluar dari server), sedangkan/usr/bin/env ... $SHELL
akan menjalankan shell default Anda dengan lingkungan yang dimodifikasi.sumber
$SHELL
dengan shell yang sebenarnya? Juga periksa bahwa / usr / bin / env ada di server. Namun solusinya tidak sempurna: Saya perhatikan itu menggantung ketika saya ingin menggunakanscp
atau perintah inline.PermitUserEnvironment yes
dan menggunakan,environment="..."
bukancommand="..."
.Pada klien lokal Anda,
~/.ssh/config
Anda dapat menambahkanSetEnv
, misalnyaCatatan: Periksa
man ssh_config
.Kemudian di server, pastikan untuk mengizinkan klien melewati variabel lingkungan tertentu di
/etc/ssh/sshd_config
file konfigurasi Anda :Catatan: Periksa
man sshd_config
.sumber
Anda dapat mencoba menjalankan perintah khusus, dengan asumsi Anda memiliki pengaturan login ssh tanpa kata sandi. Di server, edit entri ~ / .ssh / otor_keys Anda yang terkait dengan kunci dari klien Anda:
Lihatlah tautan ini di bagian Perintah Paksa untuk sedikit lebih detail.
sumber
Saya membuat custom build dari OpenSSH untuk perangkat dengan cramfs di direktori home dan / etc (Cram FS adalah read-only) jadi ~ / .ssh / lingkungan tidak akan berfungsi tanpa membangun kembali seluruh FS dan ini adalah lapangan yang digunakan perangkat (Sistem Tertanam Oleh karena itu penggunaan CRAMFS). Anda dapat menentukan di sshd_config lokasi file authroized_keys tetapi karena alasan tertentu environment = hanya berfungsi untuk variabel lingkungan di ~ / .ssh / authroized_keys. Mengedit / etc / profile bukan pilihan dan saya harus memuat ssh di direktori non-standar. Dalam session.c setelah child_set_env (... "MAIL" ...) cukup tambahkan variabel lingkungan yang Anda butuhkan (Ini adalah hack yang saya tahu ...) tetapi hanya memetikan seseorang membutuhkan beberapa env hardcoded untuk sesi jika Anda kompilasi dari sumber Anda dapat melakukan ini. TGI-FLOSS
sumber
hanya satu perintah sederhana:
sumber