web-dev-qa-db-ja.com

ローカルマシン上のリモートサーバーからシェルスクリプトを実行する

リモートサーバー上のシェルスクリプトを次のように想像してください。

#!/bin/bash
rm /test.x

(可能であれば)ローカルマシンからこのスクリプトを実行して、ローカルマシンの/test.xファイルを削除するにはどうすればよいですか。明らかに、解決策はssh認証のようなものである必要がありますが、リモートサーバーからスクリプトファイルをダウンロードする必要はありません。

実際、ローカルマシンで実行するシェルコマンドのプロバイダーとしてリモートスクリプトを使用したいと思います。

5
Googlebot

スクリプトのコンテンツを何らかの方法でダウンロードする必要があります。あなたができる

ssh remote-Host cat script.bash | bash

しかし、それは次と同じ種類の問題を抱えています:

cat script.bash | bash

つまり、スクリプト内のstdinはスクリプト自体になります(スクリプト内のコマンドがユーザーから何らかの入力を取得する必要がある場合に問題になる可能性があります)。

次に、より良い代替手段(ただし、ksh、zsh、bashなどのプロセス置換をサポートするシェルが必要です)は次のようになります。

bash <(ssh remote-Host cat script.bash)

どちらのアプローチも、コンテンツを取得するという点でスクリプトをダウンロードしますが、ローカルには保存しません。代わりに、コンテンツはパイプに送られ、そのもう一方の端はbashによって読み取られて解釈されます。

次の方法で、現在のbashプロセスでリモートスクリプトのコンテンツを実行することもできます。

eval "$(ssh remote-Host cat script.bash)"

ただし、スクリプトを実行する前に、スクリプトを完全にダウンロード(およびメモリに保存)します。

明らかな解決策は次のことです。

. <(ssh remote-Host cat script.bash)

ただし、bashの一部のバージョンには問題があることに注意してください。

11

sshfs を使用してスクリプトを含むリモートファイルシステムをマウントします。これにより、スクリプトは実行方法がわかっているローカルファイルになります。

mkdir /path/to/remote-Host
sshfs remote-Host:/ /path/to/remote-Host
/path/to/remote-Host/path/to/script