제가 가지고 있는 코드는 매번 동일한 시스템에 연결하고 명령을 실행해야 하기 때문에 그다지 효율적이지 않다고 생각합니다. 암호:
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"
첫 번째 호출에서는 연결 및 인증을 수행하므로 시간이 다소 소요되지만 이후 호출은 훨씬 더 빨라집니다.
물론 세 가지 명령 출력을 세 가지 다른 변수에 넣을 필요가 없다면 다음과 같이 할 수 있습니다.
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