Bash, $ PATH doğru belirtilse bile neden komut bulamıyor?


9

/ Etc / profile dosyasındaki komutumun yolunu belirtiyorum :

export PATH=$PATH:/usr/app/cpn/bin

Komutum şurada bulunur:

$ which ydisplay 
/usr/app/cpn/bin/ydisplay

Yani, "echo $ PATH" çıktısını yaparken şöyle görünür:

$ echo $PATH
...:/usr/app/cpn/bin

Ve her şey yolunda, ama SSH aracılığıyla komutumu başlatmaya çalıştığımda hata alıyorum:

$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found

Ama yolum hala mevcut:

$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin

Lütfen Bash'in SSH oturumu sırasında neden ydisplay bulamadığını ve bu sorunu önlemek için SSH'yi nasıl doğru şekilde yapılandıracağımı açıklayın.

Daha fazla, eğer geçerli kullanıcı .bashrc yerel dosyada $ PATH belirtirseniz tüm doğru çalışır. Ancak her kullanıcı için çok sayıda dosya belirtmek yerine yalnızca bir dosyayı değiştirmek istiyorum. Bu yüzden soruyorum.


1
sadece koşmak ydisplayişe yarıyor mu? does ssh 127.0.0.1 /usr/app/cpn/bin/ydisplayişi?
Bananguin

@ user1129682 Evet, tam belirtilen ad ile ydisplay çalışıyor ve sadece ydisplay çalışıyor
SIGSEGV

Oturum açmadıysanız (uzak oturumunuz yoksa), ancak .bashrc / .profile dosyalarınız yürütülmediği için ortam değişkenlerine aynı şekilde uzaktan erişemezsiniz. Geçerli oturum için değişkenleri ayarlamaktan sorumlu olmalarının nedeni budur.
mnmnc

14
Sadece bir yan not: ssh 127.0.0.1 echo $PATHdüşündüğünüzü yapmaz: kabuk, ssh yürütülmeden önce $ PATH'ı genişletir, bu da hiçbir şeyi kanıtlamaz veya çürütmez.
Ulrich Schwarz

2
bu stackoverflow soru biraz yardımcı olabilir
bsd

Yanıtlar:


5

tl; Dr.

Bunun yerine çalışan ssh 127.0.0.1 ydisplaykaynaklar . Bunun yerine yolunuzu değiştirin .~/.bashrc/etc/profile~/.bashrc

ayrıntılar

/etc/profileOkunan tek zaman kabuğunuzun bir "giriş kabuğu" olduğu zamandır .

Gönderen Bash Reference Manual :

Bash bir giriş kabuğu olarak çağrıldığında, ... önce / etc / profile dosyasındaki komutları okur ve yürütür

Ancak çalıştırdığınızda ssh 127.0.0.1 ydisplay, bashbir giriş kabuğu olarak başlatılmaz. Yine de farklı bir başlangıç ​​dosyası okur. Bash diyor ki:

... tarafından ... sshd. ... komutları okur ve yürütür.~/.bashrc

Bu yüzden PATHayarlarınızı koymalısınız ~/.bashrc.

Çoğu sistemde, ~/.bash_profilekaynaklarda ~/.bashrcayarlarınızı ~/.bashrcher iki dosyaya koymak yerine yalnızca koyabilirsiniz .

Orada tüm kullanıcılar için ayarını değiştirmek için standart bir yolu, ama çoğu sistemleri var /etc/bashrc, /etc/bash.bashrcveya benzeri.

Kurmak, Bu olmazsa pam_envve koyun PATHayarı /etc/environment.

Ayrıca bakınız:


1

Tarihsel olarak, giriş yaptığınızda (metin konsolunda başka ne var?) Ve birçok amaca hizmet ettiğinizde profil dosyaları ( /etc/profileve ~/.profile) çağrıldı:

  • Oturum için ortam değişkenlerini ve diğer parametreleri (ör. Umask) ayarlayın.
  • Oturumun başında ek programlar çalıştırın (örn. E-posta bildirimi).
  • Kabuktan farklıysa (örneğin başka bir kabuk veya X Penceresi) oturum için programı çalıştırın.
  • Terminal parametrelerini ayarlayın (örn. stty).
  • Kabuk parametrelerini ayarlayın (örn. Takma adlar).

Tüm bu amaçlar daha sonraya kadar ayrı olarak tanımlanmadı. Profil komut dosyaları, yalnızca etkileşimli bir oturumda (terminal etkileşimi, diğer programları başlat) mantıklı olan şeyler yapabildiğinden, uzak kabuk çağırma ( rsh ) başlatıldığında , rsh markaları uzak kabuğu bir giriş kabuğu olarak çağırmamaya karar verdi, böylece profil komut dosyaları yürütülmez. (Bazı sürümlerinde rshduzak kabuğu oturum açma kabuğu olarak çalıştırma seçeneği vardır.) Ssh, rsh'in yerine geçmesi için bu davranışı kopyaladı.

Profil komut dosyalarınızın yürütülmesini istiyorsanız, bunları açıkça çağırabilirsiniz.

ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'

.Profil komut dosyalarını kabuğun içine yükleme komutuna dikkat edin: bunlar dış bir program değil, o kabuğun içinde yürütülecek komutlardır.

Tüm kullanıcılar için küresel bir ortam değişkeni ayarlamak istiyorsanız, birçok sistemde başka yöntem vardır: yerine onu içinde tanımlamanın /etc/profile, onu tanımlamak /etc/environment. Bu dosya pam_envmodül üzerinden okunur ; çoğu Linux dağıtımı onu okuyacak şekilde ayarlanmıştır.

Giriş kabuğunuz bash ise, başka bir olasılık daha vardır. Normalde, ortam değişkenlerini.bashrc (etkileşimli kabuklu bir terminalden geçmeniz dışında X oturumlarında ayarlanmayacağı için) ayarlamamalısınız, çünkü bir metin konsolunda veya üzerinde etkileşimli olarak oturum açarsanız ayarlanmazlar. ssh, çünkü başka bir programın içinde bir kabuk çağırırsanız özel ayarları geçersiz kılarlar). Ancak bash'ın hiç anlamadığım garip bir özelliği var: ~/.bashrciki alakasız durumda okuyor :

  • giriş kabukları olmayan etkileşimli kabuklarda;
  • giriş kabukları olmayan etkileşimli olmayan kabuklarda, bash rshdveya tarafından çağrıldığını düşünüyorsa sshd.

Ssh üzerinde bir komut çalıştırdığınızda, ikinci durumdasınız demektir. Profilinizi okuyarak /etc/profileve .profileburadan okuyacak şekilde ayarlayabilirsiniz .bashrc. Aşağıdaki kodu ekleyin ~/.bashrc:

case $- in
  *i*) :;; # this is an interactive shell, fine
  *) # This is not an interactive shell! This must be a non-interactive remote shell session.
    . /etc/profile; . ~/.profile
    return;;
esac
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.