sh ssh üzerinde başlangıç ​​dosyaları


10

Herhangi bir sh kabuğu başlamadan önce yürütmem gereken bazı önemli komutlarım var. SSH komutlarını ( ssh host somecommand) ve komutları çalıştıran diğer programları SSH komutlarını iletmek için bu gereklidir .

Benim .profilebu var:

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

Ancak, bu başarısız olur:

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

Eksik PATH seçeneklerine dikkat edin

Sh profili için doğru ad nedir? Not: Kök erişimim yok ve bunun diğer kullanıcılara uygulanmasını istemiyorum. Bunu yapmanın başka bir yolu var mı?


EDIT: Bu şaşırtıcı değil, /bin/shbağlantıları görünüyor bash. Şaşırtıcı olan şey, profilimin hala göz ardı edilmesidir. Herhangi bir öneri?


1
Man sayfasında olanı tekrarlamak istemiyorum, bu yüzden 'INVOCATION' bölümünün altındaki bash man sayfasına bakın. En üste yakındır ve bilmeniz gereken her şeyi açıklar.
camh

Kullanmayı deneyebilirsiniz ssh name@host -t echo $PATH.
Gert

@Gert Çıkışı aynı
TheLQ

@camh Sizce adam sayfalarını kontrol etmediysem bu soruyu sorardım? Onları birçok kez + diğer yazıları okudum ama hangi ssh komutlarının ve diğer program komutlarının hangi aşamada yürütüldüğünden emin değilim
TheLQ

1
@TheLQ: Seni tanımıyorum, bu yüzden adam sayfasını kontrol edip etmeyeceğini bilmiyorum. Tek bildiğim cevapların tam orada olduğuydu, bu yüzden kelime kelimesini tekrarlamak yerine, ona işaret ettim. Daha spesifik bir işaretçi interaktif olmayan mermilere bakmaktır, çünkü ssh senaryosunuz budur. Man sayfasındaki bir şey net değilse, belki daha spesifik bir soru sorabilirsiniz.
camh

Yanıtlar:


8

Sorunuzda bahsettiğiniz komutun

ssh name@host echo $PATH

asla yararlı olmayacak. $ PATH değişken ikamesi yerel kabuğunuz tarafından yapılır ve yerel sisteminizde genişlediğinde yol değişkeninin içeriğini yazdırmak için uzak sistemde yankıyı çalıştıran ssh'ye geçirilir. İşte Mac'im ve ağımdaki bir Linux makinesi arasında benzer bir şey yapmamın bir örneği:

LibMBP:~ will$ echo $PATH
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren echo $PATH
will@warren's password: 
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren 'echo $PATH'
will@warren's password: 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LibMBP:~ will$ 

Yerel kabuğumun değişkeni genişletmesini önlemek için tırnak işaretlerini nasıl kullanmam gerektiğini unutmayın.


Windows Cygwin ülkesinde, tek tırnaklar Cygwin veya Komut isteminde hiçbir şey yapmaz. Garip bir şekilde, çift tırnak, PATH'ın Cygwin'deki yerel makineme tamamen genişlemesini sağlıyor. Yani ssh bana ne veriyordu benim yolum değildi, sunucunun
TheLQ

@TheLQ Tek tırnaklar bir unix isteminde (Cygwin dahil) gereklidir, ancak cmd isteminde herhangi bir tırnak işaretine ihtiyacınız yoktur.
Gilles 'SO- kötü olmayı kes

12

~/.profileyalnızca giriş kabukları tarafından yürütülür. Kabuğu çağıran program, kabuğun bir oturum açma kabuğu olup olmayacağına karar verir ( -kabuk çağrısında sıfırıncı bağımsız değişkenin ilk karakteri olarak a koyarak ). Belirli bir komutu yürütmek için oturum açtığınızda genellikle yürütülmez.

Özellikle OpenSSH, yalnızca bir komut belirtmezseniz bir oturum açma kabuğu çağırır. Yani bir komut belirtirseniz, ~/.profileokunmaz.

OpenSSH, sunucu tarafında ortam değişkenlerinin ayarlanmasına izin verir. Bu , yönerge ile birlikte sunucu yapılandırmasında etkinleştirilmelidir PermitUserEnvironment. Değişkenler dosyada ayarlanabilir ~/.ssh/environment. Ortak anahtar kimlik doğrulamasını kullandığınızı varsayarsak, anahtar başına değişkenleri de ayarlayabilirsiniz ~/.ssh/authorized_keys: environment="FOO=bar"ilgili satırın başına ekleyin .

Ssh ayrıca ortam değişkenlerinin gönderilmesini de destekler. OpenSSH'de, içindeki SendEnvyönergeyi kullanın ~/.ssh/config. Ancak, belirli ortam değişkeninin AcceptEnvsunucu yapılandırmasında bir yönerge ile etkinleştirilmesi gerekir , bu nedenle bu sizin için işe yaramayabilir.

Bence ortak anahtar kimlik doğrulaması kullandığınız sürece her zaman (yeterince garip) çalışır düşünüyorum (ab) dosyada command=seçeneği kullanmaktırauthorized_keys . Seçeneğe sahip bir anahtar commandyalnızca belirtilen komutu çalıştırmak için iyidir; ancak authorized_keysdosyadaki komut , ortam değişkeni SSH_ORIGINAL_COMMANDkullanıcının belirttiği komuta ayarlanmış olarak çalışır . Kullanıcı bir komut belirtmediyse ve bu nedenle etkileşimli bir kabuk bekleniyorsa bu değişken boştur. Böylece böyle bir şey kullanabilirsiniz ~/.ssh/authorized_keys(elbette, kimlik doğrulamak için bu anahtarı kullanmazsanız geçerli olmaz):

