~ / .profile tidak dimuat saat menggunakan SSH (Ubuntu)

22

Diedit untuk mencerminkan masalah yang ingin saya pecahkan:

Saya perlu mengatur lingkungan ruby ​​saya sehingga saya dapat menggunakan via Capistrano.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

Saya meletakkan ini di ~ deploy / .profile, tetapi ketika saya ssh, mereka tidak dijalankan. Ide ide?

Saya menjalankan Ubuntu 12.04.


Pertanyaan aslinya adalah:

Ketika saya ssh ke akun lain di localhost, itu tidak memuat profil saya. Bagaimana saya bisa memaksa ssh untuk memuatnya? Saya menjalankan Ubuntu 12.04.

Charles R
sumber

Jawaban:

15

Anda dapat secara eksplisit menentukan bahwa Anda ingin memulai shell login interaktif:

 ssh user@host bash --login -i 

The "peran" dari ~/.profile(. Atau ~ / bash_profile) dan .bashrcuntuk ssh memiliki beberapa file lain, (lihat man sshuntuk detail):

~ / .ssh / lingkungan

Berisi definisi tambahan untuk variabel lingkungan; lihat LINGKUNGAN, di atas.

~ / .ssh / rc

Perintah dalam file ini dieksekusi oleh ssh ketika pengguna login, tepat sebelum shell (atau perintah) pengguna dimulai. Lihat halaman manual sshd (8) untuk informasi lebih lanjut.


sumber
"Anda mungkin" seringkali tidak benar, karena ssh sedang dijalankan oleh beberapa alat lain (pengiriman kontinu) dan perintah tidak dapat dengan mudah diubah.
Jan Hudec
6

.profilehanya dimuat untuk shell login, yang sesi ssh tidak (secara default). Jika Anda ingin sesuatu dijalankan saat startup untuk semua shell interaktif, masukkan saja .bashrc( .zshrcatau apa pun yang digunakan shell Anda).

Juga, jika Anda hanya ingin masuk ke akun lain di mesin lokal, ssh mungkin berlebihan. Anda mungkin ingin menggunakan suatau sesuatu sebagai gantinya.

qmega
sumber
3
Tampaknya .bashrctidak dimuat juga.
kenorb
Ini salah. Ini adalah shell login. Dari halaman manual: "Jika perintah ditentukan, itu dijalankan pada host jarak jauh alih-alih shell login."
mkj
~ / .zshenv bekerja untuk saya. unix.stackexchange.com/questions/4921/sh-startup-files-over-ssh
user91155
Ketika ssh diberikan perintah untuk menjalankan, itu default untuk tidak mengalokasikan tty dan kemudian shell juga tidak "interaktif".
Jan Hudec
4

Menggunakan bash akan menghasilkan bacaan ~/.bashrc. Berikut ini mungkin membantu dengan ksh dan sh (bash dalam mode sh), atau ketika Anda ~/.bashrctidak dieksekusi saat login.

Sshd berkonsultasi ~/.ssh/environment(periksa sshd_config (5) untuk izin) dan ~/.ssh/sshrcatau ~/.ssh/rc. Ini memberi kemungkinan untuk mengatur ENV=~/.profileatau BASH_ENV=~/.profiledanSSH_LOGIN=Y

Di ~/.profileSaya memiliki tata letak berikut (Ganti ENVdengan BASH_ENVsaat menggunakan bash):


if [[ -n $SSH_LOGIN || -z $ENV ]]; then
     # Put here login initialization code
     unset SSH_LOGIN
     ENV=~/.profile
fi
 # Put here code thats get executed with each ksh/sh invocation

eremmel
sumber
0

Bash ~/.profilehanya membaca ketika itu adalah shell login dan ~/.bash.bashrchanya jika ia memiliki terminal, yang keduanya tidak benar secara default ketika menjalankan perintah dengan ssh. Namun, ada beberapa opsi lain untuk mengatur lingkungan, di server, semua sayangnya tergantung pada pengaturan sistem:

  • Zsh membaca ~/.zshenvbahkan dalam kasus ini; tidak ada file konfigurasi yang sesuai untuk bash.
  • Jika PermitUserEnvironmentopsi ini aktif /etc/sshd_config, ssh akan membaca ~/.ssh/environment. Sayangnya opsi ini tidak aktif.
  • Jika pam_env.sodipanggil dengan user_readenv=1in /etc/pam.d/sshd, ia akan membaca ~/.pam_environment. Walaupun tidak merupakan modul default, modul ini disebut demikian setidaknya di Ubuntu .
  • Jika semuanya gagal, Anda dapat menempatkan command=arahan di file kunci yang sah memanggil skrip pembungkus yang menetapkan lingkungan dan mengeksekusi $SSH_ORIGINAL_COMMANDdi akhir (saya perintah adalah satu untuk shell, jadi eval sesuai di sini, tapi saya tidak yakin) .
Jan Hudec
sumber
0

Anda mungkin memiliki ~/.bash_profile, yang menimpa ~/.profile.

Mehrdad
sumber