$ PATH'ı "ssh user @ host command" çalışacak şekilde nasıl ayarlayabilirim?


129

Üzerinden komutları çalıştırırken kullanılacak şekilde yeni bir $ PATH belirleyemiyorum ssh user@host command. export PATH=$PATH:$HOME/new_pathUzak makinede ~ / .bashrc ve ~ / .profile dosyalarına eklemeyi denedim , ancak yürütme ssh user@host "echo \$PATH", değişikliğin alınmadığını gösteriyor (/ usr / local / sbin: / usr / local / bin: / usr / gösteriyor) sbin: / usr / bin / sbin: / bin: / usr / oyunlar). Uzak makine Ubuntu 8.04 çalıştırıyor.

Eminim onu ​​/ etc / profile hackleyebilirim, ancak bu temiz bir çözüm değil ve yalnızca birinin root erişimi olduğunda çalışır.


1
export PATH=$PATH:$HOME/new_pathHem ~ / .bash_login hem de ~ / .bash_profile'a eklemeyi denedim (önceden denenmiş ~ / .bashrc ve ~ / .profile ek olarak). Hiçbiri işe yaramıyor. Her iki durumda da dosyayı oluşturmak zorunda kaldım.
Denver Gingerich

Benim özel kullanım durumumda, ssh'a gönderilen komutu değiştirmek kolay değildir. Ssh komutunun kendisini oluşturan stfufs ( guru-group.fi/too/sw/stfufs ) kullanıyorum . Yönteminin harika bir çözüm olmadığının farkındayım, ancak stfuf'ları değiştirmeden düzeltmek güzel olurdu.
Denver Gingerich

Bir ssh paketleyiciyi stfufs'un yoluna koyabilirsiniz, daha kolaysa değiştirilmiş argümanlar ile gerçek ssh çağırabilirsiniz
Hasturkun 02.09.09

Yanıtlar:


180

Grawity'nin dediği gibi ~ / .bashrc, etkileşimli olmayan oturum açma olmayan kabuklardan kaynaklandığı için istediğiniz şeydir.

Yaşadığınız sorunun varsayılan Ubuntu ~ / .bashrc dosyasıyla ilgisini çekeceğini umuyorum. Genellikle şöyle bir şeyle başlar:

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

Bu çizginin önüne etkileşimli olmayan mermiler için her şeyi koymak istiyorsunuz .


1
Evet, export PATH=$PATH:$HOME/new_pathbu çizginin üstüne çıktım ve işe yaradı. Teşekkürler!
Denver Gingerich

3
.bashrc güvenilmezdir. man bash: "Bash, standart girişi bir ağ bağlantısına bağlıyken çalıştırılmakta olduğunu belirlemeye çalışır". Bu RHEL'de çalışır, ancak Archlinux'ta çalışmaz. Varsayılan PATH'i değiştirmek için / etc / environment'ı düzenlemem gerekiyordu
basin

.zshenvZsh kullanıcıları için bahsetmelisiniz , diğer cevaplardaki yorumlarda bulmam biraz zaman aldı
Mike

30

Bir var mı ~/.bash_loginyoksa ~/.bash_profile?

Etkileşimli modda Bash bu dosyaları kontrol eder ve şu sırayla ilk var olanı kullanır :

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Yani eğer bir tane varsa ~/.bash_profile, o zaman yaptığınız değişiklikler ~/.profilegörünmeden bırakılacaktır.

Etkileşimli olmayan modda Bash bazen dosyayı okur~/.bashrc (bu da genellikle etkileşimli komut dosyalarından kaynaklanır) "Bazen" derken dağıtıma bağlı olduğunu kastediyorum: oldukça garip bir şekilde, bunu etkinleştirmek için bir derleme zamanı seçeneği var . Debian ~/.bashrcokumayı etkinleştirirken, örneğin Arch bunu yapmaz.

ssh etkileşimli olmayan modu kullanıyor gibi görünüyor, bu yüzden ~/.bashrcyeterli olmalı. Böyle sorunlar yaşadığımda, hangi dosyaların çalıştırıldığını görmek için genellikle birkaç eko eklerim.


Ekoları eklemek yardımcı oldu ... ama hala 'ssh -X remotemachine "xterm"' i çalıştırmanın ve / etc / profile ve ~ / home / username / .bash_profile'dan tam sistem / kullanıcı yoluna sahip olmanın bir yolunu arıyorum. Komuttaki her iki dosyayı da kaynak yaparsam, çalışıyor .. ama çirkin :).
Jess

"Bash'in etkileşimli olmayan modda dosyayı okuduğunu" nasıl anlarsınız ~/.bashrc? Bu ifadeyi kılavuz sayfasında görmüyorum. Teşekkürler
nknight

4
Etkileşimli olmayan oturum açma olmayan bir kabuğun kaynağını ~/.bashrcistiyorsanız, ek olarak ortam değişkenini ayarlamanız gerekiyor gibi görünüyor BASH_ENV; bkz. superuser.com/a/585699/100843 . Etkileşimli olmayan oturum açma kabukları için, muhtemelen bahsettiğiniz üç başlangıç ​​komut dosyasından birini değiştirmeniz gerekir.
nknight

3
ZSH için etkileşimli olmayan dosya:.zshenv
matematik

2
@math .zshenvher zaman kaynaklıdır; etkileşimli olup olmaması önemli değil.
JoL

19

ssh belgeleri şunu söylüyor:

Komut belirtilirse, bir oturum açma kabuğu yerine uzak ana bilgisayarda yürütülür.

bu nedenle bashrc dosyalarına ekleme işlemi çalışmaz. ancak aşağıdaki seçeneklere sahipsiniz:

  1. Eğer PermitUserEnvironmentseçenek sshd config ayarlanır, sizin PATH ayarı ekleyebilir~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'


1. sshd yapılandırmamda ayarlanmadı ve man sshd_configvarsayılan olarak kapalı olduğunu söylüyor, bu yüzden bu çözümün çoğu insan için işe yaraması olası değil. 2. Bu işe yarardı, ancak ssh'a gönderilen komutu kolayca değiştiremiyorum (sorumla ilgili ikinci yoruma bakın).
Denver Gingerich

1
1. Beklendiği gibi çalışmaz, çünkü ~ / .ssh / ortamında PATH'a yol ekleyemezsiniz çünkü $ PATH çözümlenmeyecektir.
not2savvy

8

Her zaman şunu söyleyebilirsin:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

Bu çözümün uzak makinede herhangi bir değişikliğe ihtiyacı yoktur, bu iyi bir şeydir.
Ronny Andersson

2

@Signpolyma cevabına ek olarak, dışa aktarımınızı bu satırlardan önce eklemeniz gerekecek

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Aslında bu satırları tamamen yorumladım - Ubuntu 16.04 LTS masaüstünde ~ / .bashrc'de bulundu. Hiçbir şey çalışmıyor. Ayrıca PermitUserEnvironment'ı da evet olarak ayarlayın.
Ernie S

2

Ben de aynı sorunu yaşadım, şununla çözdüm:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
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.