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
私は2番目の部分でも同じことをし、;で区切ることができると思いました。しかし、誰かが後で私のコードを読むと、頭を傷つけるかもしれません...
読みやすく意味があり、すべてのリモートコマンドが正しく実行されるように、これらすべての項目をフォーマットする方法はありますか?
答え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
1行に同じ内容をはるかに簡単で短くすることができます。
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"