私が持っているコードは毎回同じシステムに接続してコマンドを実行する必要があるので、それほど効率的ではないと思います。パスワード:
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
。
答え2
ここではマニュアルを使用できます。
cat <<EOF | ssh $USER@$IP 2>>$LOG
grep x *
grep -i y *.log
EOF