Saya memiliki perintah yang berjalan dengan baik jika saya ssh ke mesin dan menjalankannya, tetapi gagal ketika saya mencoba menjalankannya menggunakan perintah ssh jarak jauh seperti:
ssh user@IP <command>
Membandingkan output "env" menggunakan kedua metode resutl di lingkungan yang berbeda. Ketika saya masuk secara manual ke mesin dan menjalankan env, saya mendapatkan lebih banyak variabel lingkungan kemudian ketika saya menjalankan:
ssh user@IP "env"
Ada yang tahu kenapa?
ssh
environment-variables
Tom Feiner
sumber
sumber
bash
bukan bahasa scripting?Jawaban:
Ada berbagai jenis kerang. Shell eksekusi perintah SSH adalah shell non-interaktif, sedangkan shell normal Anda adalah shell login atau shell interaktif. Deskripsi berikut, dari man bash:
sumber
ssh user@host "bash --login -c 'command arg1 ...'"
akan membuat remote shell mengatur lingkungan login. Bagian yang Anda kutip tidak menyebutkan--login
tetapi akan mudah untuk mengabaikan ini.ssh <ssh options> <IP> bash --login my_script.sh
menjalankan skrip pada mesin jarak jauh, bekerja dengan baik dan memungkinkan saya untuk berhasil menggunakan vars lokal sepertiJAVA_HOME
Bagaimana dengan sumber profil sebelum menjalankan perintah?
ssh user@host "source /etc/profile; /path/script.sh"
Anda mungkin merasa terbaik untuk mengubah itu untuk
~/.bash_profile
,~/.bashrc
, atau apa pun.(Seperti di sini (linuxquestions.org) )
sumber
Lingkungan Shell tidak memuat saat menjalankan perintah ssh jarak jauh. Anda dapat mengedit file lingkungan ssh:
Formatnya adalah:
Juga, periksa
sshd
konfigurasi untukPermitUserEnvironment=yes
opsi.sumber
Saya memiliki masalah yang sama, tetapi pada akhirnya saya menemukan bahwa ~ / .bashrc yang saya butuhkan.
Namun, di Ubuntu, saya harus mengomentari baris yang berhenti memproses ~ / .bashrc:
sumber
/etc/bash.bashrc
.Saya menemukan resolusi mudah untuk masalah ini adalah menambahkan sumber / etc / profile ke bagian atas file script.sh yang saya coba jalankan pada sistem target. Pada sistem di sini, ini menyebabkan variabel lingkungan yang diperlukan oleh script.sh dikonfigurasikan seolah-olah berjalan dari shell login.
Dalam salah satu tanggapan sebelumnya disarankan bahwa ~ / .bashr_profile dll ... digunakan. Saya tidak menghabiskan banyak waktu untuk hal ini tetapi, masalah dengan ini adalah jika Anda ssh ke pengguna yang berbeda pada sistem target daripada shell pada sistem sumber dari mana Anda masuk nampak bagi saya bahwa ini menyebabkan pengguna sistem sumber nama yang akan digunakan untuk ~.
sumber
Cukup ekspor variabel lingkungan yang Anda inginkan di atas centang untuk shell non-interaktif di ~ / .bashrc.
sumber