Di mana biasanya $ BASH_ENV ditetapkan?


19

Saya memiliki dua server Linux yang harus dikonfigurasi secara identik, namun perintah ssh ke salah satunya gagal untuk perintah yang memerlukan jalur yang ditentukan dalam ~ / .bashrc. Sebagai contoh, saya dapat menggunakan perintah seperti pwdkeduanya secara interaktif dan melalui ssh, tetapi jika saya mencoba menjalankan program yang terletak di folder bin aplikasi, itu hanya bekerja di shell interaktif untuk salah satu server.

File / etc / profile dan / etc / environment pada kedua server identik, namun $ BASH_ENV diatur ke ~ / .bashrc pada server yang berfungsi dengan baik. Saya ingin menetapkan $ BASH_ENV pada server yang tidak berfungsi, tapi saya lebih suka mengaturnya di lokasi yang sama seperti yang diatur di server yang berfungsi. Apa saja tempat yang akan dijalankan Linux pada saat login non-interaktif, seperti perintah ssh dari komputer lain?

sunting: Baris di / etc / passwd untuk pengguna menentukan / bin / bash di kedua server. File ~ / .bash_profile untuk kedua server identik, dan berisi if [ -f ~/.bashrc ]; then . ~/.bashrc; fi. Satu-satunya perbedaan antara sistem adalah $ BASH_ENV adalah string nol pada server yang tidak berfungsi, dan saya tidak dapat menemukan di mana pengaturannya di server yang berfungsi.

edit 2: File ~ / .ssh / environment di kedua server memiliki BASH_ENV = ~ / .bashrc


1
Apakah / etc / passwd identik di kedua server? Jika bash disebut sebagai "/ bin / sh" bukan "/ bin / bash" itu tidak akan membaca file bashrc (hanya file profil).
freiheit

Tidak identik, tetapi pengguna yang saya kirim perintah memiliki baris yang sama di / etc / passwd pada kedua sistem.
Basil

Dan bagaimana dengan ~ / .profile dan ~ / .bash_profile?
freiheit

keduanya identik dan keduanya mengandungif [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Basil

Anda telah memverifikasi bahwa /etc/bashrc dan /etc/profile.d/* identik? ~ / .bash_login? /etc/pam.d/*? /etc/security/pam_env.conf?
freiheit

Jawaban:


21

BASH_ENVhanya akan diatur melalui lingkungan, atau skrip lain yang bersumber selama inisialisasi. Untuk shell non-interaktif, itu hanya akan mencoba untuk mencari file tambahan jika shell itu juga shell login. (dalam hal ini akan membaca ~/.bash_profile,, ~/.bash_logindan ~/.profile... tetapi jika itu melakukan itu, Anda tidak akan mengalami masalah)

Tempat pertama untuk melihat adalah lingkungan di mana subkulit dipanggil.

  • BASH_ENVVariabel yang diekspor akan dilewati. Perlu diingat bahwa ini dapat dikubur dalam file bersumber.
  • Itu bisa dimasukkan sebagai parameter pada baris yang sama memanggil skrip, yaitu BASH_ENV=blah /path/to/somecommand.sh. Ini menonjol seperti jempol sehingga Anda mungkin akan menangkapnya.

Jika diset setelah Anda masuk tetapi Anda tidak tahu di mana, Anda mungkin perlu melihat apa yang bertanggung jawab untuk membangun lingkungan login.

  • Semua file biasa yang bersumber dari shell login. man bashuntuk daftar lengkap.

  • PAM : Seperti yang disarankan freiheit dalam komentar, periksa /etc/security/pam_env.conf, dan file tambahan apa pun yang dirujuk oleh pam_env.so. Modul PAM lainnya juga bisa bertanggung jawab, tetapi jika konfigurasi PAM Anda terlihat sama, mungkin ini bukan masalahnya.

  • sshd : Ini akan memindai file-file berikut, dengan urutan:

    • ~/.ssh/environment(sebelum mengubah ke direktori home; hanya jika PermitUserEnvironmentdiaktifkan di sshd_config)
    • ~/.ssh/rc (setelah berganti ke direktori home; selalu)
    • /etc/ssh/sshrc(jika ~/.ssh/rctidak ada)

Catatan: sshdjuga akan memindai environment=valuebaris dalam file kunci resmi pengguna (jika PermitUserEnvironmentdiaktifkan), tetapi tidak jelas dari halaman manual di mana langkah itu jatuh dalam urutan di atas.


Saya menemukan perbedaan! PermitUserEnvironment yesdiatur di / etc / ssh / sshd_config di server yang berfungsi, tetapi bukan yang bermasalah. Saya mengubahnya, tetapi saya baru saja menguji sebuah perintah dan tidak berhasil lagi. Apakah file ini diuraikan setiap kali saya mencoba ssh? Saya tidak punya ~ / .ssh / rc untuk pengguna yang sedang saya kerjakan, dan tidak ada file / etc / ssh / sshrc di kedua sistem.
Basil

Oh, saya pikir saya perlu menginisialisasi ulang ssh? /etc/init.d/sshd?
Basil

@ Basil Ya, Anda harus memulai ulang sshd. Ini juga berarti mungkin ada file di server yang berfungsi (periksa daftar yang saya berikan untuk Anda sshd) yang mengatur lingkungan.
Andrew B

Ya, itu adalah bagian yang membuat frustrasi - semua yang saya butuhkan diatur dalam .bashrc, yang tidak dijalankan :) Terima kasih banyak atas bantuan Anda - Saya menjadwalkan perubahan untuk menginisialisasi ulang SSH dan saya akan melaporkan kembali. Saya menganggap itu akan berhasil.
Basil

Saya baru saja selesai menginisialisasi ulang SSH dan perintah SSH non-interaktif saya sekarang berfungsi! Terima kasih banyak atas bantuan Anda, saya belum pernah menemukan bidang itu sendiri.
Basil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.