원격 시스템에서 if 문 실행

원격 시스템에서 if 문 실행

if 문이 포함된 명령 세트를 원격 컴퓨터에서 실행하려고 합니다. 저는 이것을 kvm 인스턴스 목록을 종료하는 데 사용하고 있습니다. 첫 번째 줄은 괜찮지만 더 아름다울 수 있습니다. 나머지는 도움이 필요합니다.

ssh root@kvmsrv 'virsh shutdown $host 2> /dev/null; virsh destroy $host 2> /dev/null; sleep 2; virsh undefine $host 2> /dev/null'

# Also needs to be run on remote machine
# to disconnect iscsi
iscsiadm -m session | grep $host
if [ $? == 0 ]; then
  iscsiadm -m node -T $stserver.$host -u
fi

# then on local machine
tid=`ssh root@storage1 'cat /proc/net/iet/volume' | grep $host | head -1 | awk '{print $1}' | awk -F: '{print $2}'`
if [ $tid ]; then
  echo "Deleting tid:$tid from $stserver."
  ssh root@$stserver "ietadm --op delete --tid=$tid"
fi

두 번째 부분에도 동일한 작업을 수행할 수 있을 것 같습니다. ; 하지만 나중에 누군가가 내 코드를 읽으러 간다면 아마도 머리를 긁적일 것입니다...

이 모든 것을 읽을 수 있고 의미가 있으며 모든 원격 명령이 제대로 실행되도록 형식을 지정할 수 있는 방법이 있습니까?

답변1

  1. 길고 복잡한 명령 시퀀스를 자체 쉘 스크립트에 넣어서 호출해 보겠습니다.virsh-shutdown-remote.sh

  2. 입력 리디렉션을 실행 ssh하고 사용하여 스크립트를 실행합니다.

    ssh root@kvmsrv < virsh-shutdown-remote.sh
    

어떤 경우에도 스크립트에 명령을 넣는 것은 좋은 생각입니다.

추가 팁으로 다음 대신:

iscsiadm -m session | grep $host
if [ $? == 0 ]; then
  iscsiadm -m node -T $stserver.$host -u
fi

같은 내용을 한 줄에 더 간단하고 짧게 작성할 수 있습니다.

iscsiadm -m session | grep $host && iscsiadm -m node -T $stserver.$host -u

답변2

HEREDOCS다음과 같이 사용할 수 있습니다 .

ssh root@kvmsrv <<EOF
  virsh shutdown $host 2> /dev/null
  virsh destroy $host 2> /dev/null
  sleep 2
  virsh undefine $host 2> /dev/null

  # to disconnect iscsi
  iscsiadm -m session | grep $host
  if [ \$? == 0 ] ; then
    iscsiadm -m node -T $stserver.$host -u
  fi
EOF

$?그렇지 않으면 원격 셸이 아닌 로컬 셸에서 평가되므로 이스케이프 처리했다는 점에 유의하세요 . 로컬로 정의된 것처럼 $host이스케이프할 필요는 없습니다.

당신이 그것을 요청하지 않았지만 단지 작은 의견입니다. 호스트에 명시적으로 SSH를 연결할 필요 없이 원격으로 virsh 명령을 실행할 수 있습니다. 예:

virsh -c qemu+ssh://root@kvmsrv/system destroy host

작동합니다. 또한 libvirt를 사용하면 SSL 인증서로 인증할 수 있으므로 SSH가 필요하지 않습니다.

답변3

어쩌면 명백해야 하는 것들을 설명하기 위해 해설을 추가할 수도 있을까요? 나는 처음에 [검열된] 것을 썼을 때 내가 무엇을 했는지를 내 무지한 엉덩이에게 상기시키기 위해 대본에서 정기적으로 이 작업을 수행합니다.

답변4

글쎄, 간단한 대답은 실제로 다음 ssh root@kvmsrv 'cmd1; cmd2; cmd3'과 같이 다시 작성할 수 있다는 것입니다.

ssh root@kvmsrv '
cmd1
cmd2
cmd3
'

기억해야 할 유일한 점은 작은따옴표 "내부"는 다음과 같이 표현되어야 한다는 것입니다 '\''. 예:

ssh localhost '
echo hi
whoami
ls -ld /
var="'\''"
echo "$var"
if [ $? == 0 ]; then
   echo "escaping single quote worked"
fi
'

# get single quote from file and print it
echo "'" > sqfile
ssh localhost '
#set -xv
echo hi
cat sqfile
var="$(cat sqfile)"
echo "$var"
'

# pass a single quote to the remote host and print it
# while keeping the outer single quotes for the ssh command
escsquote="'\''"
squote="'"
squote="'${squote//\'/${escsquote}}'" # bash

ssh localhost 'sh -c '\''
#set -xv
echo hi
echo "$1"
'\''' _ "$squote"

관련 정보