ログイン時に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
これにより、引用符が存在してはならず、別のエラーが発生していると思います。
cdは組み込みのシェルです。 LocalCommandは次のように実行されます。
/bin/sh -c <localcommand>
あなたが何をしようとしているのかは、実際にはSSH経由では実現できません。シェルを何らかの方法で変更する必要があります。 bashrc/bash_profile経由。
<約10年後に編集...>
とにかく、LocalCommand
はあなたが望むものではありません。 yourマシンで実行されます。 RemoteCommand
が必要です。このようなものが私にとってうまくいきました:
Host example.net
RemoteCommand cd / && exec bash --login
RequestTTY yes
これは機能します:
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_profile
cd /path/to/your/destination
を追加します/path/to/your/destination
にアクセスできますSshを実行してデフォルトの.bashrcファイルをオーバーライドする必要がある場合のためのより堅牢なソリューション。これは、リモートサーバー環境に複数のdocrootがあり、複数のユーザーが使用している場合に役立ちます。
alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'
より詳細な:
.bashrc_tmp
ディレクトリに/tmp
ファイルを作成し、コンテンツcd /path/to/dir
を作成しますbash
を実行します。これにより、目的のディレクトリに切り替えて、デフォルトの.bashrc
を抑制することができます。alias
としてラップされているため、sshクライアントコマンドプロンプトではssh_myserver
として呼び出すことができますだから私はたくさんのウェブサイト(stackoverflow、this one)を検索しましたが、私が欲しかったものが見つかりませんでした。自分のシェルスクリプトを作成してしまいました。ここに貼り付けています。また、$ PATHのディレクトリにコピーすることもできます。
#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$Shell --login"
だからこの後。私がやります:
connect <foldername>
注:パス変数を変更した後、ログアウトして再度ログインする必要がある場合があります
Ssh設定でこのディレクティブを有効にしましたか?
PermitLocalCommand yes
そのデフォルトはno
です。この場合、LocalCommand
ディレクティブは無視されます。
または、.bashrc
ファイルにコマンドを追加してみましたか?
~/.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を実行しようとしている可能性があります。
代わりにRemoteCommand
を使用してみてください。
Host myhost
HostName IP
User ubuntu
IdentityFile ~/.ssh/id_rsa
RemoteCommand cd web; $Shell -il
RemoteCommand
:サーバーに正常に接続した後にリモートマシンで実行するコマンドを指定します。 (man ssh_config
)
オプション-t
を使用してこれを試すこともできます:
ssh server -t "cd /my/remote/directory; bash"