博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell expect SSH用法一例
阅读量:6329 次
发布时间:2019-06-22

本文共 1749 字,大约阅读时间需要 5 分钟。

  hot3.png

本文重点解决两个问题:

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

先上Shell 代码:

export IP CMD SSH_PWDexpect << 'END'# 关闭输出log_user 0set 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}ENDexitCode=$?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退出值)

参考:、

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

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

转载于:https://my.oschina.net/cwalet/blog/779930

你可能感兴趣的文章
敬告各位 ALinq 用户,切勿上当受骗
查看>>
计算机图形学(一) 图形系统综述
查看>>
持续集成(CI)- 几种测试的区别(摘录)
查看>>
多用户虚拟Web3D环境Deep MatrixIP9 1.04发布
查看>>
求高手,求解释
查看>>
[MSSQL]NTILE另类分页有么有?!
查看>>
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>
C机顶盒开发实战常用初始化类型:数组、结构、指针
查看>>
Jquery闪烁提示特效
查看>>
最佳6款用于移动网站开发的 jQuery 图片滑块插件
查看>>
C++ String
查看>>
获取系统托盘图标的坐标及文本
查看>>
log4j Test
查看>>
HDU 1255 覆盖的面积(矩形面积交)
查看>>
Combinations
查看>>
SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。...
查看>>
第二十一章流 3用cin输入
查看>>
在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
查看>>
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>
Orchard 视频资料
查看>>