毎回$(ssh user@ipコマンド)の代わりにbashスクリプトにssh接続を保存できますか?

毎回$(ssh user@ipコマンド)の代わりにbashスクリプトにssh接続を保存できますか?

私が持っているコードは毎回同じシステムに接続してコマンドを実行する必要があるので、それほど効率的ではないと思います。パスワード:

tmp=$(ssh -nq $USER@$IP "$COMMAND" 2>> $LOG)
tmp1=$(ssh -nq $USER@$IP "$COMMAND1" 2>> $LOG)
tmp2=$(ssh -nq $USER@$IP "$COMMAND2" 2>> $LOG)
tmp3=$(ssh -nq $USER@$IP "$COMMAND3" 2>> $LOG)

ほとんどの場合、$COMMAND一種のgrep

SSH接続を何とか保存したり、コードをリファクタリングして毎回システムに接続しないようにすることはできますか?

ベストアンサー1

リモートユーザーのシェルがksh93、zsh、bash(またはshこれらのいずれかで実装されている場合)の場合は、次のことができます。

eval "$(ssh -nq "$user@$host" '
  printf "%s=%q\n" \
    tmp1 "$(command1)" \
    tmp2 "$(command2)" \
    tmp3 "$(command3)"')"

ただし、リモートコマンドの終了ステータスは失われます。これにより、リモートユーザーに任意のコマンドを実行させることができます(たとえば、自分のコマンドに何かを入力するなど~/.bashrc)。

別のオプションは、SSHの機能を使用してControlMaster複数の呼び出し間で接続を共有することです。sshこのモードを使用することもできますauto。それは次のとおりです。

mkdir -p -- ~/.ssh/ctl
tmp1=$(ssh -o ControlMaster=auto \
           -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" \
           -o ControlPersist=5m -nq "$user@$host" cmd1)

(同じ… tmp2)。この構文は、既存の接続がある場合はそれを再利用し、そうでない場合は新しい接続を作成します。 5分間アクティビティがないと終了します。または、次のように明示的に終了できます。

ssh -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" -O exit "$user@$host"

最初の呼び出しでは接続と認証が行われるため、時間がかかりますが、その後の呼び出しははるかに高速になります。

もちろん、3つのコマンド出力を3つの異なる変数に入れる必要がない場合は、次のようにすることができます。

tmp=$(ssh -nq "$user@$host" '
   cmd1
   cmd2
   cmd3')

したがって、3つのコマンド出力が連続して表示されます$tmp

おすすめ記事