页面“Xen虚拟化技术中PV和HVM的区别”与“Expect基础”之间的差异

来自linux中国网wiki
(页面间的差异)
跳到导航 跳到搜索
(创建页面,内容为“en是一个开源的type-1或者裸机管理程序,它使得一个物理主机能够同时并行运行多个相同的或者不同的操作系统实例。Xen是目…”)
 
 
第1行: 第1行:
en是一个开源的type-1或者裸机管理程序,它使得一个物理主机能够同时并行运行多个相同的或者不同的操作系统实例。Xen是目前唯一的开源可得的type-1管理程序。Xen被应用于许多商业和开源的应用程序中,比如:服务器虚拟化(server virtualization)、基础设施即服务(Infrastructure as a Service)、桌面虚拟化(desktop virtualization)、安全应用程序(security applications)、嵌入式和硬件设备(embedded and hardware appliances)。毫无疑问,Xen驱动着当今大部分的云计算市场。
+
[[category:shell]]
 +
=Question=
 +
有个项目要迁移 新来一批机器 要做初始化 于是抽空练了一下expect
 +
  有可能有这个  警告 expect: spawn id exp4 not open 不过效果是没问题的
  
Xen支持运行两种不同类型的虚拟机:半虚拟化(PV)和全虚拟化(HVM)。在一个单一的Xen系统中可以同时运行这两种不同类型的虚拟机。另外,在全虚拟化(HVM)虚拟机中也能够使用半虚拟化(PV)技术:实质上是创建一个半虚拟化(PV)和全虚拟化(HVM)的连续体。这种方式被称为PV on HVM。想要获取更多关于虚拟化的知识可以看这里
+
=利用expect批量添加pubkey=
 +
==多台添加pubkey ==
 +
<pre>
 +
cat main
 +
#!/bin/bash
 +
for ip  in `cat list`
  
那么Xen虚拟化技术中的半虚拟化(PV)和全虚拟化(HVM)有什么区别呢?
+
do
 +
#echo $ip
 +
./addkey  $ip
  
Xen Paravirtualization (PV)
+
done
  
半虚拟化是由Xen引入的高效和轻量的虚拟化技术,随后被其他虚拟化平台采用。半虚拟化技术不需要物理机CPU含有虚拟化扩展。但是,要使虚拟机能够高效的运行在没有仿真或者虚拟仿真的硬件上,半虚拟化技术需要一个Xen-PV-enabled内核和PV驱动。可喜的是,Linux、NetBSD、FreeBSD和OpenSolaris都提供了Xen-PV-enabled内核。Linux内核从2.6.24版本起就使用了Linux pvops框架来支持Xen。这意味着半虚拟化技术可以在绝大多数的Liunx发行版上工作(除了那么内核很古老的发行版)。关于半虚拟化技术的更多信息可以看这里)
 
  
Xen Full Virtualization (HVM)
 
  
全虚拟化或者叫硬件协助的虚拟化技术使用物理机CPU的虚拟化扩展来虚拟出虚拟机。全虚拟化技术需要Intel VT或者AMD-V硬件扩展。Xen使用Qemu来仿真PC硬件,包括BIOS、IDE硬盘控制器、VGA图形适配器(显卡)、USB控制器、网络适配器(网卡)等。虚拟机硬件扩展被用来提高仿真的性能。全虚拟化虚拟机不需要任何的内核支持。这意味着,Windows操作系统可以作为Xen的全虚拟化虚拟机使用(众所周知,除了微软没有谁可以修改Windows内核)。由于使用了仿真技术,通常来说全虚拟化虚拟机运行效果要逊于半虚拟化虚拟机。
+
cat addkey
 +
#!/usr/local/bin/expect
 +
#define var
 +
set timeout 17
 +
# #<==接受第一个参数,赋值host
 +
set host [lindex $argv 0]
 +
set password "evan=="
  
PV on HVM
 
  
为了提高性能,全虚拟化虚拟机也可以使用一些特殊的半虚拟化设备驱动(PVHVM 或者 PV-on-HVM驱动)。这些半虚拟化驱动针对全虚拟化环境进行了优化并对磁盘和网络IO仿真进行分流,从而得到一个类似于或优于半虚拟化虚拟机性能的全虚拟化虚拟机。这意味着,你可以对只支持全虚拟化技术的操作系统进行优化,比如Windows。
+
#spawn  执行的命令在这里,这里用 添加 pub key 作为例子
 +
