単一接続の scp+ssh+scp

単一接続の scp+ssh+scp

用語はわかりませんが、基本的に私たちの会社の環境はジャンプホストを使用して設定されているため、SSHトンネルを作成するのは非常に遅いです。それで、私は単一のSSHコマンドで次の3つのステップを実行する方法があることを望みました。

$ scp localfile.jar user@server:~/path/ # upload executable
$ ssh user@server java -jar path/localfile.jar some argument >path/output.bin # run it
$ scp user@server:~/path/output.bin . # download output

それはすべてです。どのような方法がありますか? (サーバーは私のローカルコンピュータにアクセスできませんが、おそらくそうです。)ありがとう!

答え1

特に無効にしない限り、多重化を試すことができます。これはまだいくつかのコマンドですが、認証には最初の基本接続のみを使用し、残りのコマンドは事前認証されたチャネルで実行されるため、より速く実行されます。

# Set up master connection to target system
ssh -S "$HOME/.ssh.sock" -M -o ControlPersist=yes -fN user@server

# Perform the commands using the master connection
scp -o ControlPath="$HOME/.ssh.sock" localfile.jar user@server:path/
ssh -S "$HOME/.ssh.sock" user@server java -jar path/localfile.jar some argument >path/output.bin

# Tear down the master connection when you have finished
ssh -S "$HOME/.ssh.sock" -O exit user@server

コマンドはsshすでに出力地元の文書path/output.bin

使用を中止して閉じることを忘れた場合は、デフォルトセッションが自動的に終了するように(たとえば、1分タイムアウトではなくControlPersist=60)、デフォルトセッションのタイムアウトを指定できます。ControlPersist=yes

~/.ssh/ssh_configこれらのタスクを頻繁に実行する場合は、ターゲットのデフォルト設定を再定義することをお勧めしますserver

答え2

どこなのかよく分からないジャンプホスト図にはまっていますが、次の3つのコマンドを使用して実行できます。

< localfile.jar gzip -3 |
  ssh user@server '
    gunzip > path/localfile.jar &&
      java -jar path/localfile.jar some argument | gzip -3
' | gunzip > output.bin

localfile.jarstdinに圧​​縮され、リモートsshシェルのstdinに渡され、最終的にリモートファイルgunzipにダンプされます。

同様に、出力はjavastdoutで圧縮されて送信され、ローカルに保存するためにすぐに解凍されますoutput.bin

答え3

シェル+期待される

  1. 3つのコマンドすべてを使用してスクリプトを作成しますsh。それでもパスワードを3回入力する必要がありますが、手動コマンドよりも簡単です。

  2. スクリプトがあれば、それを使用しexpectてパスワードを入力できます。ただし、expectスクリプトにパスワードを公に保存する必要があるため、これは安全ではないと見なすことができます。

個人的には、私はしばしば最初の回避策で止まります。パスワードを何度も入力することは難しくありません(単に面倒です)。しかし、セキュリティ環境が許すならば、expect奇跡は成り立つかもしれません。

関連情報