Saya punya beberapa perintah penting yang perlu saya jalankan sebelum shell sh dimulai. Ini diperlukan untuk melewati perintah SSH di perintah SSH ( ssh host somecommand
) dan program lain yang menjalankan perintah.
Dalam saya, .profile
saya punya ini:
ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin
Namun, ini gagal:
W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin
Perhatikan opsi PATH yang hilang
Apa nama yang tepat untuk profil sh? Catatan: Saya tidak memiliki akses root dan tidak ingin ini diterapkan ke pengguna lain. Apakah ada cara lain untuk melakukan ini?
EDIT: Tampaknya /bin/sh
tautan ke bash
, yang tidak mengejutkan. Yang mengejutkan adalah bahwa profil saya masih diabaikan. Ada saran?
ssh name@host -t echo $PATH
.Jawaban:
Tampaknya perlu dicatat bahwa perintah yang Anda sebutkan dalam pertanyaan Anda
akan sangat berguna. Substitusi variabel untuk $ PATH dilakukan oleh shell lokal Anda, dan diteruskan ke ssh yang mengeksekusi gema pada sistem jarak jauh untuk mencetak konten variabel path, karena diperluas pada sistem lokal Anda. Ini adalah contoh saya melakukan sesuatu yang serupa antara Mac saya dan mesin Linux di jaringan saya:
Perhatikan bagaimana saya perlu menggunakan tanda kutip untuk mencegah shell lokal saya memperluas variabel.
sumber
~/.profile
hanya dieksekusi oleh shell login. Program yang memanggil shell memutuskan apakah shell akan menjadi shell login (dengan menempatkan-
sebagai karakter pertama dari argumen zeroth pada permintaan shell). Ini biasanya tidak dieksekusi ketika Anda masuk untuk menjalankan perintah tertentu.OpenSSH secara khusus memanggil shell login hanya jika Anda tidak menentukan perintah. Jadi, jika Anda menentukan perintah,
~/.profile
tidak akan dibaca.OpenSSH memungkinkan pengaturan variabel lingkungan di sisi server. Ini harus diaktifkan dalam konfigurasi server , dengan
PermitUserEnvironment
arahan. Variabel dapat diatur dalam file~/.ssh/environment
. Dengan asumsi Anda menggunakan otentikasi kunci publik, Anda juga dapat mengatur variabel per-kunci di~/.ssh/authorized_keys
: tambahkanenvironment="FOO=bar"
di awal baris yang relevan.Ssh juga mendukung pengiriman variabel lingkungan. Di OpenSSH, gunakan
SendEnv
arahan dalam~/.ssh/config
. Namun variabel lingkungan spesifik harus diaktifkan denganAcceptEnv
arahan dalam konfigurasi server, jadi ini mungkin tidak berhasil untuk Anda.Satu hal yang saya pikir selalu berfungsi (cukup aneh) selama Anda menggunakan otentikasi kunci publik adalah (ab) menggunakan
command=
opsi dalamauthorized_keys
file . Kunci dengancommand
opsi hanya baik untuk menjalankan perintah yang ditentukan; tetapi perintah dalamauthorized_keys
file berjalan dengan variabel lingkunganSSH_ORIGINAL_COMMAND
diatur ke perintah yang ditentukan pengguna. Variabel ini kosong jika pengguna tidak menentukan perintah dan karenanya mengharapkan shell interaktif. Jadi Anda dapat menggunakan sesuatu seperti ini di~/.ssh/authorized_keys
(tentu saja, itu tidak akan berlaku jika Anda tidak menggunakan kunci ini untuk otentikasi):Kemungkinan lain adalah menulis skrip wrapper di server. Sesuatu seperti yang berikut ini di
~/bin/ssh-wrapper
:Kemudian membuat link simbolik ke script ini disebut
rsync
,unison
, dll Lulus--rsync-path='bin/rsync'
padarsync
baris perintah, dan sebagainya untuk program lain. Sebagai alternatif, beberapa perintah memungkinkan Anda untuk menentukan potongan seluruh shell untuk dijalankan dari jarak jauh, yang memungkinkan Anda untuk membuat perintah lengkap: misalnya, dengan rsync, Anda dapat menggunakan--rsync-path='. ~/.profile; rsync'
.Ada jalan lain yang tergantung pada shell login Anda menjadi bash atau zsh. Bash selalu membaca
~/.bashrc
ketika dipanggil oleh rshd atau sshd, bahkan jika itu tidak interaktif (tetapi tidak jika itu disebut sebagaish
). Zsh selalu membaca~/.zshenv
.sumber
command=
diauthorized_keys
) bekerja transparan. Yang lain memerlukan shell atau opsi tertentu dalam konfigurasi server ssh. Setara dengan Mercurial--rsync-path
adalah--remotecmd
.command=
perintah lengkap yang sama seperti pada posting Anda superuser.com/a/207262/137762Biasanya saat login, bash membaca perintah dari:
~ / .bash_profile
~ / .bashrc
Dari halaman bash man:
sumber
Saya kehabisan waktu untuk menguji ini, tetapi melihat-lihat halaman manual yang saya temukan:
man bash: Ketika bash dimulai secara non-interaktif, untuk menjalankan skrip shell, misalnya, ia mencari variabel BASH_ENV di lingkungan, memperluas nilainya jika muncul di sana, dan menggunakan nilai yang diperluas sebagai nama file untuk baca dan eksekusi. Bash berperilaku seolah-olah perintah berikut dijalankan: if [-n "$ BASH_ENV"]; kemudian . "$ BASH_ENV"; tetapi nilai variabel PATH tidak digunakan untuk mencari nama file.
man ssh: ~ / .ssh / environment Berisi definisi tambahan untuk variabel lingkungan; lihat LINGKUNGAN, di atas.
Kombinasi tersebut menyarankan bagaimana Anda dapat menjalankan ssh. Profil Anda
Sayangnya server saya memiliki PermitUserEnvironment dengan nilai default tidak, yang membuat ini tidak bekerja untuk saya (dan seperti saya katakan saya tidak punya waktu untuk bermain lebih banyak dengannya).
sumber
(dihapus ... hanya dapat memiliki satu Hyperlink sebagai pengguna baru ~)
Memperbarui
Maaf, saya belum melihat bahwa ini tentang sesi non-interaktif, di mana tautan di atas tidak berlaku.
Jadi pertanyaannya adalah, mengapa tidak menjalankannya, meskipun shell Anda dimulai seperti ini.
Sumber
sumber