SSH - Her bağlantıya göre env değerlerini ayarla - godaddy


16

Benim sorunum, bir sunucuda env değişkenleri (GIT_EXEC_PATH gibi) ayarlamak zorunda olmasıdır. Değişkenleri her bağlantıya ihtiyacım var (bash ve uzak komutlar ile). Bu değişkenleri bash ile .bash_profile ile ayarlamayı başardım, ancak uzak komutlarda sorun yaşıyorum. Gerçek rsa anahtarından önce ~ / .ssh / authority_keys komutları yazmanın mümkün olduğunu gördüm, ancak her zaman orada yazmak istemiyorum, kalıcı bir çözüme ihtiyacım var ... ~ / .ssh / rc dosyası her ssh girişi tarafından yürütülür, bu yüzden env değişken bildirimlerimi oraya koydum, ancak işe yaramadı. Değişkenler rc dosyasında ayarlanır, ancak bundan sonra kaybolurlar. : S Belki rc dosyası bir alt kabukta çalışır: S Bu değişkenleri bash ve uzak komutlarda kod çoğaltması olmadan tanımlamanın bir yolu var mı?

Düzenle:

Soruyu düzenledim, çünkü sunucu bir godaddy paylaşılan ana bilgisayarı olduğundan benzersiz bir yapılandırmaya sahip. / Etc / ssh / sshd_config ve / etc / ssh / ssh_config dosyaları boş. Bu dosyalarda yorumlar var, merak ediyorsanız buraya kopyalayabilirim.

  1. ~ / .Bash_profile kaynaklanır (yalnızca bash bağlantıları ile),
  2. ~ / .bashrc asla kaynaklanmaz,
  3. ~ / .profil asla kaynaklanmaz,
  4. ~ / .ssh / ortamı hiçbir zaman kaynaklanmaz,
  5. ~ / .ssh / rc kaynaklanır (bash ve uzaktan her ikisi tarafından), ancak değişkenlerin kaybolması nedeniyle alt kabukta çağrıldığını düşünüyorum.
  6. ~ / .Ssh / yetkili_anahtarları her zaman kaynaklanır, ancak her rsa anahtarından önce komutları yazmak zorundayım (böylece bununla yapılandırmak istemiyorum).

Özet:

Bash'i (.bash_profile ile) iyi yapılandırabilirim, ancak uzak aramaları yapılandıramıyorum. İşte sorun bu. Hem bash hem de uzak komutlar tarafından sağlanan bir dosya arıyorum.

Örneğin:

Git-upload-pack komutu exe dosyasını bulur, çünkü GIT_EXEC_PATH env değişkeni ayarlanmıştır, ancak remote: "git clone user@domain.com: myrepo local / myrepo" sunucu bu komutu bulamaz, çünkü GIT_EXEC_PATH ayarlanmadı.

Edit2:

Göre bu ve benim printenv günlükleri: env değişkenleri devreye girmiyor neden bir bilmece böylece ~ / .ssh / rc değil alt kabukta normal kabukta çalışıyor ...

Yürütülebilir bir dosya oluşturdum: ~ / logenv :

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

Ve bunu ~ / .ssh / rc dizinine koyun :

export AAA=teszt
source ~/logenv

Bash login & "source logenv" sonucu:

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

Uzaktan "ssh myuser@domain.com 'exec ~ / logenv'" sonucu:

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

Bu yüzden rc dosyası kaynaklı, ancak bundan sonra değişkenler hayal kırıklığı yaratıyor ...: S


Bu başlıktaki bazı seçenekler - stackoverflow.com/questions/216202/…
EightBitTony

"Her zaman Bourne kabuğu (/ bin / sh) tarafından işlenen / etc / sshrc'den farklı olarak, rc dosyanız hesabınızın normal giriş kabuğu tarafından işlenir." - bu garip çünkü normal kabuktan kaynaklanmıyor gibi görünüyor: S
inf3rno

Yanıtlar:


12

Sahip varsayarsak UsePAM yesiçinde /etc/ssh/sshd_configve her kullanıcı için belirlenen bu ortam değişkenleri, sizin için Pam seti ortam değişkenleri olabilir istiyorum varsayarak. Eğer tanımlanmış ortam değişkenleriniz /etc/gitenvvarsa bu satırı/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

