web-dev-qa-db-ja.com

特定のディレクトリに直接SSHで接続するにはどうすればよいですか?

多くの場合、いくつかのサーバーの1つにログインし、それらのマシンのいくつかのディレクトリの1つに移動する必要があります。現在、私はこのようなことをしています:

 localhost〜] $ ssh somehost 
 
 somehostへようこそ!
 
 somehost〜] $ cd/some/directory/somewhere/named/Foo 
 somehost Foo] $ 

どのホストとどのディレクトリに入る必要があるかを判断できるスクリプトがありますが、これを行う方法がわかりません。

 localhost〜] $ go_to_dir Foo 
 
 somehostへようこそ!
 
 somehost Foo] $ 

これを行う簡単で賢い方法はありますか?

212
Frosty

次のことができます。

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

このようにして、directory_wantedで直接シェルを取得します。


説明

-t擬似端末割り当てを強制します。これは、リモートマシンで任意の画面ベースのプログラムを実行するために使用できます。メニューサービスを実装する場合。

複数の-tオプションは、sshにローカルttyがない場合でも、ttyの割り当てを強制します。

  • -tを使用しない場合、プロンプトは表示されません。
  • ; bashを追加しない場合、接続は閉じられ、ローカルマシンに制御が戻ります
372
rogeriopvl

追加できます

cd /some/directory/somewhere/named/Foo

他のホストの.bashrcファイル(または.profileまたはそれを呼び出すもの)に。そうすれば、あなたが何をするにせよ、どこからsshするかに関係なく、そのサーバーにログオンするたびに、cdが適切なディレクトリに移動し、ssh通常どおり。

呪いの中で、rogeriopvlのソリューションも機能しますが、少し冗長です。毎回(エイリアスを作成しない限り)実行することを忘れないでください。

48
Chris Lutz

SSHとCDをサーバーに連続して作成するツールを作成しました。適切な名前の sshcd です。あなたが与えた例では、あなたは単に使用するでしょう:

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

ご質問や問題がある場合はお知らせください!

19
christianbundy

@rogeriopvlの回答への追加に基づいて、次のことをお勧めします。

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

&&によるコマンドのチェーンは、前のコマンドが成功した場合にのみ次のコマンドを実行します(コマンドを順次実行する;を使用するのとは対照的です)。これは、コマンドを実行するディレクトリにcdする必要がある場合に特に便利です。

次のことを想像してください。

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

ディレクトリteminalが存在しないため、次のコマンドを使用してホームディレクトリに残り、そこにあるすべてのファイルを削除します。

&&を使用する場合:

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

ディレクトリが見つからないと、コマンドは失敗します。

10
Bas Peeters

私の推奨するアプローチはSSH構成ファイル(下記を参照)を使用することですが、用途に応じていくつかの解決策があります。

コマンドライン引数

このアプローチの最良の答えは、受け入れられた答えに対するchristianbundyの回答だと思います。

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

二重引用符を使用すると、エスケープされない限り、ローカルマシンの変数を使用できます($Shellがここにあるため)。または、一重引用符を使用することもできます。使用する変数はすべて、ターゲットマシンの変数になります。

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

バッシュ関数

コマンドをbash関数でラップすることで単純化できます。これを単に入力したいとしましょう:

sshcd example.com /foo/bar

これを~/.bashrcに追加することで、これを機能させることができます:

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

ディレクトリのリモートマシンに存在する変数を使用している場合は、必ずエスケープするか、単一引用符で囲んでください。たとえば、これはリモートマシンのJBOSS_HOME変数に格納されているディレクトリに移動します。

sshcd example.com \$JBOSS_HOME

SSH構成ファイル

追加のコマンドライン引数を使用せずに、通常のsshコマンドを使用して特定の(または任意の)ホストのこの動作を常に確認したい場合は、RequestTTYおよびRemoteCommandオプションを設定できます。 ssh構成ファイル。

たとえば、次のコマンドのみを入力したいと思います。

ssh qaapps18

しかし、常にこのコマンドのように動作するようにしたい:

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

そこで、これを~/.ssh/configファイルに追加しました。

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

このルールは、ホスト名に「apps」が含まれるすべてのホストに適用されます。

詳細については、「 http://man7.org/linux/man-pages/man5/ssh_config.5.html 」を参照してください

8
Drew

私の非常に特殊なケースでは、Jenkinsスレーブマシンの特定のディレクトリ内のリモートホストでコマンドを実行したかっただけです。

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

しかし、私のマシンはsshを実行できず(擬似ttyを割り当てることができなかったため)、次のエラーを表示し続けました。

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

この問題を回避するには、「cd to dir + my command」をsshコマンドのパラメーターとして渡し(疑似端末を割り当てる必要はありません)、オプション-Tを渡してsshコマンドに明示的に指示します。擬似端末の割り当ては不要です。

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

環境変数CDPATHを使用します

3
Eddy

-tアイデアをさらに一歩進めます。私は頻繁に訪れるホストの特定の場所に行くために、以下を呼び出す一連のスクリプトを保持しています。それらをすべて~/binに保持し、そのディレクトリをパスに保持します。

#!/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
DKebler

ログイン後に直接アクセスする別の方法は、「エイリアス」を作成することです。システムにログインすると、そのエイリアスを入力するだけで、そのディレクトリに移動します。

例:エイリアス= myfolder '/ var/www/Folder'

システムにログインした後、そのエイリアスを入力します(これはシステムの任意の部分から機能します)
bashrcにない場合、このコマンドは現在のセッションで機能します。そのため、今後このエイリアスをbashrcに追加して使用することもできます

$ myfolder =>そのフォルダに移動します

1
insomiac