SSH - set env vairables oleh setiap koneksi - godaddy shared host

16

Masalah saya adalah, saya harus mengatur variabel env (seperti GIT_EXEC_PATH) di server. Saya membutuhkan variabel itu dengan setiap koneksi (jadi dengan bash dan dengan perintah jarak jauh baik). Saya berhasil mengatur variabel-variabel tersebut dengan bash dengan .bash_profile, tetapi saya memiliki masalah dengan perintah-perintah jarak jauh. Saya menemukan bahwa adalah mungkin untuk menulis perintah di ~ / .ssh / Authorized_key sebelum kunci rsa yang sebenarnya, tetapi saya tidak ingin selalu menulis di sana, saya memerlukan solusi permanen ... Saya menemukan bahwa ~ / .ssh File / rc dieksekusi oleh setiap login ssh, jadi saya meletakkan deklarasi variabel env saya di sana, tetapi tidak berhasil. Variabel diatur dalam file rc, tetapi setelah itu mereka menghilang. : S Mungkin file rc berjalan dalam subkulit: S Apakah ada cara untuk mendefinisikan variabel-variabel tersebut di bash dan dalam perintah-perintah jarak jauh tanpa duplikasi kode?

Edit:

Saya mengedit pertanyaan, karena server adalah host bersama yang di-godaddy, sehingga memiliki konfigurasi unik. File / etc / ssh / sshd_config dan file / etc / ssh / ssh_config kosong. Ada komentar di file-file itu, jika Anda penasaran saya dapat menyalinnya di sini.

  1. ~ / .Bash_profile bersumber (hanya dengan koneksi bash),
  2. the ~ / .bashrc tidak pernah bersumber,
  3. profil ~ /. tidak pernah bersumber,
  4. lingkungan ~ / .ssh / tidak pernah bersumber,
  5. ~ / .ssh / rc bersumber (dengan bash dan remote keduanya), tapi saya pikir ini disebut dalam subkulit, karena variabel-variabelnya menghilang.
  6. The ~ / .ssh / authorized_key bersumber dari setiap waktu, tapi saya harus menulis perintah sebelum setiap kunci rsa (jadi saya tidak ingin mengkonfigurasi dengan itu).

Ringkasan:

Saya dapat mengkonfigurasi bash dengan baik (dengan .bash_profile), tetapi saya tidak dapat mengkonfigurasi panggilan jarak jauh. Itulah masalahnya. Saya mencari file yang bersumber dari perintah bash dan remote.

Sebagai contoh:

Perintah git-upload-pack menemukan file exe, karena variabel env GIT_EXEC_PATH diatur, tetapi dengan remote: "git clone [email protected]: myrepo local / myrepo" server tidak menemukan perintah itu, karena GIT_EXEC_PATH tidak diatur.

Sunting2:

Menurut ini , dan printenv saya log: ~ / .ssh / rc berjalan di shell normal, bukan di subshell, jadi itu teka-teki mengapa variabel env tidak menempel ...

Saya membuat executable: ~ / logenv :

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

Dan letakkan ini di ~ / .ssh / rc :

export AAA=teszt
source ~/logenv

Dengan bash login & "source logenv" hasilnya adalah:

Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored

Dengan remote "ssh [email protected] 'exec ~ / logenv'" hasilnya adalah:

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465

Jadi file rc bersumber, tetapi setelah itu variabel disappering ...: S

inf3rno
sumber
Beberapa opsi di utas ini - stackoverflow.com/questions/216202/…
EightBitTony
"Tidak seperti / etc / sshrc, yang selalu diproses oleh Bourne shell (/ bin / sh), file rc Anda diproses oleh shell login normal akun Anda." - itu aneh karena sepertinya tidak akan bersumber dari cangkang normal: S
inf3rno

Jawaban:

12

Dengan asumsi Anda memiliki UsePAM yesdi /etc/ssh/sshd_config, dan dengan asumsi Anda ingin variabel lingkungan ini ditetapkan untuk setiap pengguna, Anda dapat memiliki variabel pam set lingkungan untuk Anda. Jika Anda memiliki variabel lingkungan yang ditentukan di dalamnya, /etc/gitenvAnda dapat menambahkan baris ini/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

