1.设置 SSH 访问

1.设置 SSH 访问

有没有什么办法可以通过 virsh ssh 进入客户虚拟机,而不是查找客户虚拟机的 IP 地址?

例如

我想要的是通过这样的方式 ssh 进入访客:

$virsh ssh_or_somwthing <domain>

但不是这样的:

$ #1) find the guest vm's IP address:
$arp
...
$ #2) ssh someone@<IP>

答案1

Jacek 给出了正确的答案,但我们仅列举一些具体内容:

  1. 使用 KVM GUI 登录虚拟机
  2. 在虚拟机命令行中输入:

    systemctl enable [email protected]
    systemctl start [email protected]
    

系统将多次要求您输入密码/接受。

  1. 重启虚拟机
  2. 然后,在主机的终端上输入:

    sudo virsh console your_vm_name_here
    

显然,用虚拟机名称替换“your_vm_name_here”。

然后您可以使用 直接“ssh”进入虚拟机virsh

答案2

我不太确定,但我认为您正在寻找配置客户机的控制台访问权限的方法?这可能不是唯一的解决方案(没有积极关注 virsh 和所有这些东西)-但您可以在客户机上设置串行控制台,配置主管,然后使用 virsh 控制台域。

无论如何-看看这个: https://help.ubuntu.com/community/KVM/Access- 我想它可能会有所帮助,或者至少能给你提供一些指导。

答案3

您可能需要阅读 libvirtd 的 SSHsetup

https://wiki.libvirt.org/page/SSHSetup

似乎做了你想做的事。

答案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

手动配置

  1. 确保 ssh 守护程序在虚拟机中运行,如果您有交互式访问,则可以运行virsh console $vm_name然后设置 ssh 守护程序。如果没有交互式访问,则需要使用以下任一方法:

    • virt-customize当机器关闭virt-customize -d "$vm_name" --run-command "command to install ssh"
    • expect发送按键来设置虚拟机,可在本答案的附录中找到。
    • 任何其他向虚拟机发送按键的工具
  2. 将您的公钥安装到虚拟机中:

    # 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. 访问虚拟机

  1. 捕获IP地址:
    export vm_ip_address=$(virsh domifaddr my_vm | awk '/ipv4/ {print $4}' | awk -F'/' '{print $1}')
    
  2. 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

相关内容