Saya menentukan jalur ke perintah saya di file / etc / profile :
export PATH=$PATH:/usr/app/cpn/bin
Perintah saya terletak di:
$ which ydisplay
/usr/app/cpn/bin/ydisplay
Jadi, ketika saya melakukan output "echo $ PATH" terlihat seperti:
$ echo $PATH
...:/usr/app/cpn/bin
Dan semuanya baik-baik saja, tetapi ketika saya mencoba meluncurkan perintah saya melalui SSH saya mendapatkan kesalahan:
$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found
Tapi jalan saya masih ada:
$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin
Tolong jelaskan saya mengapa Bash tidak dapat menemukan ydisplay selama sesi SSH dan cara mengkonfigurasi SSH dengan benar untuk menghindari masalah ini.
Terlebih lagi, jika saya menetapkan $ PATH di file lokal .bashrc di pengguna saat ini semua berfungsi dengan benar. Tapi saya ingin memodifikasi hanya satu file, bukan menentukan banyak file untuk setiap pengguna. Inilah sebabnya saya bertanya.
ydisplay
pekerjaan? apakahssh 127.0.0.1 /usr/app/cpn/bin/ydisplay
bekerja?ssh 127.0.0.1 echo $PATH
tidak melakukan apa yang Anda pikirkan: shell memperluas $ PATH bahkan sebelum ssh dieksekusi, sehingga tidak membuktikan atau menyangkal apa pun.Jawaban:
tl; dr
Menjalankan
ssh 127.0.0.1 ydisplay
sumber~/.bashrc
daripada/etc/profile
. Ubah jalur Anda~/.bashrc
sebagai gantinya.detail
Satu-satunya waktu
/etc/profile
dibaca adalah ketika shell Anda adalah "shell login".Dari Manual Referensi Bash :
Tetapi ketika Anda menjalankan
ssh 127.0.0.1 ydisplay
,bash
tidak dimulai sebagai shell login. Namun ia membaca file startup yang berbeda. The Pedoman Bash Reference mengatakan:Jadi, Anda harus memasukkan
PATH
pengaturan Anda~/.bashrc
.Pada sebagian besar sistem,
~/.bash_profile
sumber~/.bashrc
, sehingga Anda dapat menempatkan pengaturan Anda hanya~/.bashrc
daripada meletakkannya di kedua file.Tidak ada cara standar untuk mengubah pengaturan untuk semua pengguna, tetapi kebanyakan sistem memiliki
/etc/bashrc
,/etc/bash.bashrc
, atau serupa.Gagal itu, atur
pam_env
dan masukkanPATH
pengaturan/etc/environment
.Lihat juga:
sumber
Secara historis, file profil (
/etc/profile
dan~/.profile
) dipanggil ketika Anda masuk (pada konsol teks, apa lagi?) Dan melayani banyak tujuan:stty
.).Semua tujuan ini tidak diidentifikasi sebagai terpisah sampai nanti. Karena skrip profil dapat melakukan hal-hal yang hanya masuk akal dalam sesi interaktif (interaksi terminal, memulai program lain), ketika pemanggilan shell jarak jauh ( rsh ) diperkenalkan, merek rsh memutuskan untuk tidak memanggil shell jarak jauh sebagai shell login, sehingga skrip profil tidak dieksekusi. (Beberapa versi
rshd
memiliki opsi untuk menjalankan shell jauh sebagai shell login.) Ssh menyalin perilaku ini untuk menjadi pengganti drop-in untuk rsh.Jika Anda ingin skrip profil Anda dieksekusi, Anda dapat menjalankannya secara eksplisit.
Perhatikan perintah
.
untuk memuat skrip profil di dalam shell: mereka adalah perintah yang akan dieksekusi di dalam shell itu, bukan program eksternal.Jika Anda ingin mengatur variabel lingkungan secara global untuk semua pengguna, ada metode lain pada banyak sistem: alih-alih mendefinisikannya
/etc/profile
, tentukan dalam/etc/environment
. File ini dibaca melaluipam_env
modul; kebanyakan distribusi Linux diatur untuk membacanya.Jika shell login Anda adalah bash, ada kemungkinan lebih lanjut. Biasanya, Anda tidak boleh mengatur variabel lingkungan di
.bashrc
(karena mereka tidak akan diatur dalam sesi X kecuali jika Anda pergi melalui terminal dengan shell interaktif, karena mereka tidak akan diatur jika Anda masuk secara interaktif pada konsol teks atau lebih ssh, karena mereka akan mengesampingkan pengaturan khusus jika Anda menjalankan shell di dalam program lain). Namun, bash memiliki fitur aneh yang tidak pernah saya mengerti: bash dibaca~/.bashrc
dalam dua keadaan yang tidak terkait:rshd
atausshd
.Ketika Anda menjalankan perintah di atas ssh, Anda berada dalam kasus kedua. Anda dapat mengatur agar profil Anda dibaca dengan membaca
/etc/profile
dan.profile
dari.bashrc
. Sertakan kode berikut dalam~/.bashrc
:sumber