Atau dengan mendeteksi file ini, Anda mungkin menemukan bahwa sudah ada pam_env.so yang digunakan, dan sudah ada file yang dapat Anda tambahkan. Berhati-hatilah, dan pastikan Anda telah menguji perubahan Anda sepenuhnya sebelum mengakhiri sesi ssh Anda, karena ketika Anda mengacaukan pam, Anda dapat sepenuhnya menghancurkan kemampuan Anda untuk masuk ke server Anda, jika Anda tidak hati-hati.

rebus
sumber
Saya memiliki akun host bersama godaddy, jadi saya dapat memodifikasi direktori ~ saja. (Ini memiliki sistem op centos.)
inf3rno
@ inf3rno tidak ada salahnya memilih jawaban yang bagus :) karena bagaimanapun solusi yang akan menyelesaikan masalah Anda dapat ditandai dengan cara yang berbeda.
Huygens
Baik. Ya, tetapi saya bukan satu-satunya yang dapat memilih ... :-)
inf3rno
Di Ubuntu, tampaknya yang /etc/environmentbersumber pam_env.sodari default
rcoup
4

Saya mengatur beberapa variabel lingkungan untuk koneksi SSH saya menggunakan ~/.ssh/environment. File dapat berisi variabel dalam formulir VAR=value, tidak perlu mengekspornya secara eksplisit.

Namun, file konfigurasi pengguna ini diabaikan secara default oleh proses server SSH kecuali opsi PermitUserEnvironment diatur ke ya. Oleh karena itu Anda perlu memastikan untuk mengedit / etc / sshd_config di server SSH untuk menambah atau memperbarui parameter ini:

PermitUserEnvironment yes

Anda perlu memuat ulang konfigurasi server SSH. Pada RHEL atau Suse Linux yang Anda lakukan (sebagai root)

/sbin/service sshd reload

(Mungkin ganti sshd dengan ssh jika tidak berhasil)

Di Ubuntu (menggunakan pemula) Anda lakukan

sudo reload ssh

Di Linux lain, Anda dapat mencoba (sebagai root)

/etc/init.d/sshd reload

(Ganti sshd dengan ssh atau openssh atau apa pun yang sesuai dengan skrip init server SSH)

Huygens
sumber
Terima kasih, tetapi saya tidak dapat menulis di direktori / etc, lingkungan ~ / .ssh / tidak bersumber.
inf3rno
2

Saya tidak lagi memiliki host yang dibagikan secara gaduh, jadi saya tidak dapat memeriksa apakah solusi yang diajukan valid. Ini akan tetap menjadi jawaban yang diterima, karena itu berhasil oleh saya ketika saya mengajukan pertanyaan. Jawaban lain mungkin juga berfungsi. Saya membiarkan komunitas memutuskan dengan upvotes.

Baik. Solusinya adalah bahwa tidak ada solusi pada host bersama godaddy. Saya mencoba semuanya, tetapi tidak ada yang berhasil, jadi saya memutuskan untuk tetap menggunakan ~ / .ssh / official_keys:

command="~/connect.sh" ssh-rsa AAAAB3NzaC...

Di ~ / connect.sh:

#!/bin/bash
if [ -f "${HOME}/.env_profile" ]; then
        source ~/.env_profile
fi;

if [ "x${SSH_ORIGINAL_COMMAND}x" == "xx" ]; then
        $SHELL --login
else
        eval "${SSH_ORIGINAL_COMMAND}"
fi;

Dan di ~ / .env_profile:

export PATH=$PATH:$HOME/bin:$HOME/git/libexec/git-core
export LD_LIBRARY_PATH=$HOME/git/lib
export GIT_EXEC_PATH=~/git/libexec/git-core
export GIT_TEMPLATE_DIR=~/git/share/git-core/templates

Jadi saya harus menyalin perintah = "..." ke setiap kunci rsa di otor_keys. Ini adalah duplikasi kode, tetapi saya tidak berpikir ada solusi lain pada host bersama godaddy.

inf3rno
sumber
1

Jika Anda menggunakan bashshell Anda, coba tambahkan pengaturan lingkungan ke .bashrc.

Periksa dulu apakah ini bisa dijalankan saat login, mungkin tidak karena file standar sering memiliki sesuatu seperti:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

di awal mereka. perubahan apa pun yang ingin Anda lakukan bahkan untuk login non-interaktif harus melewati pernyataan seperti itu.