spawn ssh-copy-id  -i /home/evan/lx/ssh/opspub root@$host
 +
#spawn ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub root@$host
 +
#ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub [email protected]
  
Xen半虚拟化虚拟机自动使用PV驱动-因此不需要提供这些驱动,你已经在使用这些优化过的驱动了。另外,只有Xen全虚拟化虚拟机才需要PVHVM驱动。关于PV on HVM的更多信息可以看这里
+
#expect 去掉交互,让他自动交互完成
 +
expect {                 
 +
"*yes/no" { send "yes\r"; exp_continue} 
 +
"*password:" { send "$password\r" }     
 +
 +
#send  "exit\r" 
 +
expect eof
  
PV in an HVM Container (PVH) - New in Xen 4.4
+
cat list
 +
192.168.7.4
 +
192.168.7.46
  
Xen 4.4会带来一个被称作PVH的新的虚拟化模式。实质上,它是一个使用了针对启动和I/O的半虚拟化驱动的半虚拟化模式。与全虚拟化不同的是,它使用了硬件虚拟化扩展,但是不需要进行仿真。在Xen 4.3发布后,xen-unstable会加入对此模式的补丁,Xen 4.4中将可以预览到这个功能。PVH拥有结合和权衡所以虚拟化模式优点的潜力,与此同时简化Xen的架构。
+
##上面用了copy-id  如果想用scp  etc
  
 +
    #!/usr/bin/expect   
 +
    set timeout 5   
 +
    set hostno [lindex $argv 0]   
 +
    spawn scp ~/.ssh/id_dsa.pub impala$hostno:~/.ssh/pub_key   
 +
    expect "*password*"   
 +
    send "111111\r"   
 +
    spawn ssh impala$hostno "cat ~/.ssh/pub_key/ >> ~/.ssh/authorized_keys"   
 +
    expect "*password*"   
 +
    send "111111\r"   
 +
    spawn ssh impala$hostno "chmod 600 ~/.ssh/authorized_keys"   
 +
    expect "*password*"   
 +
    send "111111\r"   
 +
    expect eof   
  
[[category:ops]]
+
(3)分析:
 +
set可以设置超时,或者设置一个变量的值
 +
spawn是执行一个命令
 +
expect等待一个匹配的输出流中的内容
 +
send是匹配到之后向输入流写入的内容
 +
[lindex $argv 0]表示脚本的第0个参数
 +
expect eof表示读取到文件结束符
 +
 
 +
</pre>
 +
 
 +
==多台修改ssh安全(远程执行命令和退出) ==
 +
<pre>
 +
cat  run
 +
#!/usr/local/bin/expect
 +
#define var
 +
set timeout 17
 +
set host [lindex $argv 0]
 +
set password "evan=="
 +
 
 +
#spawn
 +
spawn ssh root@$host
 +
 
 +
expect {
 +
 
 +
    "*#*" { send "sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config\r";
 +
send "sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config\r"
 +
send "systemctl restart sshd\r"
 +
#send "\r"
 +
    }
 +
}
 +
send  "exit\r" 
 +
expect eof
 +
 
 +
cat main
 +
#!/bin/bash
 +
for ip  in `cat list`
 +
 
 +
do
 +
#echo $ip
 +
#./addkey  $ip
 +
./run  $ip
 +
 
 +
done
 +
 
 +
#run
 +
bash main
 +
</pre>
 +
 
 +
==单个==
 +
<pre>
 +
 
 +
vi addkey
 +
 
 +
#!/usr/local/bin/expect
 +
#SERVERS="101.00.208.197 120.40.043.52 "
 +
set timeout 5 
 +
set host [lindex $argv 0]
 +
spawn ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub root@$host
 +
#ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub [email protected]
 +
expect {                 
 +
"*yes/no" { send "yes\r"; exp_continue} 
 +
"*password:" { send "P2xMGipLpSG7dA==\r" }     
 +
 +
 
 +
expect eof
 +
 
 +
 
 +
用法
 +
./addkey  18.80.216.19 #这是你的IP
 +
</pre>
 +
 
 +
=on dovo=
 +
<pre>
 +
#!/usr/bin/expect
 +
#good on new kali  这个在新的kali 上是ok的
 +
set timeout 30
 +
set sshIP "4.88.1.2"
 +
set keypassword "ZdvV"
 +
set rootPassword "5D"
 +
#spawn ssh -o StrictHostKeyChecking=no -i /root/key  evan@$sshIP
 +
expect "Enter passphrase"
 +
send "$keypassword\r"
 +
expect "]$"
 +
send "sudo -i\r"
 +
expect "xxxxx"
 +
send "$rootPassword\r"
 +
expect "]#"
 +
## run command
 +
#send "cat /root/1  && echo 'test was ok .';exit\r"
 +
#send "bash /data/tmp/dbins  && echo 'dbins  was ok.';exit\r"
 +
#expect "52wan"
 +
#send "exit\r"
 +
#expect eof {exit 0}
 +
interact
 +
 
 +
 
 +
#!/usr/bin/expect
 +
# on old kali  这个在老的kali
 +
set timeout 30
 +
set sshIP "4.88.1.2"
 +
set keypassword "Zd"
 +
set rootPassword "5D"
 +
spawn ssh -o StrictHostKeyChecking=no -i /home/key  evan@$sshIP
 +
expect "Enter passphrase"
 +
send "$keypassword\r"
 +
expect "52wan"
 +
send "sudo -i\r"
 +
expect "password for 52wan:"
 +
send "$rootPassword\r"
 +
expect "]#"
 +
## run command
 +
#send "cat /root/1  && echo 'test was ok .';exit\r"
 +
#send "bash /data/tmp/dbins  && echo 'dbins  was ok.';exit\r"
 +
#expect "52wan"
 +
#send "exit\r"
 +
#expect eof {exit 0}
 +
interact
 +
 
 +
</pre>
 +
 
 +
==sudo addkey ==
 +
<pre>
 +
addkey
 +
#!/bin/bash
 +
#cat main evan  只能秀 sed  1a  不能和3a 会不成功
 +
#for ip  in `cat li`
 +
for ip  in `cat list`
 +
 
 +
do
 +
 
 +
ssh -i .key -o "StrictHostKeyChecking no"  centos@$ip  "sudo mkdir -p /root/.ssh"
 +
ssh -i .key -o "StrictHostKeyChecking no"  centos@$ip "sudo sed -i '1a ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAdfasfBAQDTR3R8Bz2mj lx' /root/.ssh/authorized_keys"
 +
done
 +
</pre>
 +
 
 +
=see also=
 +
[https://www.cnblogs.com/jpinsz/p/10772750.html expect 分发ssh key脚本写得非常规范]
 +
 
 +
[https://www.cnblogs.com/lixigang/articles/4849527.html Shell脚本学习之expect命令完整学习]
 +
 
 +
[https://www.cnblogs.com/changyaoguo/p/5764008.html ssh+expect批量分发]
 +
 
 +
 
 +
[https://www.cnblogs.com/zhaoyangjian724/p/3798006.html expect: spawn id exp4 not open]

2020年1月2日 (四) 07:14的版本

Question

有个项目要迁移 新来一批机器 要做初始化 于是抽空练了一下expect
 有可能有这个  警告 expect: spawn id exp4 not open 不过效果是没问题的

利用expect批量添加pubkey

多台添加pubkey

cat main 
#!/bin/bash
for ip   in `cat list` 

do 
#echo $ip
./addkey  $ip

done 



cat addkey 
#!/usr/local/bin/expect
 #define var
set timeout 17
# #<==接受第一个参数,赋值host
set host [lindex $argv 0]
set password "evan=="


#spawn  执行的命令在这里,这里用 添加 pub key 作为例子
spawn ssh-copy-id  -i /home/evan/lx/ssh/opspub root@$host
#spawn ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub root@$host
#ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub [email protected]

#expect 去掉交互,让他自动交互完成 
expect {                  
 "*yes/no" { send "yes\r"; exp_continue}   
 "*password:" { send "$password\r" }       
 }  
#send  "exit\r"  
expect eof

cat list 
192.168.7.4
192.168.7.46

##上面用了copy-id  如果想用scp  etc 

    #!/usr/bin/expect    
    set timeout 5    
    set hostno [lindex $argv 0]    
    spawn scp ~/.ssh/id_dsa.pub impala$hostno:~/.ssh/pub_key    
    expect "*password*"    
    send "111111\r"    
    spawn ssh impala$hostno "cat ~/.ssh/pub_key/ >> ~/.ssh/authorized_keys"    
    expect "*password*"    
    send "111111\r"    
    spawn ssh impala$hostno "chmod 600 ~/.ssh/authorized_keys"    
    expect "*password*"    
    send "111111\r"    
    expect eof    

(3)分析:
set可以设置超时,或者设置一个变量的值
spawn是执行一个命令
expect等待一个匹配的输出流中的内容
send是匹配到之后向输入流写入的内容
[lindex $argv 0]表示脚本的第0个参数
expect eof表示读取到文件结束符

多台修改ssh安全(远程执行命令和退出)

 cat   run
#!/usr/local/bin/expect
 #define var
set timeout 17
set host [lindex $argv 0]
set password "evan=="

#spawn
spawn ssh root@$host

expect {

    "*#*" { send "sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config\r";
send "sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config\r"
send "systemctl restart sshd\r"
	#send "\r"
    }
}
send  "exit\r"  
expect eof

cat main
#!/bin/bash
for ip   in `cat list` 

do 
#echo $ip
#./addkey  $ip
./run  $ip

done 

#run 
bash main 

单个


vi addkey

#!/usr/local/bin/expect
#SERVERS="101.00.208.197 120.40.043.52 " 
set timeout 5   
set host [lindex $argv 0]
spawn ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub root@$host
#ssh-copy-id  -i /home/evan/.ssh/id_rsa.pub [email protected]
expect {                  
 "*yes/no" { send "yes\r"; exp_continue}   
 "*password:" { send "P2xMGipLpSG7dA==\r" }       
 }  

expect eof


用法 
	./addkey  18.80.216.19 #这是你的IP 

on dovo

#!/usr/bin/expect
#good on new kali  这个在新的kali 上是ok的
set timeout 30
set sshIP "4.88.1.2"
set keypassword "ZdvV"
set rootPassword "5D"
#spawn ssh -o StrictHostKeyChecking=no -i /root/key  evan@$sshIP
expect "Enter passphrase"
send "$keypassword\r"
expect "]$"
send "sudo -i\r"
expect "xxxxx"
send "$rootPassword\r"
expect "]#"
## run command
#send "cat /root/1  && echo 'test was ok .';exit\r"
#send "bash /data/tmp/dbins   && echo 'dbins  was ok.';exit\r"
#expect "52wan"
#send "exit\r"
#expect eof {exit 0}
interact


#!/usr/bin/expect
# on old kali  这个在老的kali
set timeout 30
set sshIP "4.88.1.2"
set keypassword "Zd"
set rootPassword "5D"
spawn ssh -o StrictHostKeyChecking=no -i /home/key  evan@$sshIP
expect "Enter passphrase"
send "$keypassword\r"
expect "52wan"
send "sudo -i\r"
expect "password for 52wan:"
send "$rootPassword\r"
expect "]#"
## run command
#send "cat /root/1  && echo 'test was ok .';exit\r"
#send "bash /data/tmp/dbins   && echo 'dbins  was ok.';exit\r"
#expect "52wan"
#send "exit\r"
#expect eof {exit 0}
interact

sudo addkey

 addkey 
#!/bin/bash
#cat main evan  只能秀 sed  1a  不能和3a 会不成功 
#for ip   in `cat li` 
for ip   in `cat list` 

do 

 ssh -i .key -o "StrictHostKeyChecking no"  centos@$ip  "sudo mkdir -p /root/.ssh"
ssh -i .key -o "StrictHostKeyChecking no"  centos@$ip "sudo sed -i '1a ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAdfasfBAQDTR3R8Bz2mj lx' /root/.ssh/authorized_keys"
done 

see also

expect 分发ssh key脚本写得非常规范

Shell脚本学习之expect命令完整学习

ssh+expect批量分发


expect: spawn id exp4 not open