Veya bu dosyayı inceleyerek, zaten bir pam_env.so kullanıldığını ve zaten ekleyebileceğiniz bir dosya olduğunu görebilirsiniz. Sadece dikkatli olun ve ssh oturumunuzu sonlandırmadan önce değişikliklerinizi iyice test ettiğinizden emin olun, pam ile uğraşırken dikkatli değilseniz sunucunuza giriş yapma yeteneğinizi tamamen kırabilirsiniz.


Bir godaddy paylaşılan ana bilgisayar hesabım var, bu yüzden sadece ~ dizini değiştirebilirsiniz. (Bu CentOS op sistemine sahiptir.)
inf3rno

@ inf3rno sorununuzu çözecek çözüm farklı bir yolla işaretlenebileceğinden, iyi cevabı açmaya :) zarar vermez.
Huygens

Tamam. Yapacağım, ama oy verebilecek tek kişi ben değilim ... :-)
inf3rno 16:30 '

Ubuntu'da, varsayılan /etc/environmentolarak kaynaklanıyor gibi görünüyorpam_env.so
rcoup

4

Kullanarak SSH bağlantılarım için bazı ortam değişkeni ayarlıyorum ~/.ssh/environment. Dosya formda değişken içerebilir VAR=value, bunları açıkça dışa aktarmaya gerek yoktur.

Ancak, PermitUserEnvironment seçeneği yes olarak ayarlanmamışsa, bu kullanıcı yapılandırma dosyası SSH sunucusu işlemi tarafından varsayılan olarak yoksayılır. Bu nedenle, bu parametreyi eklemek veya güncellemek için SSH sunucusunda / etc / sshd_config dosyasını düzenlediğinizden emin olmanız gerekir:

PermitUserEnvironment yes

SSH sunucusu yapılandırmasını yeniden yüklemeniz gerekir. RHEL veya Suse Linux'ta (root olarak)

/sbin/service sshd reload