command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa 

Başka bir olasılık, sunucuya bir sarıcı komut dosyaları yazmaktır. Aşağıdaki gibi bir şey ~/bin/ssh-wrapper:

#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"

Sonra adı verilen bu senaryoya sembolik bağ oluşturur rsync, unisonvb Geçiş --rsync-path='bin/rsync'üzerinde rsynckomut satırı ve böylece diğer programlar için üzerinde. Alternatif olarak, bazı komutlar uzaktan çalıştırmak için bir bütün kabuk snippet'ini belirtmenize izin verir, bu da komutu kendi içinde bulundurmanızı sağlar: örneğin, rsync ile kullanabilirsiniz --rsync-path='. ~/.profile; rsync'.

Giriş kabuğunuzun bash veya zsh olmasına bağlı başka bir cadde var. Bash ~/.bashrc, etkileşimli olmasa bile rshd veya sshd tarafından çağrıldığında her zaman okur (ancak olarak adlandırılmasa bile sh). Zsh daima okur ~/.zshenv.

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

Diğer komutların yürüttüğü komutlar ne olacak? Bu durumda Mercurial kancalar olurdu. Mercurial, kanca bile çalışmayı düşünmek için yolda olmalı
TheLQ

Profilinizin etkileşimli olmayan ssh komutlarında çalışmasını sağlamak için belirttiğim tekniklerden herhangi birini kullanın. Bunlardan (biri command=içinde authorized_keys) şeffaf çalışır. Diğerleri, ssh sunucu yapılandırmasında belirli bir kabuk veya seçenek gerektirir. Mercurial eşdeğer --rsync-patholan --remotecmd.
Gilles 'SO- kötü olmayı kes

Bazılarınız, command=
yazıcınızdakiyle

1

Genellikle girişte, bash şu komutları okur:

~ / .bash_profile
~ / .bashrc

Bash man sayfasından:

~ / .bash_profile
Giriş kabukları için yürütülen kişisel başlatma dosyası

~ / .bashrc
Tek tek etkileşimli kabuk başlangıç ​​dosyası


0

Bunu test etmek için zamanım kalmadı, ancak bulduğum man sayfalarına bakıyorum:

man bash: bash etkileşimli olmayan bir şekilde başlatıldığında, örneğin bir kabuk komut dosyası çalıştırmak için, ortamdaki BASH_ENV değişkenini arar, orada görünürse değerini genişletir ve genişletilmiş değeri, bir dosyanın adı olarak kullanır. okuyun ve çalıştırın. Bash, aşağıdaki komut yerine getirilmiş gibi davranır: if [-n "$ BASH_ENV"]; sonra . "$ BASH_ENV"; fi ancak PATH değişkeninin değeri dosya adını aramak için kullanılmaz.

man ssh: ~ / .ssh / çevre Ortam değişkenleri için ek tanımlar içerir; yukarıdaki ÇEVRE bölümüne bakınız.

Kombinasyon, ssh'ın .profile dosyanızı nasıl çalıştırabileceğini önerir

Ne yazık ki sunucum PermitUserEnvironment no varsayılan değerine sahiptir, bu benim için işe yaramaz (ve daha önce söylediğim gibi onunla oynamak için daha fazla zamanım yok).


SSH'yi ortamdaki bazı ortam değişkenlerini açıkça belirterek çalıştırabilsem bile, diğer programlar komutları çağırdığında profilimin yürütülmesini düzeltmeye yardımcı olmaz
TheLQ

Örneğinizde tek yapmanız gereken ortam değişkenlerini ayarlamaktır, başka ne yapmak istersiniz?
kasterma

0

(kaldırıldı ... yeni kullanıcı olarak yalnızca bir Köprü olabilir ~)

Güncelleme

Üzgünüz, bunun yukarıdaki bağlantının geçerli olmadığı etkileşimli olmayan bir oturumla ilgili olduğunu görmedim.

Bash SH uyumluluk modunda başladığında, sh'nin tarihsel sürümlerinin başlatma davranışını mümkün olduğunca yakından taklit ederken POSIX® standardına da uymaya çalışır. Okunan profil dosyaları, bir giriş kabuğu ise / etc / profile ve ~ / .profile şeklindedir.

Giriş kabuğu değilse, ENV ortam değişkeni değerlendirilir ve sonuçta ortaya çıkan dosya adı başlangıç ​​dosyasının adı olarak alınır.

Başlangıç ​​dosyaları okunduktan sonra Bash, POSIX (r) uyumluluk moduna girer (çalıştırma için, başlatma için değil!).

Bash aşağıdaki durumlarda uyumluluk modunda başlar:

  • argv [0] içindeki temel dosya adı sh'dir: :! :)

Soru şu: Kabuğunuz böyle başlatılmış olsa bile neden yürütmüyor.

Kaynak


Baktım ama camh'a söylediğim gibi hangi sahne ssh komutlarının ve diğer program komutlarının yürütüldüğünü bilmiyorum. Zaten birçok kez man sayfalarını ve diğer kılavuzları okudum
TheLQ
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.