매번 $(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"

첫 번째 호출에서는 연결 및 인증을 수행하므로 시간이 다소 소요되지만 이후 호출은 훨씬 더 빨라집니다.

물론 세 가지 명령 출력을 세 가지 다른 변수에 넣을 필요가 없다면 다음과 같이 할 수 있습니다.

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

관련 정보