有没有什么办法可以通过 virsh ssh 进入客户虚拟机,而不是查找客户虚拟机的 IP 地址?
例如
我想要的是通过这样的方式 ssh 进入访客:
$virsh ssh_or_somwthing <domain>
但不是这样的:
$ #1) find the guest vm's IP address:
$arp
...
$ #2) ssh someone@<IP>
答案1
Jacek 给出了正确的答案,但我们仅列举一些具体内容:
- 使用 KVM GUI 登录虚拟机
在虚拟机命令行中输入:
systemctl enable [email protected] systemctl start [email protected]
系统将多次要求您输入密码/接受。
- 重启虚拟机
然后,在主机的终端上输入:
sudo virsh console your_vm_name_here
显然,用虚拟机名称替换“your_vm_name_here”。
然后您可以使用 直接“ssh”进入虚拟机virsh
。
答案2
我不太确定,但我认为您正在寻找配置客户机的控制台访问权限的方法?这可能不是唯一的解决方案(没有积极关注 virsh 和所有这些东西)-但您可以在客户机上设置串行控制台,配置主管,然后使用 virsh 控制台域。
无论如何-看看这个: https://help.ubuntu.com/community/KVM/Access- 我想它可能会有所帮助,或者至少能给你提供一些指导。
答案3
答案4
virsh
本身不提供ssh
管理虚拟机*的功能。
如果我们想通过 访问机器ssh
,我们只能通过ssh
命令来实现。
以下是两个步骤。
1.设置 SSH 访问
第一步有两个轨道
预先配置机器(例如:Cloud-Init)
我们可以使用 cloud-init(也可能是 preseed.cfg/kickstart...等等)来安装公钥。
# Cloud-init snippet
users:
- name: your_username
ssh-authorized-keys:
- your_public_ssh_key
手动配置
确保 ssh 守护程序在虚拟机中运行,如果您有交互式访问,则可以运行
virsh console $vm_name
然后设置 ssh 守护程序。如果没有交互式访问,则需要使用以下任一方法:virt-customize
当机器关闭virt-customize -d "$vm_name" --run-command "command to install ssh"
或expect
发送按键来设置虚拟机,可在本答案的附录中找到。
或- 任何其他向虚拟机发送按键的工具
将您的公钥安装到虚拟机中:
# virt-copy-in requires the virtual machine to be stopped # for example this should return `shut off` virsh dominfo my_vm | grep State | awk -F':' '{print $2}' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' # virt-copy-in takes a file argument and a directory argument # thus we need to use a correct filename before copying if [ ! -f ~/.ssh/id_rsa ]; then ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa fi cp ~/.ssh/id_rsa.pub /tmp/authorized_keys # Finally, virt-copy-in may require sudo virt-copy-in -d "$vm_name" /tmp/authorized_keys /home/ubuntu/.ssh/
2. 访问虚拟机
- 捕获IP地址:
export vm_ip_address=$(virsh domifaddr my_vm | awk '/ipv4/ {print $4}' | awk -F'/' '{print $1}')
- ssh 进入机器
export vm_user=ubuntu # set the correct username here ssh $vm_user@$vm_ip_address
*virsh
可以用来ssh
与远程服务器通信,但这与访问虚拟机本身无关。
附录
以下是一个预期代码片段,可用于以非交互方式自动设置交互式控制台访问。
#!/usr/bin/expect -f
# Function to wait for a specific string before sending the command
proc wait_for_prompt { } {
expect "# " ; # Modify the expected prompt if needed
}
# Function to send a command and wait for the output
proc send_command { command } {
send "$command\r"
expect "# " ; # Modify the expected prompt if needed
}
# Replace 'vm_name' with the actual name of your virtual machine
set vm_name "my_vm"
# Replace 'your_command' with the command you want to run inside the VM
set command_to_run1 "sudo apt-get install openssh-server."
set command_to_run2 "sudo systemctl start ssh"
set command_to_run3 "sudo systemctl enable ssh"
#spawn virsh start $vm_name
# Spawn the virsh command
spawn virsh
# Wait for the virsh prompt
expect "virsh # "
# Start the virtual machine
send "start $vm_name\r"
send "console $vm_name\r"
# Wait for the console to start
# Send double enters
send_command ""
send_command ""
expect -timeout 100 "ubuntu login"
# Set password
send_command "ubuntu"
send_command "ubuntu"
# we may need to login again if prompted
send_command "ubuntu"
send_command "ubuntu"
# run the commands
send_command "$command_to_run1"
send_command "$command_to_run2"
send_command "$command_to_run3"
# Wait for the output of the command to appear
expect "your_expected_output" ; # Modify this line to match the expected output
# Exit the console
send "\x1d"
expect eof