Doğrudan belirli bir dizine nasıl ssh yapabilirim?


248

Sık sık birkaç sunucudan birine giriş yapmak ve bu makinelerdeki birkaç dizinden birine gitmek zorundayım. Şu anda bu tür bir şey yapmak:

localhost ~] $ ssh Instagram Hesabındaki Resim ve Videoları somehost

Bazı barındırıcılara hoş geldiniz!

somehost ~] $ cd / some / dizin / bir yerde / adlı / Foo
somehost Foo] $ 

Hangi ana bilgisayar ve hangi dizine girmeniz gerektiğini belirleyebilecek komut dosyaları var ama bunu yapmak için bir yol bulamıyorum:

localhost ~] $ go_to_dir Foo

Bazı barındırıcılara hoş geldiniz!

somehost Foo] $

Bunu yapmanın kolay, zeki veya herhangi bir yolu var mı?

Yanıtlar:


413

Aşağıdakileri yapabilirsiniz:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

Bu şekilde, directory_wanted dizininde bir kabuk elde edersiniz.


açıklama

-tSahte terminal tahsisini zorla. Bu, uzak bir makinede, örneğin menü hizmetlerini uygularken çok yararlı olabilecek, rasgele ekran tabanlı programlar yürütmek için kullanılabilir.

Birden fazla -tseçenek, ssh'ın yerel tty'si olmasa bile tty ayırmayı zorlar.

  • Kullanmazsanız -thiçbir istem görünmez.
  • Eklemezseniz ; bash, bağlantı kapanır ve kontrolü yerel makinenize döndürür

21
benim durumumda
Mathieu

2
Bu yaklaşımı kullanırken .bash_profile okunmaz, nedenini bilen var mı?
Filipe

8
Bunu yapmak zorundaydım: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron

40
Genellikle bir giriş kabuğu isteyeceksiniz:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy

10
Sadece ssh giriş otomatik olarak dizin değiştirme bağlantı kurmak istedim - Sunucu Hatası ; ve oradan bu komutu (@christianbundy tarafından verilen bir versiyonudur) yapıştırın:ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

Ekleyebilirsiniz

cd /some/directory/somewhere/named/Foo

sizin için .bashrcdosyası (veya .profilediğer ev sahibi ya da ne olursa olsun diyoruz). Bu şekilde, ne yaparsanız yapın veya nereden olursanız olun ssh, bu sunucuda her oturum açışınızda, bu cdsizin için uygun dizine gelir ve yapmanız gereken tek şey sshnormal gibi kullanmaktır .

Lanet, rogeriopvl'nin çözümü de işe yarıyor, ama biraz daha ayrıntılı ve bunu her seferinde (bir takma ad yapmazsanız) yapmayı hatırlamanız gerekiyor, bu yüzden biraz daha az "eğlenceli" görünüyor.


1
+1, X makinesine bağlandığınızda hangi dizine hareket edeceğinizi her an hatırlamak yerine sabit dizine ihtiyacınız varsa daha uygun görünüyor
Tebe

Esnek bir şekilde değişirken uygun değil
Lewis Chan

21

Bir sunucuya SSH ve CD için bir araç oluşturdum - sshcd adında . Verdiğiniz örnek için şunu kullanırsınız:

sshcd somehost:/some/directory/somewhere/named/Foo

Herhangi bir sorunuz veya sorununuz varsa bize bildirin!


1
~ / .Ssh / config içinde yeni bir yapılandırma tanımlayabilir ve oradan okuyabilirseniz çok iyi olurdu;)
Alexar

21

Tercih ettiğim yaklaşım SSH yapılandırma dosyasını kullanmaktır (aşağıda açıklanmıştır), ancak kullanımlarınıza bağlı olarak birkaç olası çözüm vardır.

Komut Satırı Bağımsız Değişkenleri

Bu yaklaşım için en iyi cevabın christianbundy'nin kabul edilen cevaba cevabı olduğunu düşünüyorum:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

Çift tırnak işareti kullanıldığında, ( $SHELLburada olduğu gibi ) çıkış yapılmadıkça değişkenleri yerel makinenizden kullanabilirsiniz . Alternatif olarak, tek tırnak işaretleri kullanabilirsiniz ve kullandığınız tüm değişkenler hedef makinedeki değişkenler olacaktır:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

Bash İşlevi

Komutu bash işlevine sararak basitleştirebilirsiniz. Diyelim ki sadece şunu yazmak istiyorsunuz:

sshcd example.com /foo/bar

Bunu aşağıdakilere ekleyerek bu işlemi yapabilirsiniz ~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

