Ssh girişinde dizini otomatik olarak nasıl değiştirebilirim?


87

Giriş yaptığımda sshbelirli bir dizine otomatik olarak geçmeye çalışıyorum. Aşağıdaki yönergeleri kullanarak bu davranışı çalıştırmaya çalıştım ~/.ssh/config:

Host example.net
LocalCommand "cd web"

ancak ne zaman giriş yaparsam aşağıdakileri görüyorum:

/bin/bash: cd web: No such file or directory

Yine webde ana dizinde kesinlikle bir klasör var . Mutlak bir yol kullanmak bile aynı mesajı verir. Açık olmak gerekirse, cd webgiriş yaptıktan sonra yazarsam doğru klasöre giderim.

Burada ne özlüyorum?

DÜZENLE:

Farklı tırnak / mutlak yol kombinasyonları farklı hata mesajları verir:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

Bu bana tekliflerin orada olmaması gerektiğini ve başka bir hata olduğunu düşündürüyor.


9
LocalCommand, uzak sistemde değil, yerel sisteminizde çalıştırılır.
Steve Kehlet

Yanıtlar:


25

cd bir kabuk yerleşiktir. LocalCommand şu şekilde yürütülür:

/bin/sh -c <localcommand>

Yapmak istedikleriniz gerçekten SSH ile yapılamaz; kabuğu bir şekilde değiştirmeniz gerekir, örneğin bashrc / bash_profile.

<Neredeyse on yıl sonra düzenleniyor ...>

LocalCommandYine de istediğin bu değil. Yani üzerinde çalıştırıldığı senin makine. Sen istiyorsun RemoteCommand. Bunun gibi bir şey benim için çalıştı:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
Evet, sadece aynı söz etmek istedim. cdKomutu ~/.bashrcbunun yerine uzaktaki sunucuya koyabilirsiniz .
vdboor

Bu sinir bozucu. Başka bir yorumda da belirttiğim gibi, sunucuda çok sayıda ana bilgisayar adı var ve hangisinin kullanıldığına bağlı olarak farklı davranışlarda bulunmak istedim. Hangisinin .bashrc'den kullanılacağını belirlemek mümkün değil galiba.
Gareth,

Bu mümkün, muhtemelen tavsiye edilmez. Ssh'nin küçük bir kabuk betiği veya takma adın dışa aktarılacak değişken olarak geçen takma adıyla değiştirilmesi gibi bir şey (la "ssh -t user @ host 'export connhostname = host; bash --login'"). Ama gerçekten çok garip bir bölgeye girmeye başladın. Belki daha iyi bir soru, bu davranışı neden istiyorsun?
BMDan

Dürüst olmak gerekirse o kadar büyük bir şey değil. Ben sadece bu sunucuya giriş yaptığım zamanın büyük çoğunluğunun doğrudan iki dizinden birine yöneliyorum (hangi bilgisayarı kullanacağım bağlı olarak)
Gareth

77

Bu çalışıyor:

ssh server -t "cd /my/remote/directory; bash --login"

Varsa bir dizin oluşturmak için:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

bashYolun sonuna ekleme yapmazsanız , cdkomut çalıştırıldıktan sonra çıkılır . Ve eğer eklemezseniz, --logino zaman ~/.profilekaynak değil.


Bu beni bir bash istemiyle, doğru yerde bitiyor. mükemmel!
Peter Ehrlich

Bu benim için de işe yarıyor ama ssh jump-host ile birlikte kullanmaya çalışırsam çalışmaz. Bağlantı kapalı mesajı alıyorum.
Riccardo

43
  1. Kutunuza giriş yapın
  2. Düzenle ~/.bash_profile
  3. Dosya sonunda ekle cd /path/to/your/destination
  4. Kaydet ve çık
  5. Kutudan çıkış yap
  6. Tekrar giriş yapın ve devam etmelisiniz /path/to/your/destination

3
Bazı makinelerde cd /path/to/your/destination, ~/.bashrcyerine eklemeniz gerekebilir ~/.bash_profile. Sonuç aynı olmalı.
Matthias

Bu mükemmel bir şekilde çalışıyor, sadece kullanıcı kimliğimle mi sınırlı, yoksa diğer kullanıcı girişlerini de etkileyecek mi?
hard_working_ant

@BabyGroot değiştirirseniz, ~/.bash_profileya ~/.bashrcda yalnızca geçerli kullanıcıyı etkiler.
rubenvarela

