TeraTerm ttl脚本登录wsl

目录

  • [一. 需求](#一. 需求)
  • [二. 配置免密码启动ssh](#二. 配置免密码启动ssh)
  • [三. 获取wsl的ip的powershell脚本](#三. 获取wsl的ip的powershell脚本)
  • [四. 登录脚本](#四. 登录脚本)

一. 需求

🔷当配置完成wsl之后,可以在Windows Terminal的设置中进行如下配置后快速进入wsl。

但是Windows Terminal并没有办法保存执行过程中的log,对日开发一般使用TeraTerm作为ssh工具,TeraTerm自带记录操作log的功能。

本文介绍如何使用TeraTermttl脚本登录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电脑自带的Powershell5Out-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
相关推荐
HLC++9 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室10 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy13 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕14 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫15 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生15 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1116 小时前
linux基础IO
linux·运维·服务器
BelongPanda18 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯18 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983419 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器