sshログイン時にディレクトリを自動的に変更するにはどうすればよいですか?


87

sshログイン時に特定のディレクトリに自動的に変更しようとしています。次のディレクティブを使用して、その動作を動作させようとしました~/.ssh/config

Host example.net
LocalCommand "cd web"

しかし、ログインするたびに、次のように表示されます。

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

web私のホームディレクトリには間違いなくフォルダがありますが。絶対パスを使用しても同じメッセージが表示されます。明確にするために、cd webログイン後に入力すると、正しいフォルダーに移動します。

ここに何が欠けていますか?

編集:

引用符/絶対パスのさまざまな組み合わせにより、さまざまなエラーメッセージが表示されます。

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

これは、引用符がそこにあるべきではなく、別のエラーが発生していると思うようにします。


9
LocalCommandは、リモートシステムではなく、ローカルシステムで実行されます。
スティーブケレット

こちらをご覧くださいsuperuser.com/a/124110/47962
Nakilon

回答:


25

cdはシェル組み込みです。LocalCommandは次のように実行されます。

/bin/sh -c <localcommand>

あなたがしようとしていることは、SSHを介して実際に達成することはできません。bashrc / bash_profileなどを使用して、何らかの方法でシェルを変更する必要があります。

<ほぼ10年後の編集...>

LocalCommandとにかくあなたが望むものではありません。それはあなたのマシンで実行されます。あなたが欲しいRemoteCommand。このような何かが私のために働いた:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
うん、ちょうど同じことを言及したかった。代わりに、リモートサーバーにcdコマンドを配置でき~/.bashrcます。
vdboor

うざい。別のコメントで述べたように、サーバーには多くのホスト名があり、使用されたものに基づいて異なる動作をしたかったのです。どちらが.bashrcから使用されたかを判断することはできないと思いますか?
ガレス

可能ですが、おそらくお勧めできません。sshを、エクスポートする変数としてホスト名を渡す小さなシェルスクリプトまたはエイリアスで置き換えるようなものです(「ssh -t user @ host 'export connhostname = host; bash --login'」)。しかし、あなたは本当に非常に奇妙な領域に入り始めています。おそらく、より良い質問は、なぜこの動作が必要なのでしょうか?
BMD

正直言って、それほど大したことではありません。私はちょうど私が私が(どのホスト私が使用しているによって異なります)の2つのディレクトリのいずれかにまっすぐに向かうこのサーバにログインした時間の大半状況にいるよ
ガレス

77

これは動作します:

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

ディレクトリが存在しない場合に作成するには:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

bashパスの最後に追加しない場合は、cdコマンドの実行後に終了します。あなたが追加しない場合や--login、あなたのが~/.profile供給されていません。


これにより、正しい場所に移動し、bashプロンプトが表示されます。完璧!
ピーターエーリッヒ

これは私にも有効ですが、ssh jump-hostで使用しようとしても機能しません。接続が閉じられましたというメッセージが表示されます。
リカルド

43
  1. ボックスにログイン
  2. 編集 ~/.bash_profile
  3. ファイルの最後に追加します cd /path/to/your/destination
  4. 保存して終了
  5. ボックスからログアウト
  6. 再度ログインすると、上に着くはずです /path/to/your/destination

3
一部のマシンではcd /path/to/your/destination、の~/.bashrc代わりにに追加する必要があります~/.bash_profile。結果は同じになるはずです。
マティアス

これは完璧に機能します。私のユーザーIDのみに制限されていますか、それとも他のユーザーのログインにも影響しますか?
-hard_working_ant

あなたが変更した場合@BabyGroot ~/.bash_profileまたは~/.bashrcそれが現在のユーザーのみに影響します。
ルーベンバレラ

5

デフォルトの.bashrcファイルをsshしてオーバーライドする必要がある場合の、より堅牢なソリューション。これは、リモートサーバー環境に複数のdocrootがあり、複数のユーザーが使用する場合に役立ちます。

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

より詳細な:

  1. 最初のコマンドは、コンテンツを含むリモートサーバー上のディレクトリに.bashrc_tmpファイルを作成します/tmpcd /path/to/dir
  2. 次のコマンドはbash、手順1で指定された構成ファイルを使用して実行されます。これにより、目的のディレクトリに切り替えてdefaultを抑制することができます.bashrc
  3. このコマンド全体はとしてラップされているaliasため、sshクライアントコマンドプロンプトでは次のように呼び出すことができます。ssh_myserver

創造的... / tmpにパーマを書き込んでいる限り
smci

4

ssh configでこのディレクティブを有効にしましたか?

PermitLocalCommand yes

そのデフォルトはです。noこの場合、LocalCommandディレクティブは無視されます。

あるいは、コマンドを.bashrcファイルに追加しようとしましたか?


そのディレクティブはyesに設定されています(そうでなければ、エラーメッセージは表示されないと思います)。.bashrcの使用に伴う問題は、サーバーが異なるホスト名を持つことである、と私は異なる開始ディレクトリに変換するために異なるホスト名を欲しい
ギャレス

各ホスト名に異なるIPアドレスがある場合を除き、サーバーが要求したホスト名を知る方法はありません。HTTP要求は、要求されたホスト名を識別するわかりやすいHost:ヘッダーを提供しますが、SSH接続は提供しません。
フォスコ

4

そのため、多くのWebサイト(stackoverflow、これ)を検索しましたが、必要なものが見つかりませんでした。私は自分のシェルスクリプトを作成することになりました。ここに貼り付けています。また、$ PATHのディレクトリにコピーすることもできます。

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

だからこの後。私がやります:

connect <foldername>

注:パス変数を変更した後、ログアウトして再度ログインする必要がある場合があります


「$ SHELL」は常に有効ですが、「bash」は有効ではない可能性があるため、以前の提案よりもこれを好みます。また、「exec」を使用するのもいい感じです。
デイブ

さらに改良することで、「cd」が成功するようになります-「cd〜/ $ 1 && exec ...」
Dave

3

あなたの~/.ssh/config

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

あなたの終わりに~/.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

エクスポートされた変数を含め、変数の受け渡しを使用してこれを実行しようとしましたが、これらのコマンドは異なるシェルで実行されます。

ところで、あなたがやろうとしていることをテストするとき、引用符で囲まれていない絶対パスを使用してもエラーは発生しませんでした。; pwdコマンドの最後に追加し、正しいディレクトリが表示されますが、最終的にディレクトリはになり~ます。cdシェルスタートアップファイルにはコマンドがありません。私は別のものcd somedir; pwdを入れてみました~/.ssh/rc(もう一方はまだ配置されています)。このconfigコマンドは、motdが発行される前に実行され、rcその後コマンドが発行されますが、シェルスタートアップファイルがソースされる前に実行されます。繰り返しますが、それは別のシェルで発生しています。

ファイルを渡す手法を試してみて、うまくいくかどうかを教えてください。


2

引用符なしで試してみましたか?私が見た唯一の例はそれらを持っていないので、彼らと一緒にcd \ webをコマンドとして実行しようとしている可能性があります。


[OK]を、(編集された記事を参照)引用符は助けるが、私はまだエラーを持っているように見える削除
ギャレス・

1

オプションでこれを試すこともできます-t

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

1

RemoteCommand代わりに使用してみてください、例えば

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand:サーバーに正常に接続した後にリモートマシンで実行するコマンドを指定します。(man ssh_config

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.