「ストリーム」コマンドへの永続的なSSH接続を一定期間作成するにはどうすればよいですか?


9

SSH経由でコマンドをネットワーク上の別のPC(両方のマシンでLinuxを実行しているマシン)に送信しているPCでアプリケーションを実行しているとしましょう。

たとえば、#1で何かが発生するたびに、#2でタスクを実行したいと思います。このセットアップでは、コマンドごとにSSH接続を作成する必要があります。

カスタムクライアント/サーバーアプリケーションをプログラミングせずに、基本的なUNIXツールでこれを行う簡単な方法はありますか?基本的に私が望んでいるのは、SSH経由の接続を確立してから、次々にコマンドを送信することです。


回答:


12

本番環境で使用できるかどうかはわかりませんが、次のようなことができます。

#1にファイルを作成

1> touch /tmp/commands

次に、コマンドを実行します。

1> tail -f /tmp/commands | ssh username@x.x.x.x

ファイル/ tmp / commandsを開き、その内容をサーバーxxxx(#2)に送信し、そこで行ごとに実行します

今、#1で何かが起こるたびに:

1> echo "ls -l" >> /tmp/commands

または

1> echo "reboot" >> /tmp/commands

ファイル/ tmp / commandsに追加したものはすべて#2に送信されて実行されます。インタラクティブなものを実行したり、何らかの方法で対処したりしないでください。


これはまさに私が探していたもので、非常に創造的な解決策です:)
Jakub Arnold

5
を使用する必要があることを追加しますtail -F。これにより、ファイルが置き換えられたことを検出できます。そのため、ファイルが巨大になった場合は、ファイルを消去して新しいファイルからやり直すことができます。
DerfK、

3
または、@ DerfKのmkfifo /tmp/commands方が優れたソリューションである必要があります
solotim


18

OpenSSHを使用した自動永続性

ControlMasterOpenSSH の機能を使用することもできます。これは、最初の接続用にUNIXドメインソケットを開き、この接続を後続のすべての呼び出しで再利用します。

この機能を有効にするには-M、コマンドラインスイッチとして使用するか、でControlMasterオプションを有効にします~/.ssh/ssh_config。例:

ControlMaster auto

さらに、ControlPath次の行を使用してを設定する必要があります~/.ssh/ssh_config

Host *
   ControlPath ~/.ssh/master-%r@%h:%p

ホストへの永続的な接続を維持するには、たとえば、ホストへの多くのssh接続を確立する必要があるスクリプトを実行したい場合、スクリプトの存続期間中どれも永続的ではない場合、事前にサイレント接続を開始できます。

ssh -MNf remotehost

Cheerio、nesono


私はあなたの答えに+1投票するためだけにサーバー障害にサインインしました。あなたは働いた!
カルマ

ssh -Nリモートコマンドなしでセッションを開始します。ssh_configに対応するオプションがないようです。
ジョークスター2013年

2

/etc/ssh/ssh_config追加

# Send keep alive signal to remote sshd
ServerAliveInterval 60

2

この種の問題に頻繁に遭遇した場合は、Parallelを試してください。これはdsh(分散シェル)に似ていますが、セマフォのカウントなどのきちんとした機能があり、アクティブに維持されます。

ドキュメントから:

例:キューシステム/バッチマネージャーとしてのGNU Parallel

GNU Parallelは、単純なジョブキューシステムまたはバッチマネージャーとして機能します。アイデアは、ジョブをファイルに入れて、GNU Parallelに継続的に読み取らせることです。GNU Parallelはファイルの終わりで停止するため、tailを使用して読み続けます。

echo >jobqueue; tail -f jobqueue | parallel

ジョブをキューに送信するには:

echo my_command my_arg >> jobqueue

もちろん、-Sを使用して、ジョブをリモートコンピューターに分散できます。

echo >jobqueue; tail -f jobqueue | parallel -S ..

表面をなぞっただけの素晴らしい例がたくさんあります。ここにクールなものがあります。

例:ローカルおよびリモートコンピューターへの作業の分散

* .mp3を* .oggに変換し、ローカルコンピューターとサーバー2のCPUコアごとに1つのプロセスを実行します。

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3

0

はい、パイプで可能です:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

これにより、コマンドecho "hi"がhost2で実行されます

あなたはただプログラムを書く必要があります、それはちょうどコマンドを与える(;を忘れないでください)そしてそれからその出力をsshにパイプする


0

それだけを行うように作られたdsh(分散シェル)のようなプログラムを使用したい場合があります:)ホスト名で構成してpublickeya authを設定したら、それを使用して複数のマシンでコマンドを連続して実行できます( "runマシンaでマシンbで実行 ")またはパラレルで実行("すべてのマシンで同時に実行 ")。または単にスクリプトを作成する

#!/bin/sh
ssh machine -- $@
exec $@

0

免責事項:bashを使用しているがsshを使用していないWindowsマシンを使用しているため、現在これをテストすることはできません。

bashスクリプトでは、次のようなことができます。

exec 4> >(ssh --ssh-options-here user@host)

そして、コマンドを送信するには、それらをFD 4に書き込みます。

echo 'echo hi' >&4

このようにすると、コマンドの結果に簡単にアクセスできなくなりますが、質問からすると、必要なようには見えません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.