~./bashrc 実行後、ssh 経由でリモートコンピュータのディレクトリを変更します。

~./bashrc 実行後、ssh 経由でリモートコンピュータのディレクトリを変更します。

SSHを介してリモートコンピュータでスクリプトを実行しようとしています。そのためにディレクトリを変更し、そこからスクリプトを実行したいと思います。私が見つけた標準的な方法は次のとおりです。

ssh -Y -t user@server 'cd dir; exec bash'

しかし、問題は、スクリプトを実行する前に〜./bashrcで実行するいくつかの追加スクリプトを設定する必要があることです。私の問題は、〜./bashrcが実行される前にディレクトリ変更が行われるようにコマンドが作成されることです。つまり、以前に設定しなければならなかったコードがめちゃくちゃになります。注:コマンドを次に変更します。

ssh -Y -t user@server 'exec bash; cd dir'

bashは正常に実行されますが、以降のディレクトリは変更されません。よろしくお願いします。

答え1

私の問題は、〜./bashrcが実行される前にディレクトリ変更が行われるようにコマンドが作成されることです。

おそらく~/.bashrc誰もそれをまったく読んでいないでしょう。 Bashは~/.bashrc呼び出されたときにのみ読み取られます。インタラクティブ(非ログイン)シェル。コマンドラインから実行するコマンドを実行すると、sshこのオプションを使用してシェルが実行され、非-c対話型になります。

ただし、手動でソーシングすることでこの問題を解決できます.bashrc

ssh -t user@server '. ~/.bashrc; cd dir; exec bash'

一部のbashrcファイルはシェルが対話型であることを確認し、その場合は変更のみを適用します。bashrcインタラクティブシェルでのみ読み取ることができるため、不要なように聞こえますが、Bashの起動ファイルがどのように機能するかによってbashrc一般的.bash_profileまたは同等のファイルから派生することもあります。)

この問題を解決するには、次のようにBashの対話型呼び出しを強制する必要があります。

ssh -t user@server 'bash -ic "cd /tmp; exec bash"'

.bashrc-iBashが自分でできるので、手動でソーシングする必要はありません。これ第二Bash(from exec bash)もこれを行うことができるので、問題がある場合は最後の部分をexec bash --norc

...

関連設定を複数のファイル(たとえば)に分割することをお勧めします.thingy.rc。次に.bashrc(必要な場合)コマンドを代わりにSSHとして実行します.bashrc

答え2

一つはどうですか?ここ以下のように文書化:

ssh user@server << EOF exec bash       
cd dir
EOF

関連情報