.profileadalah tempat yang lebih umum untuk menempatkan konfigurasi seperti ini dan dihormati oleh sebagian besar shell (pada pengaturan Debian default itu adalah ~/.profilepanggilan ~/.bashrcdi tempat pertama). Anda mungkin perlu lebih hati-hati mengedit .profilejika seandainya itu ditafsirkan oleh shell lain - yaitu mencoba untuk menghindari menggunakan bashekstensi tertentu.

Edit

Jika Anda memiliki .bash_profileedit, alih-alih .profile: bash akan menggunakannya demi file yang lebih umum, dan Anda dapat menggunakan hal-hal khusus bash dengan aman di sana.

David Spillett
sumber
Baca bagian "Sunting", mohon. (. profil tidak berfungsi)
inf3rno
1

Anda dapat menggunakan perintah untuk semua pengguna / kunci tanpa menambahkan bagian perintah di otor_keys dengan menambahkan baris ini ke file sshd_config:

ForceCommand ~/connect.sh

Dalam hal ini saya sarankan Anda menggunakan jalur absolut untuk skrip

GARCIN David
sumber
0

Saya mengusulkan Anda pendekatan lain.

Anda mengatur file dengan deklarasi variabel lingkungan Anda dan kemudian Anda sumber setiap kali Anda memanggil perintah jarak jauh.

Contoh: Anda meletakkan variabel yang diperlukan di ~ / .my_var.rc dan kemudian untuk setiap perintah jarak jauh yang Anda lakukan ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

Jika ini cocok untuk Anda, Anda dapat memperbaiki konsep ini dan membuat skrip untuk kenyamanan. Jika Anda hanya membutuhkannya untuk perintah git, maka saya akan membuat skrip git.sh yang akan melakukan ini:

#!/bin/bash

source ~/.my_var.rc

git $@

Dengan asumsi skrip ini ada di direktori home Anda, Anda akan menyebutnya: ssh user@remote git.sh pull origin master

Catatan: ini adalah titik awal yang sederhana. Misalnya, itu tidak mendukung parameter dengan spasi.

Huygens
sumber
Saya dapat melakukan itu, tetapi konfigurasi itu bukan untuk saya sendiri, dan itu harus bekerja dengan git gui di mana perintah secara otomatis dihasilkan ...
inf3rno
Apakah Anda terhubung ke ssh remote menggunakan pengguna yang sama? Jika ya, maka file ~ / .my_var.rc akan spesifik untuk pengguna dan git.sh umum untuk semua. Jika tidak, maka Anda dapat menambahkan parameter tambahan ke git.sh yang dapat membantu Anda membedakan file .rc mana yang akan sumber (atau menggunakan IP tetap, Anda dapat menggunakan info env SSH_CLIENT untuk membedakan pengguna Anda). Perintah harus bekerja dengan git gui, panggilssh -Y user@remote git.sh gui
Huygens
Saya memerlukan pengaturan env yang sama untuk setiap pengguna. Saya tidak akan menambahkan bagian tambahan pada perintah, itu tidak masuk akal ...
inf3rno
Jika pengaturannya sama untuk semua pengguna maka jawabannya selesai dan Anda dapat mengabaikan komentar saya sebelumnya. Anda mungkin perlu meletakkan file .rc dan .sh di direktori yang umum / dapat diakses oleh semua pengguna.
Huygens
@ inf3rno jika Anda menginginkan lebih banyak jawaban, Anda harus berterima kasih kepada mereka yang mengajukan jawaban yang baik, bahkan jika tidak berlaku untuk kasus Anda karena informasi tidak ada dalam pertanyaan awal. Atau orang tidak akan repot mencoba.
Huygens
0

Ini tidak menjawab pertanyaan umum tentang PATHS, tetapi memungkinkan Anda untuk menggunakan repositori git pada server jauh yang tidak memiliki git di jalurnya, dan yang Anda tidak memiliki akses root. Solusi ini berasal dari halaman ini .

git clone -u relative/path/to/bin/git-upload-pack [email protected]:relative/path/to/remote_repository.git

Untuk juga mendorong dan mengambil:

git config remote.origin.receivepack relative/path/to/bin/git-receive-pack
git config remote.origin.uploadpack relative/path/to/bin/git-upload-pack
Ben
sumber
0

/ etc / profile akan bersumber pada setiap koneksi dengan ssh-client.

Jason416
sumber
Hanya untuk shell login.
RalfFriedl