多くの場合、いくつかのサーバーの1つにログインし、それらのマシンのいくつかのディレクトリの1つに移動する必要があります。現在、私はこのようなことをしています:
localhost〜] $ ssh somehost somehostへようこそ! somehost〜] $ cd/some/directory/somewhere/named/Foo somehost Foo] $
どのホストとどのディレクトリに入る必要があるかを判断できるスクリプトがありますが、これを行う方法がわかりません。
localhost〜] $ go_to_dir Foo somehostへようこそ! somehost Foo] $
これを行う簡単で賢い方法はありますか?
次のことができます。
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"
このようにして、directory_wantedで直接シェルを取得します。
説明
-t
擬似端末割り当てを強制します。これは、リモートマシンで任意の画面ベースのプログラムを実行するために使用できます。メニューサービスを実装する場合。複数の
-t
オプションは、sshにローカルttyがない場合でも、ttyの割り当てを強制します。
-t
を使用しない場合、プロンプトは表示されません。; bash
を追加しない場合、接続は閉じられ、ローカルマシンに制御が戻ります追加できます
cd /some/directory/somewhere/named/Foo
他のホストの.bashrc
ファイル(または.profile
またはそれを呼び出すもの)に。そうすれば、あなたが何をするにせよ、どこからssh
するかに関係なく、そのサーバーにログオンするたびに、cd
が適切なディレクトリに移動し、ssh
通常どおり。
呪いの中で、rogeriopvlのソリューションも機能しますが、少し冗長です。毎回(エイリアスを作成しない限り)実行することを忘れないでください。
SSHとCDをサーバーに連続して作成するツールを作成しました。適切な名前の sshcd です。あなたが与えた例では、あなたは単に使用するでしょう:
sshcd somehost:/some/directory/somewhere/named/Foo
ご質問や問題がある場合はお知らせください!
@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 *
ディレクトリが見つからないと、コマンドは失敗します。
私の推奨するアプローチは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コマンドを使用して特定の(または任意の)ホストのこの動作を常に確認したい場合は、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 」を参照してください
私の非常に特殊なケースでは、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"
環境変数CDPATHを使用します
-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"
ログイン後に直接アクセスする別の方法は、「エイリアス」を作成することです。システムにログインすると、そのエイリアスを入力するだけで、そのディレクトリに移動します。
例:エイリアス= myfolder '/ var/www/Folder'
システムにログインした後、そのエイリアスを入力します(これはシステムの任意の部分から機能します)
bashrcにない場合、このコマンドは現在のセッションで機能します。そのため、今後このエイリアスをbashrcに追加して使用することもできます
$ myfolder =>そのフォルダに移動します