(Çalışmıyorsa sshd'yi ssh ile değiştirin)

Ubuntu'da (uptart kullanarak)

sudo reload ssh

Diğer herhangi bir Linux'ta (root olarak) deneyebilirsiniz

/etc/init.d/sshd reload

(Sshd'yi ssh veya openssh ile veya SSH sunucusu başlatma komut dosyasına karşılık gelen her şeyle değiştirin)


Teşekkürler, ama / etc dizininde yazamıyorum, ~ / .ssh / ortam kaynaklı değil.
inf3rno

2

Artık bir godaddy paylaşılan ana bilgisayarım yok, bu yüzden önerilen çözümlerin geçerli olup olmadığını kontrol edemiyorum. Soruyu sorduğumda benim için çalıştığı için bu kabul edilen cevap olarak kalacak. Diğer cevaplar da işe yarayabilir. Topluluğun buna oylarla karar vermesine izin verdim.

Tamam. Çözüm, bir godaddy paylaşımlı ana bilgisayarda çözüm bulunmamasıdır. Her şeyi denedim, ama hiçbir şey çalışmıyor, bu yüzden ~ / .ssh / yetkili_anahtarları ile kalmaya karar verdim:

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

~ / Connect.sh içinde:

#!/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;

Ve ~ / .env_profile içinde:

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

Bu yüzden command_ "..." komutunu yetkili_anahtarlardaki her rsa anahtarına kopyalamalıyım. Bu kod çoğaltma, ancak bir godaddy paylaşılan ana bilgisayarlarda başka bir çözüm olduğunu sanmıyorum.


1

bashKabuğunuz olarak kullanıyorsanız , ortam ayarlarını eklemeyi deneyin .bashrc.

Öncelikle bunun girişte çalışıp çalışmadığını kontrol edin, standart dosyalar genellikle şuna benzer:

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

onların başında. etkileşimli olmayan girişler için bile yapmak istediğiniz herhangi bir değişikliğin böyle bir ifadenin üzerine çıkması gerekir.

.profileböyle bir konfigürasyon koymak için daha genel bir yerdir ve çoğu kabuk tarafından saygı duyulur (varsayılan bir Debian kurulumunda ilk etapta ~/.profilearamalar yapılır ~/.bashrc). .profileBaşka mermiler tarafından yorumlanması durumunda daha dikkatli bir düzenleme yapmanız gerekebilir - örn bash. Belirli uzantıları kullanmaktan kaçının .

Düzenle

.bash_profileBunun yerine bir düzenlemeniz varsa .profile: bash onu daha genel dosya lehine kullanacak ve orada bash'a özgü şeyleri güvenle kullanabilirsiniz.


"Düzenle" bölümünü okuyun pls. (.profile çalışmıyor)
inf3rno

1

Bu satırı sshd_config dosyasına ekleyerek, yetkili_anahtarlardaki komut bölümünü eklemeden tüm kullanıcılar / anahtar için komutu kullanabilirsiniz:

ForceCommand ~/connect.sh

Bu durumda komut dosyası için mutlak bir yol kullanmanızı öneririm


0

Sana başka bir yaklaşım öneriyorum.

Ortam değişkeninizin bildirimi ile bir dosya oluşturursunuz ve daha sonra uzak komut her çağırışınızda kaynak oluşturursunuz.

Örnek: ~ / .my_var.rc dosyasına gerekli değişkenleri ve sonra yaptığınız her uzaktan komut için ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

Bu size uygunsa, bu konsepti iyileştirebilir ve kolaylık sağlamak için komut dosyası oluşturabilirsiniz. Sadece git komutları için ihtiyacınız varsa, ben bunu yapacak bir git.sh komut dosyaları oluşturmak istiyorum:

#!/bin/bash

source ~/.my_var.rc

git $@

Bu komut dosyasının ana dizininizde olduğunu varsayarsak, şöyle adlandırırsınız: ssh user@remote git.sh pull origin master

Not: Bu basit bir başlangıç ​​noktasıdır. Örneğin, boşluklu parametreleri desteklemez.


Ben ofc yapabilirim, ama bu yapılandırma sadece benim için değil ve komutların otomatik olarak oluşturulduğu git gui ile çalışmalıdır ...
inf3rno

Ssh uzaktan kumandasına aynı kullanıcıyı kullanarak bağlanıyor musunuz? Evetse, ~ / .my_var.rc dosyası kullanıcıya özgü ve git.sh herkes için ortak olacaktır. Hayırsa, git.sh dosyasına hangi .rc dosyasının kaynağını ayırt etmenize yardımcı olabilecek ekstra bir parametre ekleyebilirsiniz (veya sabit IP kullanarak, kullanıcılarınızı farklılaştırmak için SSH_CLIENT env bilgisini kullanabilirsiniz). Komut git gui ile çalışmalı, arayınssh -Y user@remote git.sh gui
Huygens

Her kullanıcı için aynı env ayarlarına ihtiyacım var. Komutlara fazladan parça eklemeyeceğim, saçma ...
inf3rno

Peki o zaman ayarlar tüm kullanıcılar için aynıysa, cevap tamamlandı ve önceki yorumumu göz ardı edebilirsiniz. Muhtemelen .rc ve .sh dosyalarını tüm kullanıcılar için ortak olan / erişilebilen bir dizine koymanız gerekir.
Huygens

@ inf3rno Daha fazla yanıt istiyorsanız, orijinal soruda bilgi eksik olduğu için, davanız için geçerli olmasa bile, iyi yanıtlar önerenlere teşekkür etmelisiniz. Ya da insanlar denemeye zahmet etmezler.
Huygens

0

Bu, PATHS ile ilgili genel soruyu yanıtlamaz, ancak yolunda git bulunmayan ve kök erişimine sahip olmadığınız uzak bir sunucuda git deposunu kullanmanıza izin verir. Bu çözüm bu sayfadan geliyor .

git clone -u relative/path/to/bin/git-upload-pack username@host.com:relative/path/to/remote_repository.git

Ayrıca itmek ve getirmek için:

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

0

/ etc / profile, ssh-client ile yapılan her bağlantıda sağlanacaktır.


Sadece giriş kabukları için.
RalfFriedl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.