cara menonaktifkan variabel SendEnv yang diatur dalam ssh_config dari ~ / .ssh / config

30

Saya tidak dapat menemukan itu di mana pun sehingga saya bertanya-tanya apakah saya satu-satunya yang memukul masalah tersebut.

Secara default ssh pada Red Hat dan Debian setidaknya memiliki ssh_config dengan opsi SendEnv yang meneruskan variabel LC * dan LANG di sesi jarak jauh. Jika seseorang tidak melakukan root untuk mengubah /etc/ssh/ssh_config, bagaimana dia bisa menonaktifkan perilaku itu? Opsi SendEnv tampaknya terakumulasi dan saya tidak dapat melihat cara untuk meresetnya.

Dan untuk menghindari diminta, saya harus menghindari melewati lokal saya ke mesin uji untuk menghindari efek samping pada skrip dan program yang mengandalkan lokal menjadi default untuk mesin.

akostadinov
sumber
Ini bukan jawaban untuk pertanyaan Anda, tetapi bisakah Anda menyelesaikan masalah Anda dengan menjalankan skrip dan program pada mesin uji Anda melalui envatau dengan skrip wrapper?
Scott
2
ya, solusi mungkin tapi tidak nyaman
akostadinov

Jawaban:

18

Anda bukan satu-satunya . Seperti yang didokumentasikan di ssh_config(5)Anda tidak dapat menghapus SendEnv, karena

Beberapa variabel lingkungan mungkin [...] tersebar di beberapa arahan SendEnv.

Jika Anda memiliki root pada mesin uji Anda bisa berubah AcceptEnvuntuk tidak menerima variabel yang dikirim oleh klien.

Ansgar Wiechers
sumber
4
omong kosong, saya melihat hanya -F pada baris perintah dapat membantu tetapi terlalu nyaman untuk benar-benar digunakan. Lihat bugzilla.mindrot.org/show_bug.cgi?id=1285
akostadinov
5

Ini tidak dapat dilakukan ~/.ssh/configkarena SendEnvtidak dapat ditimpa.

Menggunakan alias tidak akan berfungsi untuk skrip yang memanggil ssh.

Salah satu alternatif adalah mengekspor fungsi. Misal dalam ~/.bashrc:

function ssh() {
    LANG="en_US.UTF-8" \
    LC_ADDRESS="$LANG" \
    LC_IDENTIFICATION="$LANG" \
    LC_MEASUREMENT="$LANG" \
    LC_MONETARY="$LANG" \
    LC_NAME="$LANG" \
    LC_NUMERIC="$LANG" \
    LC_PAPER="$LANG" \
    LC_TELEPHONE="$LANG" \
    LC_TIME="$LANG" \
    LC_ALL="$LANG" \
    /usr/bin/ssh $@
}
export -f ssh
Fernando Correia
sumber
1

Ada opsi SetEnv, seseorang dapat memaksa LANGke beberapa nilai tertentu sebelum mengirimnya.

Juga halaman manual mengatakan itu

Dimungkinkan untuk menghapus nama variabel SendEnv yang sebelumnya ditetapkan dengan pola awalan dengan -.

tetapi saya tidak berhasil membuat ini bekerja.

burunduk3
sumber
Lihat bugzilla.mindrot.org/show_bug.cgi?id=1285 , mungkin itu akan menjelaskan mengapa -pendekatan itu tidak berhasil. Saran yang baik untuk hardcode remote LANG dan vars lainnya di konfigurasi ssh. Membuat segalanya lebih mudah diprediksi. Mungkin SetEnvarahan yang lebih baru karena tidak ada orang lain yang menyarankannya. SetEnv LANG=en_US.UTF-8
akostadinov
0

Jika Anda menggunakan bash, Anda dapat mengatur alias ssh = 'LANG = perintah ssh' untuk menonaktifkan LANG yang lewat ke server lain.

Terima kasih
sumber
0

Anda dapat menggunakan su - yourusersaat Anda login lebih dari ssh. Ini akan menginisialisasi ulang lingkungan untuk pengguna.

Sebenarnya Anda menginisialisasi sesi baru dengan lingkungan baru.

Lambert
sumber
Pertanyaannya adalah membuat lingkungan waras secara otomatis. Dan btw su tidak selalu diinstal. Dan Anda harus mengetikkan kata sandi dengan su. Tidak berguna. Ada solusi yang lebih mudah.
akostadinov
0

Menurut man ssh:

 -F configfile
         Specifies an alternative per-user configuration file.  If a con-
         figuration file is given on the command line, the system-wide
         configuration file (/etc/ssh/ssh_config) will be ignored.  The
         default for the per-user configuration file is ~/.ssh/config.

Jadi, Anda dapat ssh tanpa mematuhinya dengan/etc/ssh/ssh_config secara eksplisit menentukan file konfigurasi (default) pada baris perintah ( ~/.ssh/configboleh-boleh saja kosong):

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

Anda dapat membuat alias untuk itu di ~/.bashrc :

alias ssh="ssh -F ~/.ssh/config"

Mulai ulang bash shell, maka Anda cukup ssh seperti ini:

$ ssh your_user@your_host
Rockallite
sumber
Lihat komentar saya di atas. if one supplies on command line -F, then the system wide config is ignored according to man pagedari bugzilla.mindrot.org/show_bug.cgi?id=1285 ; itu adalah opsi tetapi tidak benar-benar fitur yang diinginkan.
akostadinov