目录
- [一. 需求](#一. 需求)
- [二. 配置免密码启动ssh](#二. 配置免密码启动ssh)
- [三. 获取wsl的ip的powershell脚本](#三. 获取wsl的ip的powershell脚本)
- [四. 登录脚本](#四. 登录脚本)
一. 需求
🔷当配置完成wsl之后,可以在Windows Terminal的设置中进行如下配置后快速进入wsl。

但是Windows Terminal并没有办法保存执行过程中的log,对日开发一般使用TeraTerm作为ssh工具,TeraTerm自带记录操作log的功能。
本文介绍如何使用TeraTerm的ttl脚本登录wsl。
🔷思路
- 先启动wsl的ssh功能
- 再获取wsl的ip地址
- 使用powershell获取
- 由于ttl脚本无法获取powershell的执行结果,因此使用powershell先将ip地址保存到临时文件中
- 然后使用ttl脚本读取临时文件,获取ip地址
- 然后使用ttl脚本登录
二. 配置免密码启动ssh
🔷wsl中的linux系统的ssh默认是关闭的,需要使用sudo service ssh start来启动。但是使用ttl脚本调用启动命令的时候,没有办法自动输入密码。因此需要先在wsl中配置免密码使用启动命令。
- 将
service ssh start放入NOPASSWD对应组即可 - sudo的详细讲解,请参考这篇文章 → Linux sudo命令
bash
apluser@FengYeHong-HP:~$ ls -l /etc/sudoers.d/
total 12
-r--r----- 1 root root 655 Dec 30 08:48 01-config
-r--r----- 1 root root 233 Dec 20 11:33 30-io-logging
-r--r----- 1 root root 1096 Feb 8 2022 README
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
/usr/bin/sh, \
/usr/bin/bash, \
/bin/rm, \
/usr/bin/vi, \
/usr/bin/vim, \
/usr/bin/nano, \
/usr/sbin/visudo, \
/usr/bin/cp
# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
/usr/bin/grep, \
/usr/bin/ls, \
/usr/bin/cat, \
/usr/sbin/service ssh start
# 但是只允许执行无密码执行特定的命令
apluser ALL=(ALL) NOPASSWD:ALLOW
# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN
apluser@FengYeHong-HP:~$
三. 获取wsl的ip的powershell脚本
🔷02-get_wsl_ip_address.ps1
💥注意:
- 文件一定不能有bom字符,否则ttl脚本在读取的时候,会把bom字符也当做ip地址的一部分,从而导致登录失败。
- windows电脑自带的
Powershell5的Out-File并不支持保存文件为无bom的utf-8。 - 因此使用下面这种方式将文件保存为无bom的utf-8格式。
powershell
param(
[string]$WSL_NAME,
[string]$tmp_wsl_ip_address_full_temp_path
)
# 根据wsl的名称获取wsl的ip地址
$wsl_ip_address = (wsl -d "$WSL_NAME" -e hostname -I).Trim();
[System.IO.File]::WriteAllText(
"$tmp_wsl_ip_address_full_temp_path",
"$wsl_ip_address",
# $false 表示不使用BOM
(New-Object System.Text.UTF8Encoding($false))
)
四. 登录脚本
bash
; 定义连接服务器的变量参数
WSL_NAME = 'Ubuntu_22.04'
USERNAME = 'apluser'
PASSWORD = 'apluser'
; 创建保存wsl的ip地址的文件路径
call create_save_wsl_ip_address_temp_filepath
; 创建存储wsl的ip地址的临时文件
call create_wsl_ip_address_temp_file
; 读取wsl的ip地址到变量中
call read_wsl_ip_address_to_var
;=====================================================================
; 开启wsl中的ssh服务
; "hide"
; 执行时隐藏窗口
; 1
; 启动中的程序执行完毕之前, 等待
; 程序启动完毕之后, 会把结束code保存到系统变量result中
;=====================================================================
sprintf2 start_wsl_ssh "wsl -d %s -- sudo service ssh start" WSL_NAME
exec start_wsl_ssh 'hide' 1
; 格式化连接服务器的命令
sprintf2 COMMAND "%s:22 /ssh /2 /auth=password /user=%s /passwd=%s" HOSTADDR USERNAME PASSWORD
; 连接服务器
connect COMMAND
wait '$'
; 结束当前ttl脚本
end
; 创建保存wsl的ip地址的临时文件
:create_save_wsl_ip_address_temp_filepath
; 随机生成0到1000的随机数
random tmp_file_random_num1 1000
random tmp_file_random_num2 1000
; 拼接存放ip地址的文件路径
sprintf2 tmp_wsl_ip_address_name 'wsl_ip_address_%d_%d.txt' tmp_file_random_num1 tmp_file_random_num2
; 从环境变量中获取临时文件的路径
getenv 'TEMP' tmp_folder_path
sprintf2 tmp_wsl_ip_address_full_temp_path '%s\%s' tmp_folder_path tmp_wsl_ip_address_name
return
; 创建存储wsl的ip地址的临时文件
:create_wsl_ip_address_temp_file
; 获取当前ttl脚本的文件夹
getdir ttl_folder_path
; 拼接powershell脚本所在的绝对路径
sprintf2 ps_file_path '%s\%s' ttl_folder_path '02-get_wsl_ip_address.ps1'
; 指定powershell脚本, 获取wsl的ip地址, 并把ip地址存储到临时路径中
sprintf2 get_wsl_ip_cmd 'powershell -NoProfile -ExecutionPolicy RemoteSigned -File "%s" -WSL_NAME "%s" -tmp_wsl_ip_address_full_temp_path "%s"' ps_file_path WSL_NAME tmp_wsl_ip_address_full_temp_path
exec get_wsl_ip_cmd 'hide' 1
return
; 读取wsl的ip地址到变量中
:read_wsl_ip_address_to_var
; 指针在文件开头
; 只读模式打开文件
fileopen wsl_ip_address_handle tmp_wsl_ip_address_full_temp_path 0 1
; 读取文件的第一行
filereadln wsl_ip_address_handle line
HOSTADDR = line
; 关闭文件句柄
fileclose wsl_ip_address_handle
; 删除临时存放wsl的ip地址的文件
filedelete tmp_wsl_ip_address_full_temp_path
return