Bagaimana saya bisa melewatkan variabel lingkungan melalui perintah ssh? [duplikat]

43

Bagaimana saya bisa meneruskan nilai ke perintah ssh, sehingga lingkungan yang dimulai pada mesin host dimulai dengan variabel lingkungan tertentu yang disetel ke pilihan saya?

EDIT: Tujuannya adalah untuk melewatkan desktop kde saat ini (dari dcop kwin KWinInterface currentDesktop) ke shell baru yang dibuat sehingga saya dapat mengirimkan kembali lokasi nfs ke instance JEdit saya di server asli yang unik untuk setiap desktop KDE. (Menggunakan mekanisme seperti emacsserver / emacsclient )

Alasan beberapa instance ssh dapat terbang dalam satu waktu adalah karena ketika saya mengatur lingkungan saya, saya membuka banyak instance ssh berbeda untuk mesin yang berbeda.

Ross Rogers
sumber

Jawaban:

18

The ~/.ssh/environmentfile dapat digunakan untuk set variabel yang Anda inginkan tersedia untuk perintah remote. Anda harus mengaktifkan PermitUserEnvironmentkonfigurasi sshd.

Variabel yang diatur dengan cara ini diekspor ke proses anak, sehingga Anda dapat:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

dan myscript akan tahu bahwa Foo adalah Bar dan Joe berusia 37.

John T
sumber
3
variabel perlu mengubah berpotensi setiap ssh panggilan
Ross Rogers
1
Mungkin lebih baik untuk menggambarkan apa yang Anda coba lakukan dan mengapa. Mungkin ada solusi lain. File lingkungan harus dihasilkan secara dinamis pada setiap panggilan ssh, yang bukan tidak mungkin.
EmmEff
Apa yang akan berubah? Nilai dari variabel-variabel itu atau bahkan namanya?
innaM
2
Jawaban ini sepertinya tidak benar-benar menjawab pertanyaan.
intuited
1
Ini akan pecah jika dua proses mencoba melakukan ini dengan set nilai yang berbeda secara bersamaan
nafg
55

The SendEnvpilihan adalah cowok Anda.

~ / .ssh / config: (lokal)

SendEnv MYVAR

/ etc / ssh / sshd_config: (di ujung remote)

AcceptEnv MYVAR

Sekarang, berapapun nilai $MYVARlokalnya, ia juga tersedia di sesi jarak jauh.
Jika Anda masuk berkali-kali, setiap sesi akan memiliki salinannya sendiri $MYVAR, dengan nilai yang mungkin berbeda.

~/.ssh/environmentdimaksudkan untuk tujuan lain. Ini semacam bertindak sebagai $ENVfile ketika menjalankan perintah non-shell dari jarak jauh.


sumber
6
juga dapat diteruskan (lebih bermanfaat) melalui baris perintah ssh myserver -o SendEnv="MYVAR", sehingga Anda dapat membuatnya dinamis dalam skrip.
Mike Campbell
31

Anda bisa memberikan nilai dengan perintah yang mirip seperti berikut:

ssh username@machine VAR=value cmd cmdargs

Anda dapat menguji dengan:

ssh machine VAR=hello env

Pada tcsh hal-hal berikut tampaknya berfungsi:

ssh machine "setenv VAR <value>; printenv"
Waltor
sumber
Sepertinya itu berfungsi baik untuk lingkungan bash. Sayang sekali saya berada di lingkungan tcsh perusahaan.
Ross Rogers
2
Bagaimana saya bisa menggunakan sesi secara interaktif?
luckydonald
1
Perhatikan bahwa contoh pertama hanya berfungsi untuk perintah pertama jika Anda merantai perintah bersama (dengan &&). Menggunakan bash, export VAR=value;bukannya setenv dalam bentuk ketiga berfungsi untuk kasus ini.
contrebis
2
Inilah yang akhirnya saya lakukan! Kemanapun Anda pergi, bawa lingkungan Anda. Anda dapat melakukannya seperti itu: ssh user@host "$(<env_to_source.sh) command ..." . Dalam env ke sumber, saya punya export var=value ; di baris yang berbeda (ingat titik koma).
Tomasz Gandor
@TomaszGandor: bertahun-tahun kemudian, masih sempurna - memungkinkan saya untuk melewati hal-hal rumit seperti PROMPT_COMMAND di sana tanpa perlu khawatir akan lolos :-) 1000 terima kasih.
Pil Merah
29

Ada juga hack yang mengerikan.

Jika skrip Anda menggunakan variabel pada ujung jarak jauh (mis. Anda dapat memberi nama apa pun yang Anda inginkan), Anda dapat menyalahgunakan variabel lokal. Variabel apa pun dari formulir LC_ * akan diteruskan pada kata demi kata, tanpa persyaratan untuk konfigurasi apa pun.

Sebagai contoh, kami memiliki serangkaian server benteng di salah satu klien saya. Aku benci harus terhubung ke sana, hanya untuk terhubung ke server lain ... dan server lain ... setiap saat. Saya memiliki skrip yang berperilaku seperti SSH, kecuali bahwa itu pintar.

Pada dasarnya, jika LC_BOUNCE_HOSTS disetel, LC_BOUNCE_HOSTS diatur dan memisahkan host pertama. Kemudian memantul dan menjalankan skrip yang sama. Pada node tujuan, daftar ini pada akhirnya kosong, sehingga menjalankan perintah. Saya juga memiliki mode debug (yang sangat bagus selama masalah jaringan), yang diatur oleh LC_BOUNCE_DEBUG. Karena ssh meneruskan semua ini untuk saya secara ajaib, saya tidak perlu melakukan apa pun selain mengenali akhir dari daftar host (yang saya lakukan dengan opsi -).

Saya merasa kotor setiap kali saya menggunakan ini, tetapi bekerja di mana-mana saya sudah mencobanya.

Jayson
sumber
2
Mengapa Anda menggunakan sesuatu seperti itu alih-alih ProxyCommandopsi bawaan OpenSSH ? Edit ~/.ssh/configdan tambahkan blok seperti Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhostdan biarkan terowongan koneksi Anda untuk Anda.
Kirk Strauser
1
Untuk terowongan, tidak terlalu buruk. Untuk env vars, dua alasan: Satu, PermitUserEnvironment memerlukan akses admin untuk mengkonfigurasi pada server untuk mengirimkannya secara langsung. Melewati mereka melalui baris perintah juga sangat sulit untuk meloloskan diri dengan benar. Dua, banyak bastion harus dipantulkan, menjadikan ini sedikit lebih rumit - terutama ketika tidak jelas dari host sumber jalur mana yang harus diambil ke host tujuan tertentu. Lebih mudah untuk mengatakan: "bounce-ssh bast1 bast2 nodeX - rm -rf /" daripada mempertahankan rute untuk populasi host yang terus berkembang dalam serangkaian file ssh-config.
Jayson
Tangkapan yang bagus !! Sangat indah dan sedikit kotor !!
zw963
2
Ini mengerikan. Bravo. 👏
Pi Delport
1
Ini sangat luar biasa, terima kasih! Saya telah menggunakannya untuk satu retasan lagi yang sangat bagus ! :)
lumbric
1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

Pada bash saya diuji dengan:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
Zeh
sumber