文档章节

shell expect SSH用法一例

cwalet
 cwalet
发布于 2016/11/02 17:26
字数 461
阅读 667
收藏 16

本文重点解决两个问题:

  1. 获取SSH远程执行命令的返回状态
  2. expect执行SSH时进程中不显示密码明文

先上Shell 代码:

export IP CMD SSH_PWD
expect << 'END'
# 关闭输出
log_user 0
set timeout 30
# 从系统变量获取数据
set ip "$env(IP)"
set cmd "$env(CMD)"
set pwd "$env(SSH_PWD)"
spawn ssh root@$ip "$cmd"
expect {
    "(yes/no)?"                           {send "yes\r";exp_continue}
    # 忽略大小写
    -nocase "password:"                   {send "$pwd\r";exp_continue}
    # 登录成功,打开输出
    -nocase "authentication successful"   {log_user 1;exp_continue}
    # 登录失败
    -nocase "authentication fail"         {exit 222}
    -nocase "permission denied"           {exit 222}
    eof
}
puts $expect_out(buffer)
lassign [wait] pid spawnid os_error_flag value
# 系统错误
if {$os_error_flag == -1} {
    puts "os errno: $value"
} else {
    # 返回 CMD 执行结果
    exit $value
}
END
exitCode=$?
if [ $exitCode -eq 222 ]; then
    echo 'log error'
elif [ $exitCode -ne 0 ]; then
    echo 'cmd error'
fi

获取执行结果的关键在于【wait】方法的使用:

wait [args]

delays until a spawned process (or the current process if none is named) terminates.

wait normally returns a list of four integers. The first integer is the pid of the process that was waited upon. The second integer is the corresponding spawn id. The third integer is -1 if an operating system error occurred, or 0 otherwise. If the third integer was 0, the fourth integer is the status returned by the spawned process. If the third integer was -1, the fourth integer is the value of errno set by the operating system. The global variable errorCode is also set.

【wait】:延迟直到一个spawn进程结束。返回4个数值:

  1. expect 进程 pid
  2. spawn 线程 id
  3. OS状态值(-1:系统错误,0:正常)
  4. spawn命令返回值(OS值为 -1时返回OS错误代码,为 0时返回CMD退出值)

参考:expect manHow to get the exit code of spawned process in expect shell script?

开头的两个问题都得到了解决:

  • 使用 wait 获取SSH 远程执行命令的返回状态,登录失败也可以通过指定状态码(222)标识;
  • 使用 env 读取外部变量到expect 变量中,从而 PS 不会显示 密码明文。

© 著作权归作者所有

共有 人打赏支持
上一篇: vsftpd 安全配置
cwalet
粉丝 44
博文 111
码字总数 87663
作品 0
其他
私信 提问
shell脚本的应用

今年来公司配了mac,所有的开发环境都重新部署了一遍,由于都是在开发机上运行项目的,免不了在开发机上操作各种,ssh当然是必须的,但是mac下不熟悉,每次ssh命令行,再输入密码太讨厌了,所...

LCZ777
2016/09/13
46
2
expect spawn、linux expect 用法小记

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。  脚本代码如下:...

双叶天下
2014/02/19
0
0
expect,spawn用法小结

使用expect实现自动登录的脚本 代码如下: #!/usr/bin/expect  set timeout 30  spawn ssh -l username 192.168.1.1  expect "password:"  send "ispassr"  interact   1. [#!/......

贪睡猫仙mosen
2014/07/15
0
0
SSH 远程执行命令二三事

原文出处:koala bear 有时侯,利用 ssh 在本地执行远程机器的命令可以便捷地处理某些重复工作。我们希望做到: 免手工输入密码 支持执行多个命令,执行 shell 脚本 支持执行 sudo 的命令 免...

koala bear
2018/01/29
0
0
第十二章 Shell脚本编写及常见面试题(三)

本章目录: 12.21 FTP下载文件 #!/bin/bashif [ $# -ne 1 ]; then echo "Usage: $0 filename"fidir=$(dirname $1)file=$(basename $1)ftp -n -v << EOF # -n 自动登录open 192.168.1.10user......

李振良OK
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL update select 组合

组合公式如下 update tab_a a inner join tab_b b  set a.m =  b.m where a.n = b.n

皮皮猫32
4分钟前
0
0
向高手进阶,从 0 开始手写实现一个 RPC 框架!

前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A。通常都是B把API上传到Maven私服,然后B开始...

Java填坑路
7分钟前
1
0
漫说安全|智能的云WAF,开挂的Web防御

“漫说安全”是我们推出的一个新栏目,以简洁明了的形式展现高深晦涩的云安全。 今天我们要讲的是智能的云WAF到底有啥“本领”,答案就在漫画里^_^ 漫画看完后估计你还会有些小疑问,不要着急...

阿里云官方博客
8分钟前
0
0
数据恢复

111

ziluopao
9分钟前
0
0
记录IL2Cpp的编译过程

编者注 由于Windows 10重启,丢失部分文档,下面内容能补则补吧 需求 由于需要发布并简单处理,则使用IL2Cpp进行,编译过程和运行过程碰到很多问题,特此记录 编译过程 找不到类内部的枚举 ...

抢小孩糖吃
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部