Dizin için uzak makinede bulunan bir değişken kullanıyorsanız, bu diziden kaçtığınızdan veya tek tırnak içine aldığınızdan emin olun. Örneğin, bu JBOSS_HOME, uzak makinedeki değişkente depolanan dizine cd yapacaktır :

sshcd example.com \$JBOSS_HOME

SSH Yapılandırma Dosyası

Ek davranış satırı bağımsız değişkenleri kullanmak zorunda kalmadan normal ssh komutuna sahip belirli (veya herhangi bir) ana bilgisayar için bu davranışı her zaman görmek isterseniz, ssh config dosyanızda RequestTTYve RemoteCommandseçeneklerini ayarlayabilirsiniz .

Örneğin, yalnızca bu komutu yazmak istiyorum:

ssh qaapps18

ancak her zaman bu komut gibi davranmasını istersiniz:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

Bu yüzden bunu dosyama ekledim ~/.ssh/config:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

Artık bu kural, ana makine adında "uygulamalar" bulunan tüm ana makineler için geçerlidir.

Daha fazla bilgi için bkz. Http://man7.org/linux/man-pages/man5/ssh_config.5.html


13

@ Rogeriopvl'nin cevabına eklenenlere dayanarak, aşağıdakileri öneriyorum:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

Komutları tarafından zincirleme &&işlemi, bir sonraki komutu yalnızca bir öncekinin başarılı olması durumunda çalıştırır (kullanmanın aksine ;, komutları sırayla yürütür). Bu, özellikle cdkomutu yerine getiren bir dizine ihtiyaç duyduğunuzda kullanışlıdır .

Aşağıdakileri yaptığınızı düşünün:

/home/me$ cd /usr/share/teminal; rm -R *

Dizin teminalmevcut değildir, bu da ana dizinde kalmanıza ve aşağıdaki komutla oradaki tüm dosyaları kaldırmanıza neden olur.

Kullanıyorsanız &&:

/home/me$ cd /usr/share/teminal && rm -R *

Dizin bulunamadıktan sonra komut başarısız olur.


1
& & Bir kez olmadan bir komut ile tek tırnak kullanılan ve çift tırnak değil ve popo beni ısırdı, kötü ... dersimi öğrendim.
Gavin Pickin

4

Çok özel durumumda, uzak bir ana bilgisayarda, Jenkins köle makinesinden belirli bir dizinin içinde bir komut yürütmek istedim:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

Ama makinem ssh gerçekleştiremedi (sanırım sahte bir tty ayıramadı) ve aşağıdaki hatayı bana verdi:

Pseudo-terminal will not be allocated because stdin is not a terminal

Ben ssh komutunun bir parametresi olarak "dir dir + cd komutumu" geçen bu sorunu ve bir Pseudo-terminali ayırmak zorunda değilsiniz) ve açıkça sn komutuna açıkça söyle söyle sözde terminal tahsisine gerek yoktur.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"

3

CDPATH ortam değişkenini kullanıyorum


Yalnızca makine başına bir dizinle ilgiliysem kullanışlıdır. Uzak makineye bilgi aktarmanın bir yoluna ihtiyacım var. Roger'ın çözümü tam da bunu yapar.
Soğuk

2

bu -tfikirle bir adım daha ileri gidiyor . Sık ziyaret ettiğim ev sahiplerimdeki belirli yerlere gitmek için aşağıdaki komut dosyasını içeren bir dizi komut dosyası tutuyorum. Hepsini içeride tutuyorum ~/binve o dizini yolumda tutuyorum.

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"

1

Giriş yaptıktan hemen sonra gitmenin bir başka yolu da "Takma Ad" oluşturmaktır. Sisteminize giriş yaptığınızda sadece bu diğer adı yazın ve o dizinde olacaksınız.

Örnek: Takma ad = klasörüm '/ var / www / Folder'

Sistem türünüzde oturum açtıktan sonra,
bu komut bashrc içinde değilse bu oturum geçerli oturum için çalışacaktır. Bu nedenle, ileride kullanmak için bu diğer adı bashrc'ye de ekleyebilirsiniz.

$ myfolder => sizi o klasöre götürür


-3

SSH'nin kendisi bir iletişim aracı sağlar, dizinler hakkında hiçbir şey bilmez. Hangi uzaktan komutun çalıştırılacağını belirtebileceğiniz için (bu - varsayılan olarak - kabuğunuz), oradan başlardım.


4
Bu kısmi bir cevap, bir çözüm değil.
AL

-7

evinizi şu komutla değiştirin: usermod -d /newhome username


1
Tavsiye edilmiyor. Ana dizininizi değiştirmek muhtemelen başka şeylerin bozulmasına neden olacaktır.
bronson
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.