你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

介绍Linux Shell自动交互的解决方法

[复制链接]
gaosmile 发布时间:2020-11-9 21:14
如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下。
+ ^# `. I+ k. ?
一、背景
shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力得多。
但是有时候我们可能会需要实现和交互程序如ftp,telnet服务器等进行交互的功能,这时候我们需要用到shell的自动交互功能,本文收集了较常用的三种自动交互方法,并进行了比较和总结。
, j! q( L2 J+ s' j2 z8 X- C$ Z# j
二、需求
需求1:3 P( ^8 p; b8 H5 I
从一台Linux机器ftp登陆到另一台Linux机器,进行系列操作后关闭,懒得每次都手动输入密码。
需求2:
( @% |+ o  B* d; _* a# u1 Y0 ^改变登录用户密码,懒得每次都输入新旧密码。
需求3:; [2 K* \" \  _! m
希望su自动登录到root账户,懒得每次都输入root密码。

: _& Y" }2 k. y: S' P' i
三、调试环境
终端:SecureCRT
系统:WinXP, CentOS 4.4(VmWare)
Shell:  bash

" G1 b% n* j# e- }9 R9 s
注:shell有很多种,B类SHELL(sh, bash, ksh)之间行为相近;C类SHELL(csh, tcsh)之间行为相近,还有zsh和rc等shell,本文的调试环境是bash。
7 O, h: u0 ^: e1 A1 p* q
四、自动交互方法一
自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command << delimiter  从标准输入中读入,直至遇到delimiter分界符。"
重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。
对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:
  1. 4 I0 ]+ s0 N2 U' I
  2. #!/bin/bash
    - p' _' n  n" j2 X, _- [
  3. ftp -i -n 192.168.167.187 << EOF
    8 C. G& p8 w9 `
  4. user hzc 123456
    . E" N9 B3 c# n% c0 E+ [& {* j1 g
  5. pwd0 k2 G; _) p5 b2 e( ]
  6. cd test
    2 P  N2 O$ T& P. u% k/ _
  7. pwd
    6 I4 g4 S; u& l7 y( e: u# U4 K4 R9 m
  8. close, y2 h7 {$ w* a2 e+ u% W
  9. bye8 a8 p$ m: S8 K5 m8 E2 D) K
  10. EOF
复制代码

6 t' n* V0 Y+ }8 F! _  f, |
测试可以发现,如上代码使用帐号名hzc,密码123456成功登陆了ftp服务器,并进入目录,打印出了pwd。
. T6 j7 L; g5 _# L* V
, S5 t& l- P6 m7 ?
五、自动交互方法二
需求2中要求采用非交互的方式改变登录用户密码,尝试用方法1,无法实现。
这时候联想到交互信息的另一个自动输入方法,管道,通过echo + sleep + | 可以实现这个需求。
  1. . x% C- u4 u) \4 h/ m1 Z
  2. #!/bin/bash
    1 \: W" c1 r% H5 a
  3. (echo "curpassword"4 l" A+ z- ?# B2 _4 F! s! {) C
  4. sleep 15 b* D9 x3 @: l; Z  n# T, x2 R) P
  5. echo "newpassword"* _9 Y1 Z9 O" n$ X
  6. sleep 1
    9 ]; ?2 m) a0 {9 P
  7. echo "newpassword")|passwd
复制代码

+ e1 F: d( H, [; }
测试通过,运行这个脚本,直接把当前用户的 curpassword 改成 newpassword。
1 W3 {; W+ b, k8 Z  a
六、自动交互方法三
需求3中要求自动登录root账号,尝试方法1和方法2,都出现错误提示standard in must be a tty。
这时候尝试寻找外部帮助,一个shell工具expect可以实现这个功能,其实expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:
  1. ' H$ P0 f) N( T0 Y" V  Z: u9 w
  2. #!/usr/bin/expect; R& A- a+ u7 B) j1 n
  3. spawn su root/ V7 d4 M7 s8 n4 e# f$ d
  4. expect "password: "5 _6 w" w/ a6 I! c0 ]+ Q5 X) P% {
  5. send "123456\r"- Y5 s# e" U/ ~; ?$ }9 W
  6. expect eof4 f, T! `2 B+ X$ I  X, s5 [
  7. exit
复制代码
/ _: p5 z% V2 M+ j! A1 h% |! D
测试通过,运行这个脚本,直接从当前用户登录到root用户。

. g, ?  y; y& S8 L' f. b
七、方法总结
方法一(重定向)简单直观,也经常有实际应用,但是在自动交互领域功能有限。
方法二(管道)也很简单直观,有时甚至不用sleep配合就能展现强大的自动交互实力,但是在某些时候也束手无策。
方法三(expect)在功能上是最为强大的,expect本来就是为实现自动交互功能而生,但是缺点是需要安装expect包,在嵌入式等环境下难以安装。
三个方法各有优劣,应用的好,都可以完成Linux Shell自动交互。
- Z+ A) ?0 j) g) K7 A/ x
赞 收藏 评论0 发布时间:2020-11-9 21:14

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版