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
-i
Bashが自分でできるので、手動でソーシングする必要はありません。これ第二Bash(from exec bash
)もこれを行うことができるので、問題がある場合は最後の部分をexec bash --norc
。
...
関連設定を複数のファイル(たとえば)に分割することをお勧めします.thingy.rc
。次に.bashrc
(必要な場合)コマンドを代わりにSSHとして実行します.bashrc
。
答え2
一つはどうですか?ここ以下のように文書化:
ssh user@server << EOF exec bash
cd dir
EOF