zxyax

导航

Except 脚本免密登录(带参数调用except脚本)

脚本名称:expect user_login.exp

脚本内容:

#!/usr/bin/expect
set ip [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set command [lindex $argv 3]
set timeout 120

if { $argc != 4 } {
    puts "Usage: $argv0 <ip> <username> <password> <command>"
    exit 1
}

log_user 0

spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -q -t ${username}@${ip} "${command}"

expect {
    "Are you sure you want to continue connecting (yes/no)?" {
        send "yes\r"
        exp_continue
    }
    "*assword:*" {
        send "${password}\r"
        exp_continue
    }
    eof 
}
set result [string trim $expect_out(buffer)]
puts ${result}

 

说明:

set xxxx [lindex $argv 0]: 获取调用脚本时传入进来的参数;

set timeout 120: 设置Exccept脚本执行超时时间;

ssh -o StrictHostKeyChecking=no: 禁用 SSH 的 “严格主机密钥检查”;

ssh -o UserKnownHostsFile=/dev/null: 指定 SSH 保存 / 读取主机密钥的文件路径为 /dev/null(空设备文件);

set result [string trim $expect_out(buffer)]: 设置一个变量接收结果集

在 expect 脚本中,set result [string trim $expect_out(buffer)] 是一条用于处理捕获到的交互数据的命令,主要作用是去除数据中的多余空白字符(如空格、换行、制表符等),得到更整洁的有效内容:

各部分含义
$expect_out(buffer)
expect_out 是 expect 内置的全局数组,用于存储 expect 命令匹配过程中捕获到的所有数据。
$expect_out(buffer) 是该数组的一个关键元素,存储从上一次 expect 命令结束到本次 expect 命令匹配成功之间的所有输出数据(包括换行、空格、提示符等冗余信息)。
例如:用 expect "$" 匹配远程主机的命令提示符时,$expect_out(buffer) 会包含命令执行结果、换行符以及最终的 $ 提示符。
string trim
这是 Tcl 语言(expect 基于 Tcl 语法)的内置命令,用于去除字符串首尾两端的空白字符(默认包括:空格 、制表符 \t、换行符 \n、回车符 \r 等)。
语法:string trim 字符串,返回处理后的字符串(中间的空白字符会保留)。
set result ...
set 是 Tcl 的变量赋值命令,将处理后的字符串保存到变量 result 中,方便后续使用(如打印、判断、传递给其他命令等)。

实际作用:清理冗余数据
$expect_out(buffer) 捕获的数据通常包含大量无关空白字符(如命令执行后的换行、提示符前的空格等),string trim 会去除这些冗余内容,只保留核心有效数据。
puts ${result}: 打印结果集

 

脚本调用方式如下:

function retry_root_is_alive(){
    command_t="awk 'BEGIN{print 1+1}'"
    result=$(expect user_login.exp "${HOST_IP}" "${HOST_USERNAME}" "${HOST_PASSWORD}" "${command_t}")
    echo "${result}"
}

command_t="awk 'BEGIN{print 1+1}'":服务器探活,看结果集是否返回2

$(expect user_login.exp "${HOST_IP}" "${HOST_USERNAME}" "${HOST_PASSWORD}" "${command_t}"):

传入四个参数,这里可根据实际情况进行调整,相对应调整expect user_login.exp中的参数设定

 

posted on 2025-10-13 09:54  zxyax  阅读(6)  评论(0)    收藏  举报