リモート マシンでローカル シェル スクリプト (Windows/Linux) を実行する必要があります。
マシン A と B の両方で SSH を構成しました。スクリプトはマシン A にあり、リモート マシンであるマシン B でコードの一部を実行します。
ローカル コンピュータとリモート コンピュータは、Windows または Unix ベースのシステムのいずれかです。
plink/ssh を使用してこれを実行する方法はありますか?
リモート マシンでローカル シェル スクリプト (Windows/Linux) を実行する必要があります。
マシン A と B の両方で SSH を構成しました。スクリプトはマシン A にあり、リモート マシンであるマシン B でコードの一部を実行します。
ローカル コンピュータとリモート コンピュータは、Windows または Unix ベースのシステムのいずれかです。
plink/ssh を使用してこれを実行する方法はありますか?
マシン A が Windows ボックスの場合、 -m パラメータを指定して Plink ( PuTTYの一部) を使用すると、リモート サーバーでローカル スクリプトが実行されます。
plink root@MachineB -m local_script.sh
マシン A が Unix ベースのシステムの場合、次を使用できます。
ssh root@MachineB 'bash -s' < local_script.sh
スクリプトを実行するために、スクリプトをリモート サーバーにコピーする必要はありません。
これは古い質問であり、ジェイソンの答えはうまくいきますが、これを追加したいと思います:
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
これは、ユーザー入力が必要な su およびコマンドでも使用できます。'
(エスケープされたヒアドキュメントに注意してください)
編集:この回答はトラフィックのビットを取得し続けるため、ヒアドキュメントのこの素晴らしい使用法にさらに情報を追加します:
この構文を使用してコマンドをネストできます。これが、ネストが機能しているように見える唯一の方法です (正気の方法で)。
ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
telnet や ftp などのサービスと実際に会話することができます。
編集: !を使用すると、内部をタブでインデントできることがわかりました。<<-END
ssh user@host <<-'ENDSSH'
#commands to run on remote host
ssh user@host2 <<-'END2'
# Another bunch of commands on another host
wall <<-'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<-'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
(私はこれがうまくいくと思います)
http://tldp.org/LDP/abs/html/here-docs.htmlも参照してください 。
また、宛先ホストから変数を取得する場合は、変数をエスケープすることを忘れないでください。
これは過去に私を捕まえました。
例えば:
user@host> ssh user2@host2 "echo \$HOME"
/home/user2 を出力します
その間
user@host> ssh user2@host2 "echo $HOME"
/home/user を出力します
もう一つの例:
user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"
「こんにちは」を正しく出力します。
これは、ローカル マシンからリモート ホストに ENV 変数を渡すインライン リモート コマンドを組み合わせて、リモート側でスクリプトをパラメータ化できるようにする YarekT の回答の拡張です。
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
# commands to run on remote host
echo $ARG1 $ARG2
ENDSSH
すべてを 1 つのスクリプトにまとめると、非常に読みやすく保守しやすくなるため、非常に役立ちます。
これが機能する理由。ssh は次の構文をサポートしています。
ssh user@host remote_command
bash では、次のように 1 行でコマンドを実行する前に、定義する環境変数を指定できます。
ENV_VAR_1='value1' ENV_VAR_2='value2' bash -c 'echo $ENV_VAR_1 $ENV_VAR_2'
これにより、コマンドを実行する前に変数を簡単に定義できます。この場合、echo は実行中のコマンドです。echo より前のすべては、環境変数を定義します。
そこで、これら 2 つの機能と YarekT の回答を組み合わせて、次の結果を得ます。
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'...
この場合、ARG1 と ARG2 をローカル値に設定しています。user@host の後のすべてを remote_command として送信します。リモート マシンがコマンド ARG1 と ARG2 を実行すると、リモート サーバーで環境変数を定義するローカル コマンド ライン評価のおかげでローカル値が設定され、それらの変数を使用して bash -s コマンドが実行されます。出来上がり。
<hostA_shell_prompt>$ ssh user@hostB "ls -la"
hostA ユーザーの公開鍵をユーザー .ssh のディレクトリのホームにある authorized_keys ファイルにコピーしていない限り、パスワードの入力を求めるプロンプトが表示されます。これにより、パスワードなしの認証が可能になります(sshサーバーの構成で認証方法として受け入れられた場合)
より高度な操作のためにFabricを使い始めました。Fabric には Python と他のいくつかの依存関係が必要ですが、それはクライアント マシン上のみです。サーバーは ssh サーバーである必要があります。このツールは、SSH に引き渡されたシェル スクリプトよりもはるかに強力であり、セットアップに苦労するだけの価値があると思います (特に Python でのプログラミングを楽しんでいる場合)。ファブリックは、複数のホスト (または特定の役割のホスト) で実行中のスクリプトを処理し、べき等操作 (config スクリプトに行を追加するなど、既に存在する場合は追加しない) を容易にし、より複雑なロジック (Python など) の構築を可能にします。言語で提供できます)。
実行してみてくださいssh user@remote sh ./script.unx
。
「リモート」マシンに手動でログインせずに、「ローカル」マシンからこれを自動的に行いたいと仮定すると、Expect と呼ばれる TCL 拡張機能を調べる必要があります。これは、まさにこの種の状況向けに設計されています。また、SSH 経由でログイン/対話するためのスクリプトへのリンクも提供しました。
まず、scp を使用してスクリプトをマシン B にコピーします。
[user@machineA]$ scp /path/to/script user@machineB:/home/user/path
次に、スクリプトを実行するだけです
[user@machineA]$ ssh user@machineB "/home/user/path/script"
これは、スクリプトに実行権限を与えている場合に機能します。