温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。
有时候由于意外情况,导致无法直接连接到虚拟机实例,这时候 VNC 或者串行就派上用场了。
一、VNC 连接和串行连接是什么?
简单来讲,就是在虚拟机之上的母机中,开启一条通道来连接虚拟机,至于是 VNC 还是串行,本质上并无不同,看自己用哪个方便。
VNC 一般是用于当跳板来连接虚拟机,串行则是直接连接虚拟机。
另外,VNC 连接和串行连接,准确来讲,应该叫 VNC 控制台连接、串行控制台连接。
二、使用先决条件
为方便说明,简单画个流程图
客户端电脑 A ---> 创建连接的电脑 B ---> 创建的 Oracle 连接 ---> 实际要连接的 Oracle Cloud 虚拟机
其中 A 与 B 可以是同一台电脑。
对于电脑 B:
1、既然是利用 OCI 命令,那么一切开始之前,需要先配置好 OCI 环境,可参见之前的文章《Oracle Cloud 甲骨文云对象存储 ObjectStorage API(OCI)详细使用说明》中的“环境配置”一节,这里不再赘述。
对于电脑 A 与 B:
2、还需要 SSH 密钥对,可以与创建实例时使用的一样,连接本质上还是利用 SSH 来加密,所以开始之前需要准备好。配置过程若出现密钥格式错误,可参见文章《Oracle Cloud 甲骨文云控制台添加 API 密钥格式错误问题》处理。
以上两个是创建连接的前提条件,使用时:
对于电脑 A 或 B:
3、若是 Windows:plink.exe
(PuTTY 附带的命令链接连接工具。您可以安装 PuTTY 或 plink.exe 单独安装);
对于电脑 A,若要使用 VNC 连接,则需要先安装支持 VNC 协议的客户端。
三、创建连接
1、首先使用命令获取虚拟机实例 ID:
root@oc-jp:~# oci compute instance list --query "data[*].{NAME:\"display-name\",ID:\"id\",COMPARTMENTID:\"compartment-id\",SHAPE:\"shape\",DOMAIN:\"availability-domain\",DATE:\"time-created\",STATE:\"lifecycle-state\",REGION:\"region\"}"
[
{
"COMPARTMENTID": "ocid1.tenancy.oc1..***",
"DATE": "2019-09-18T15:18:14.856000+00:00",
"DOMAIN": "cBpy:AP-TOKYO-1-AD-1",
"ID": "ocid1.instance.oc1.ap-tokyo-1.***",
"NAME": "oc-jp",
"REGION": "ap-tokyo-1",
"SHAPE": "VM.Standard.E2.1.Micro",
"STATE": "RUNNING"
}
]
注意,如果有多台虚拟机,则会返回多个结果,注意区分到底要操作哪台虚拟机。
2、然后检查一下是否已存在生效的连接(没有才需要创建不是吗?):
root@oc-jp:~# oci compute instance-console-connection list --instance-id ocid1.instance.oc1.ap-tokyo-1.** --query "data[*].{INSTANCE:\"instance-id\",CONNECTION:\"connection-string\",VNC:\"vnc-connection-string\"}"
[
{
"CONNECTION": "ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.**@instance-console.ap-tokyo-1.oci.oraclecloud.com' ocid1.instance.oc1.ap-tokyo-1.**",
"INSTANCE": "ocid1.instance.oc1.ap-tokyo-1.**",
"VNC": "ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.**@instance-console.ap-tokyo-1.oci.oraclecloud.com' -N -L localhost:5900:ocid1.instance.oc1.ap-tokyo-1.**:5900 ocid1.instance.oc1.ap-tokyo-1.**"
}
]
I、若有返回结果,说明有生效的连接,可以直接使用,其中 CONNECTION
是串行连接,VNC
是 VNC 连接。
II、若没有返回结果,则需要新创建连接;
3、新创建连接(VNC 和串行是一起的,只要运行一次即可):
root@oc-jp:~# oci compute instance-console-connection create --instance-id ocid1.instance.oc1.ap-tokyo-1.*** --ssh-public-key-file SSH公钥路径
{
"data": {
"compartment-id": "ocid1.tenancy.oc1..***",
"connection-string": "ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.***@instance-console.ap-tokyo-1.oci.oraclecloud.com' ocid1.instance.oc1.ap-tokyo-1.***",
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "***",
"CreatedOn": "2024-04-08T02:42:40.619Z"
}
},
"fingerprint": "SHA256:***",
"freeform-tags": {},
"id": "ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.***",
"instance-id": "ocid1.instance.oc1.ap-tokyo-1.***",
"lifecycle-state": "CREATING",
"service-host-key-fingerprint": "SHA256:***",
"vnc-connection-string": "ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.***@instance-console.ap-tokyo-1.oci.oraclecloud.com' -N -L localhost:5900:ocid1.instance.oc1.ap-tokyo-1.***:5900 ocid1.instance.oc1.ap-tokyo-1.***"
},
"etag": "6fc8fd4771***"
}
返回如上数据,说明连接创建成功。
四、如何使用
在上一节中,我们已经获取到了串行连接(CONNECTION
或 connection-string
)和 VNC 连接(VNC
或 vnc-connection-string
)。
两者的区别在于,串行是可以直接本机连接到虚拟机实例(直接运行后面的命令);VNC 则是通过 VNC 服务开启了转发,可以在本机通过 VNC 客户端来连接(直接运行后面的命令),也可以在其他电脑通过 VNC 客户端来连接(将命令中的 localhost
改成 0.0.0.0
,同理 5900
端口也可以改)。
比如我要在其他电脑通过 VNC 来连接虚拟机,则在本机运行 VNC
或 vnc-connection-string
后面的命令 ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.***@instance-console.ap-tokyo-1.oci.oraclecloud.com' -N -L 0.0.0.0:5900:ocid1.instance.oc1.ap-tokyo-1.***:5900 ocid1.instance.oc1.ap-tokyo-1.***
:
root@oc-jp:~# ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.***@instance-console.ap-tokyo-1.oci.oraclecloud.com' -N -L 0.0.0.0:5900:ocid1.instance.oc1.ap-tokyo-1.***:5900 ocid1.instance.oc1.ap-tokyo-1.***
The authenticity of host '[instance-console.ap-tokyo-1.oci.oraclecloud.com]:443 ([140.204.8.241]:443)' can't be established.
RSA key fingerprint is SHA256:***.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[instance-console.ap-tokyo-1.oci.oraclecloud.com]:443,[140.204.8.241]:443' (RSA) to the list of known hosts.
=================================================
IMPORTANT: Use a console connection to troubleshoot a malfunctioning instance. For normal operations, you should connect to the instance using a Secure Shell (SSH) or Remote Desktop connection. For steps, see https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/accessinginstance.htm
For more information about troubleshooting your instance using a console connection, see the documentation: https://docs.cloud.oracle.com/en-us/iaas/Content/Compute/References/serialconsole.htm#four
=================================================
The authenticity of host 'ocid1.instance.oc1.ap-tokyo-1.*** (<no hostip for proxy command>)' can't be established.
RSA key fingerprint is SHA256:***.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ocid1.instance.oc1.ap-tokyo-1.***' (RSA) to the list of known hosts.
然后就可以在客户端通过 VNC 连接本机 IP:5900
来连接虚拟机了。需注意的是,这里的 VNC 连接时不需要输入密码,所以应注意保密连接。另外,不管是串行还是 VNC,默认都只有 5 分钟保活,即超时没有连接会自动断开,需要重新运行连接命令(非创建,是连接)。
五、Q&A
1、Q:运行命令时出现Error: Missing option(s) --compartment-id
错误?
A:在示例中,并没有包含此参数,是因为我已经将常用命令参数在 oci_cli_rc
中指定了,若你未指定,则需要输入完整命令:oci compute instance-console-connection list --instance-id ocid1.instance.oc1.ap-tokyo-1.** --compartment-id ocid1.tenancy.oc1..*** --query "data[*].{INSTANCE:\"instance-id\",CONNECTION:\"connection-string\",VNC:\"vnc-connection-string\"}"
2、Q:运行创建连接命令时,提示ssh_exchange_identification: Connection closed by remote host
,直接退出了?
A:这个错误是 SSH 密钥登陆的错误,上面已经提到,不管是串行还是 VNC,本质上都是 SSH 加密转发,因此运行时会先校验公钥私钥,所以只要把私钥放到当前用户目录下的 .ssh
目录下即可,其中,文件名应为 id_rsa
。
参考文章:
1、《Creating an Instance Console Connection》