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
길고 복잡한 명령 시퀀스를 자체 쉘 스크립트에 입력하세요.
virsh-shutdown-remote.sh
입력 리디렉션을 실행
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
내가 escaped했다는 점에 유의하십시오 $?
. 그렇지 않으면 원격 쉘이 아닌 로컬 쉘에 의해 평가됩니다. 로컬로 정의 되었으므로 $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"