2台のコンピュータ間でSSH接続を確立しました。
別のSSHセッションを開始せずにすでに開いている接続を使用して、ローカルコンピュータで実行されているシェルスクリプトからリモートコンピュータにコマンドを送信する方法はありますか?
答え1
あらかじめ計画を立てればとても簡単です。
初めて基本接続を開きます。後続の接続の場合、スレーブ接続は既存のマスター接続を介してルーティングされます。あなたの~/.ssh/config
、接続共有設定が自動的に行われます。
ControlMaster auto
ControlPath ~/.ssh/control:%C
既存の接続と同じ接続(ユーザー、ポート、コンピュータ)でSSHセッションを開始すると、2番目のセッションは最初のセッションを介してトンネルされます。 2番目の接続を確立するために新しい認証は必要なく、非常に高速です。
ControlPersist 600
に入れる.ssh/config
と、トンネルは使用を中止しても10分(600秒)開いたままになります。つまり、最初のセッションを実行し続ける必要はありません。連続セッション10分以上一時停止。
答え2
使用すると簡単に達成できます。CNCツールとSSHトンネル。
1. SSHトンネルを開く
SSHセッションで~C新しい行を入力します。次のSSH「サービスコンソール」プロンプトが表示されます。
ssh>
入力する地域配信SSHトンネルを開くコマンド:
ssh> -L22000:targethost:22001
Forwarding port.
targethost
接続するコンピュータのホスト名またはIPアドレスはどこにありますか?
これで、ターゲットマシンのSSHサーバーがトンネリングを無効にするように構成されていないと仮定すると、必要な接続転送が行われます。ssh
マシンのクライアントはポート22000でリッスンし、そのマシンに送信されたすべてのトラフィックをポート22001に転送しますtargethost
。
2. リモートシステムで Web サーバーを起動します。
これは、すでに開いているSSHセッションに次のコマンドを入力するのと同じくらい簡単です。
remote$ nc -l localhost 22001 | sh
これにより、ポート22001(sshトンネルの宛先ポート)でリッスンしているTCPサーバーが起動し、受信したデータ(おそらくシェルコマンド)がシェルインスタンスにルーティングtargethost
されます。
3. トンネル経由でスクリプトを送信する
local$ cat yourscript.sh | nc localhost 22000
これにより、スクリプト本文がsshトンネルに送信され、最終的にtargethost
sshセッションを介して端末にスクリプト出力が表示されます。
また、この場合、SSHトンネル(ステップ1)は必ずしも必要ではなく、サーバーを開いてインターネット経由で直接接続することもできることを指摘したいと思います。ただし、ターゲットホストに直接接続できない場合(NATの背後など)、SSH暗号化が必要な場合はトンネルが必要です。
答え3
動作するのに少し時間がかかりました。参考ここ完全な例と説明を見るには。
つまり、次のものが必要です。
SSH セッションに関する情報を保存するための SSH 構成ファイルを作成します。
remote=your_ip_address echo "HostName $remote" > ssh_config echo "User root" >> ssh_config echo "ControlMaster auto" >> ssh_config echo "ControlPath ~/.ssh/%C" >> ssh_config master_ssh='ssh -F ssh_config'
メインセッションの開始
$master_ssh -MNf $remote
再同期の実行
rsync -e "$master_ssh" $opts $remote:/etc/some_file1 local_directory/ rsync -e "$master_ssh" $opts $remote:/etc/some_file2 local_directory/ rsync -e "$master_ssh" $opts $remote:/etc/some_file3 local_directory/
基本セッションを閉じる
$master_ssh -O exit $remote