用語はわかりませんが、基本的に私たちの会社の環境はジャンプホストを使用して設定されているため、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.jar
stdinに圧縮され、リモートssh
シェルのstdinに渡され、最終的にリモートファイルgunzip
にダンプされます。
同様に、出力はjava
stdoutで圧縮されて送信され、ローカルに保存するためにすぐに解凍されますoutput.bin
。
答え3
シェル+期待される
3つのコマンドすべてを使用してスクリプトを作成します
sh
。それでもパスワードを3回入力する必要がありますが、手動コマンドよりも簡単です。スクリプトがあれば、それを使用し
expect
てパスワードを入力できます。ただし、expect
スクリプトにパスワードを公に保存する必要があるため、これは安全ではないと見なすことができます。
個人的には、私はしばしば最初の回避策で止まります。パスワードを何度も入力することは難しくありません(単に面倒です)。しかし、セキュリティ環境が許すならば、expect
奇跡は成り立つかもしれません。