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


Ben almaya çalışıyorum ssh Oturum açtığımda belirli bir dizine otomatik olarak geçmek için. Bu davranışı aşağıdaki yönergeleri kullanarak çalışmayı denedim. ~/.ssh/config:

Host example.net
LocalCommand "cd web"

ama ne zaman giriş yaparım, aşağıdakileri görüyorum:

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

olmasına rağmen kesinlikle bir web ev dizinindeki klasör. Mutlak bir yol kullanmak bile aynı mesajı verir. Açıkçası, yazarsak cd web giriş yaptıktan sonra doğru klasöre geçiyorum.

Burada neyi ö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 alıntıların orada olmaması gerektiğini ve başka bir hata olduğunu düşünüyor.


79
2017-08-05 14:40


Menşei


LocalCommand, yerel sisteminizde değil, uzak sistemde çalışır. - Steve Kehlet
Buraya bakın superuser.com/a/124110/47962 - Nakilon


Cevaplar:


cd bir kabuk yerleşiğidir. LocalCommand şu şekilde yürütülür:

/bin/sh -c <localcommand>

Yapmak istediğin şey gerçekten SSH ile gerçekleştirilemez; kabuğu bir şekilde değiştirmelisiniz, örn. bashrc / bash_profile üzerinden.


19
2017-08-05 15:52



Evet, sadece aynısından bahsetmek istedim. Koyabilirsiniz cd komut vermek ~/.bashrc bunun yerine uzak sunucuda. - vdboor
Bu sinir bozucu. Başka bir yorumda bahsettiğim gibi, sunucunun bir dizi ana makine ismi var ve kullanılan farklı davranışlara sahip olmak istedim. Sanırım .bashrc'den hangisinin kullanıldığını belirlemek mümkün değil mi? - Gareth
Bu muhtemelen, muhtemelen tavsiye edilemez. Ssh, küçük bir kabuk betiğiyle veya dışa aktarılacak bir değişken olarak ana bilgisayar adını geçiren takma adla değiştirme gibi bir şeydir (bir la "ssh -t kullanıcı @ ana bilgisayar" dışa aktarma connhostname = ana bilgisayar; bash --login ""). Ama gerçekten çok tuhaf bir bölgeye girmeye başlıyorsunuz. Belki de daha iyi bir soru, NEDEN bu davranışı istiyorsun? - BMDan
Dürüst olmak gerekirse o kadar büyük bir anlaşma değil. Ben sadece bu sunucuya giriş yaptığım zamanların büyük çoğunluğunun iki dizinden birine yöneldiğim durumdayım (kullandıkları ana bilgisayara bağlı olarak) - Gareth


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"

Eklemezseniz bash yolun sonuna kadar sonra cd comand çalışır. Ve eğer eklemezseniz --login o zaman senin ~/.profile kaynak değil.


76
2017-12-21 21:29



Bu, bir bash istemi ile doğru yerde beni biter. mükemmel! - Peter Ehrlich
Bu benim için de çalışıyor ama eğer ssh atlama-host ile kullanmaya çalışırsam işe yaramıyor. Bağlantı kapalı bir mesaj alıyorum. - Riccardo


  1. Kutusuna giriş yap
  2. Düzenle ~/.bash_profile 
  3. Dosya sonunda cd /path/to/your/destination
  4. Kaydedin ve düzenleyicinizden çıkın
  5. Kutudan çıkış
  6. Tekrar giriş yap ve onu içine almalısın /path/to/your/destination

40
2018-02-27 11:04



Bazı makinelerde eklemeniz gerekebilir. cd /path/to/your/destination için ~/.bashrc yerine ~/.bash_profile. Sonuç aynı olmalıdır. - Matthias
Bu mükemmel bir şekilde çalışıyor - sadece kullanıcı kimliğimle sınırlı mı yoksa başkalarının kullanıcı girişlerini de etkileyecek mi? - barry_allen
Eğer değiştirirseniz @BabyGroot ~/.bash_profile veya ~/.bashrc Sadece geçerli kullanıcıyı etkileyecektir. - rubenvarela


