SSHコマンドによるリモートスクリプトの実行

SSHコマンドによるリモートスクリプトの実行

リモートDebianサーバーシステムには、次のコマンドを実行してスクリプトを実行します。

ssh server "find.sh"

私のものfind.shスクリプトは次の場所にあります。

/home/user/bin

まず、走ったSSHサーバー "echo $PATH"次のパスで応答します。

/home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

したがって、PATH変数はまともなように見えますが、うまくいきません。動作させる唯一の方法は、フルパスを呼び出すことです。

ssh server "/home/user/bin/find.sh"

フルパスを指定せずに簡単に操作できる方法はありますか?

答え1

ターゲットサーバーのファイル$PATHでファイルの先頭に定義する必要があります~/.bashrc

export PATH=$PATH:/home/user/bin

https://stackoverflow.com/questions/940533/how-do-i-set-path-such-that-ssh-userhost-command-works:

Bash は非対話モードで ~/.bashrc ファイルを読み込みます。

答え2

ssh server "echo $PATH"さまざまな動作モードssh server "find.sh"。最初のものはシェルメタ文字(特に空白)を含むため、「sh -c 'specified_command')」で実行され、2 番目はそうでないため、「exec('specified_command')」によって実行されます。違いは微妙ですが、この場合(環境変数を設定するシェルであるため)、予期しない副作用がある可能性があります。

次のタスクを実行して、シェルを強制的に実行できます。ssh server 'bash -c "find.sh"'

答え3

入力はローカルに拡張されssh server "echo $PATH"ますPATH。したがって、実際に実行するコマンドはであり、サーバーはサーバー側の内容ssh server "echo /home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"に関係なく、それを受信するたびに同じ出力を生成します。サーバー側で拡張するPATHには、代わりに:を使用できます。ローカル拡張を防ぐために一重引用符が使用されることに注意してください。PATHssh server 'echo "$PATH"'$PATH

関連情報