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


248

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

localhost〜] $ ssh somehost

somehostへようこそ!

somehost〜] $ cd / some / directory / somewhere / named / Foo
somehost Foo] $ 

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

localhost〜] $ go_to_dir Foo

somehostへようこそ!

somehost Foo] $

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

回答:


413

次のことができます。

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

このようにして、directory_wantedにシェルを作成します。


説明

-t疑似端末割り当てを強制します。これは、リモートサービスマシン上で任意の画面ベースのプログラムを実行するために使用できます。これは、たとえばメニューサービスの実装時に非常に役立ちます。

-tsshにローカルttyがない場合でも、複数のオプションによりttyの割り当てが強制されます。

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

21
私の場合-t行方不明の部分
Mathieu

2
このアプローチを使用するときに.bash_profileが読み取られない場合、その理由は誰にもわかりますか?
フィリップ

8
私はこれをしなければなりませんssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
でした

40
あなたは通常、ログインシェルをお勧めします:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy

10
sshログイン時に自動的にディレクトリの変更をリンクしたかった-サーバー障害。そしてそこからこのコマンドを貼り付けます(これは@christianbundyによるもののバージョンです):ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

追加できます

cd /some/directory/somewhere/named/Foo

他のホストであなたの.bashrcファイル(または.profileあなたがそれを呼ぶもの)に。こうすることで、何をどこsshから行っても、そのサーバーにログオンするたびにcd適切なディレクトリに移動し、ssh通常どおりに使用するだけで済みます。

呪いの中で、rogeriopvlの解決策も機能しますが、少し冗長なため、毎回(エイリアスを作成しない限り)忘れずに行う必要があるため、少し "面白さ"が低下します。


1
+1、これは、Xマシンに接続したときに移動するディレクトリに毎回sshコマンドを記憶させるのではなく、一定のディレクトリが必要な場合に適しています
Tebe

柔軟に変更する場合は適切ではありません
ルイスチャン

21

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

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

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


1
〜/ .ssh / configに新しい構成を定義してそこから読み取ることが
できればすばらしいでしょう

21

私の推奨するアプローチは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リモートマシンの変数に格納されているディレクトリにcdします。

sshcd example.com \$JBOSS_HOME

SSH設定ファイル

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

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

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を参照してください。


13

@rogeriopvlの回答への追加に基づいて、私は以下を提案します:

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

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

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

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

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

使用する場合&&

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

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


1
&&なしのコマンドで一重引用符を使用し、二重引用符を使用しなかった。
Gavin Pickin

4

私の非常に特殊なケースでは、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

環境変数CDPATHを使用します


マシンごとに1つのディレクトリに関心がある場合にのみ役立ちます。リモートマシンに情報を渡す方法が必要です。ロジャーのソリューションはまさにそれを行います。
フロスティ

2

-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

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

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

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

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


-3

SSH自体は通信手段を提供し、ディレクトリについては何も知りません。実行するリモートコマンドを指定できるので(これは、デフォルトではシェルです)、そこから開始します。


4
これは部分的な答えであり、解決策ではありません。
AL

-7

次のコマンドで家を変更するだけです: usermod -d /newhome username


1
助言されません。ホームディレクトリを変更すると、おそらく他のものが壊れるでしょう。
ブロンソン2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.