Varsayılan .bashrc dosyasını ssh ve geçersiz kılmanız gerektiğinde durum için daha sağlam bir çözüm. Bu, uzak sunucu ortamının birden çok belgeye sahip olduğu ve birden çok kullanıcı tarafından kullanıldığı durumlarda yararlı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 oluşturur .bashrc_tmp dosyasında /tmp içerikli uzak sunucudaki dizin cd /path/to/dir
  2. Bir sonraki komut yürütür bash 1. adımda belirtilen yapılandırma dosyası ile. Bu, istenen dir ve değiştirmeyi önler. .bashrc.
  3. Bu bütün komut bir aliasssh istemci komut isteminde, bu şekilde çağrılabilir ssh_myserver

5
2017-08-21 11:53



Yaratıcı ... yazdığınız sürece / tmp - smci


Bu yönergeyi ssh yapılandırmanızda etkinleştirdiniz mi?

PermitLocalCommand yes

Bunun için varsayılan değer no, bu durumda sizin LocalCommand yönerge göz ardı edilecektir.

Alternatif olarak, komutu eklemeye çalıştınız .bashrc dosya?


4
2017-08-05 14:47



Bu yönerge ayarlandı, evet (ve eğer olmasaydı hata mesajını göremediğimi sanıyorum). .Bashrc kullanımıyla ilgili sorun, sunucunun farklı ana bilgisayar adlarına sahip olması ve farklı başlangıç ​​adlarının farklı başlangıç ​​dizinlerine çevirilmesini istiyorum. - Gareth
Her ana bilgisayar adının farklı bir IP adresi olmadığı sürece, sunucunun istediğiniz ana bilgisayar adını bilmesi için bir yol olmaz. HTTP istekleri, istenen ana bilgisayar adını tanımlamak için arkadaşça bir Ana Bilgisayar: başlık sağlarken, SSH bağlantıları yoktur. - Fosco


Bu yüzden çok fazla web sitesi aradım (stackoverflow, bu bir) ama istediğimi bulamadım. Kendi kabuk senaryomu oluşturmayı bitirdim. Onu buraya yapıştırıyorum. Ayrıca, $ PATH içindeki bir dizini de kopyalayabilirsiniz.

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

Yani bundan sonra. Ben yaparım:

connect <foldername>

Not: Yol değişkeni değiştirdikten sonra çıkış yapıp tekrar giriş yapmanız gerekebilir.


4
2017-11-25 03:10



Bunu bir önceki öneriye tercih ediyorum çünkü '$ SHELL' her zaman geçerlidir, 'bash' olmayabilir. Ayrıca 'exec' kullanımı hoş bir dokunuş. - Dave
Daha fazla ayrıntılandırma 'cd' nin başarılı olmasını sağlardı - "cd ~ / $ 1 && exec ..." - Dave


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 ihraç değişkeni dahil olmak üzere değişken geçişi kullanarak yapmayı denedim, ancak bu komutlar farklı kabuklarda çalıştırılıyor.

Yapmaya çalıştığınız şeyi test ederken, bu arada mutlak olmayan yolu kullandığımda bir hata almadım. ekledim ; pwd Komutun sonunda ve doğru dizin görüntülenir, ancak sonunda I dizin ~. Yok cd kabuk başlangıç ​​dosyamdaki komutları. Farklı koymayı denedim cd somedir; pwdiçinde ~/.ssh/rc (diğer hala yerinde). config komut motifi yayınlanmadan önce yapılır ve rc komut daha sonra verilir, ancak kabuk başlatma dosyaları oluşturulmadan önce. Yani yine farklı bir kabukta oluyor.

Dosya aktarma tekniğini deneyin ve sizin için çalışıyorsa bana bildirin.


3
2017-08-05 18:21





Etrafındaki tırnaklar olmadan denedin mi? Gördüğüm tek örnek onlara onlarla sahip değil, bir komut olarak cd \ web'i çalıştırmaya çalışıyor olabilir.


2
2017-08-05 15:03



Tamam, alıntılar kaldırılıyor gibi görünüyor, ancak hala hatalarım var (düzenlenmiş yazıya bakın) - Gareth


Bu seçeneği deneyerek de deneyebilirsiniz. -t:

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

0
2017-09-21 09:03