5

Varsayılan .bashrc dosyasını ssh ve geçersiz kılmanız gerektiğinde durum için daha sağlam bir çözüm. Uzak sunucu ortamının birden fazla dokümanı olduğu ve birden fazla kullanıcı tarafından kullanıldığı durumlarda bu kullanışlıdır.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

Daha detaylı:

  1. İlk komut , uzak sunucudaki bir içeriğe sahip dizinde .bashrc_tmpdosya oluşturur./tmpcd /path/to/dir
  2. Bir sonraki komut bash, 1. adımda belirtilen config dosyası ile çalışır .bashrc.
  3. Bu komutun tamamı bir sarar alias, yani ssh istemcisi komut isteminde şöyle çağrılabilir.ssh_myserver

Creative ... / tmp
smci'ye

4

Bu yönergeyi ssh config'inizde etkinleştirdiniz mi?

PermitLocalCommand yes

Bunun için varsayılan no, LocalCommanddirektifinizin göz ardı edileceği bu durumda .

Alternatif olarak, komutunuzu .bashrcdosyanıza eklemeyi denediniz mi?


Bu yönerge ayarlandı, evet (ve olmasaydı gösterilen hata mesajını görmeyeceğimi sanıyorum). .Bashrc kullanmanın sorunu, sunucunun farklı ana bilgisayar adlarına sahip olmasıdır ve farklı ana bilgisayar adlarının farklı başlangıç ​​dizinlerine çevrilmesini isterim
Gareth

Her ana bilgisayar adının farklı bir IP adresi yoksa, sunucunun hangi ana bilgisayar adını istediğinizi bilmesi mümkün olmaz. HTTP istekleri kolay bir Ana Bilgisayar sağlasa da, istenen ana bilgisayar adını tanımlayan başlık olsa da, SSH bağlantıları yoktur.
Fosco

4

Bu yüzden birçok web sitesi araştırdım (stackoverflow, this), ancak istediğimi bulamadım. Kendi kabuk betiğimi yarattım. Ben buraya yapıyorum. Ayrıca $ PATH içindeki bir dizine kopyalayabilirsiniz.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

Bundan sonra. Yaparım:

connect <foldername>

Not: Yol değişkenini değiştirdikten sonra oturumu kapatıp tekrar açmanız gerekebilir.


Bunu önceki öneriye tercih ediyorum çünkü '$ SHELL' her zaman geçerlidir, 'bash' olmayabilir. Ayrıca 'exec' kullanımı hoş bir dokunuş.
Dave,

Diğer bir iyileştirme 'cd' işleminin başarılı olmasını sağlamak olacaktır - "cd ~ / $ 1 && exec ... '
Dave

3

Senin içinde ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

Sonunda ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

Bunu dışa aktarılan bir değişkenle birlikte değişken geçişini kullanarak yapmaya çalıştım, ancak bu komutlar farklı kabuklarda çalıştırılıyor.

Yapmaya çalıştığınız şeyi sınarken bu arada, bildirilmemiş mutlak yolu kullandığımda hata alamadım. ; pwdKomutun sonuna ekledim ve doğru dizin beliriyor, ancak sonunda içeri girdiğim dizin ~. cdShell başlangıç ​​dosyalarımda hiçbir komut yok . Farklı koyarak çalıştı cd somedir; pwdiçinde ~/.ssh/rc(hala yerinde diğeriyle). configMotd yayınlanmadan önce komut yürütülür ve rckomut Sonrasında yapılan, ancak kabuk önce başlangıç dosyalarını kaynak vardır. Yani yine, farklı bir kabukta oluyor.

Dosya aktarım tekniğini deneyin ve sizin için işe yarayıp yaramadığını bana bildirin.


2

Etrafında tırnak olmadan denedin mi? Gördüğüm tek örnekler, onlarla birlikte değil, cd \ web komutunu çalıştırmaya çalışıyor olabilir.


Tamam, alıntıların kaldırılması bana yardımcı olacak gibi görünüyor ama yine de hatalarım var (Düzenlenen yazıya bakın)
Gareth

1

Bu seçeneği de deneyebilirsiniz -t:

ssh server -t "cd /my/remote/directory; bash"

1

Kullanmayı deneyin RemoteCommand, örneğin

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: Sunucuya başarıyla bağlandıktan sonra uzak makinede yürütülecek komutu belirtir. ( man ssh_config)

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.