web-dev-qa-db-ja.com

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

ログイン時に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

これにより、引用符が存在してはならず、別のエラーが発生していると思います。

91
Gareth

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

/bin/sh -c <localcommand>

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

<約10年後に編集...>

とにかく、LocalCommandはあなたが望むものではありません。 yourマシンで実行されます。 RemoteCommandが必要です。このようなものが私にとってうまくいきました:

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

これは機能します:

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

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

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

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

81
  1. ボックスにログイン
  2. 編集~/.bash_profile
  3. ファイルの最後にcd /path/to/your/destinationを追加します
  4. 保存して終了
  5. ボックスからログアウト
  6. もう一度ログインすると、/path/to/your/destinationにアクセスできます
48
sobi3ch

Sshを実行してデフォルトの.bashrcファイルをオーバーライドする必要がある場合のためのより堅牢なソリューション。これは、リモートサーバー環境に複数の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ディレクトリに/tmpファイルを作成し、コンテンツcd /path/to/dirを作成します
  2. 次のコマンドは、手順1で指定した構成ファイルを使用してbashを実行します。これにより、目的のディレクトリに切り替えて、デフォルトの.bashrcを抑制することができます。
  3. このコマンド全体はaliasとしてラップされているため、sshクライアントコマンドプロンプトではssh_myserverとして呼び出すことができます
5
Alex Skrypnyk

だから私はたくさんのウェブサイト(stackoverflow、this one)を検索しましたが、私が欲しかったものが見つかりませんでした。自分のシェルスクリプトを作成してしまいました。ここに貼り付けています。また、$ PATHのディレクトリにコピーすることもできます。

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

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

connect <foldername>

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

5
Aryan

Ssh設定でこのディレクティブを有効にしましたか?

PermitLocalCommand yes

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

または、.bashrcファイルにコマンドを追加してみましたか?

4
EEAA

~/.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を追加すると正しいディレクトリが表示されますが、最終的には~になります。 Shellスタートアップファイルにcdコマンドがありません。別のcd somedir; pwd~/.ssh/rcに入れてみました(他のものはそのままです)。 configコマンドは、motdが発行される前に実行され、rcコマンドは後で発行されますが、シェルの起動ファイルが読み込まれる前に実行されます。繰り返しになりますが、別のシェルで発生しています。

ファイル渡しの手法を試してみて、うまくいくかどうかをお知らせください。

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

2
James L

代わりにRemoteCommandを使用してみてください。

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

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

1
kenorb

オプション-tを使用してこれを試すこともできます:

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