热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LinuxShell自动交互的三种方法

四、自动交互方法一自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIXSHELL编

 

四、自动交互方法一

自动交互最关键的就是交互信息的自动输入&#xff0c;首先联想到文件重定向&#xff0c;在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7)&#xff1a;"command <

重定向操作符command <

对于需求1 要求的自动登陆ftp&#xff0c;并作系列操作&#xff0c;则可以用这种方法进行自动交互。代码如下&#xff1a;

  1. #!/bin/bash  
  2. ftp -i -n 192.168.167.187 << EOF 
  3. user hzc 123456  
  4. pwd  
  5. cd test  
  6. pwd  
  7. close  
  8. bye  
  9. EOF 

测试可以发现&#xff0c;如上代码使用帐号名hzc&#xff0c;密码123456成功登陆了ftp服务器&#xff0c;并进入目录&#xff0c;打印出了pwd。

五、自动交互方法二

需求2中要求采用非交互的方式改变登录用户密码&#xff0c;尝试用方法1&#xff0c;无法实现。

这时候联想到交互信息的另一个自动输入方法&#xff0c;管道&#xff0c;通过echo &#43; sleep &#43; | 可以实现这个需求。

  1. #!/bin/bash  
  2. (echo "curpassword"  
  3. sleep 1  
  4. echo "newpassword"   
  5. sleep 1  
  6. echo "newpassword")|passwd 

测试通过&#xff0c;运行这个脚本&#xff0c;直接把当前用户的curpassword改成newpassword。

六、自动交互方法三

需求3中要求自动登录root账号&#xff0c;尝试方法1和方法2&#xff0c;都出现错误提示standard in must be a tty。

这时候尝试寻找外部帮助&#xff0c;一个shell工具expect可以实现这个功能&#xff0c;其实expect就是一个专门用来实现自动交互功能的工具&#xff0c;expect的语法可以参考相关资料&#xff0c;代码如下&#xff1a;

  1. #!/usr/bin/expect  
  2. spawn su root  
  3. expect "password: "  
  4. send "123456/r"  
  5. expect eof  
  6. exit 

测试通过&#xff0c;运行这个脚本&#xff0c;直接从当前用户登录到root用户。

七、方法总结

方法一(重定向)简单直观&#xff0c;也经常有实际应用&#xff0c;但是在自动交互领域功能有限。

方法二(管道)也很简单直观&#xff0c;有时甚至不用sleep配合就能展现强大的自动交互实力&#xff0c;但是在某些时候也束手无策。

方法三(expect)在功能上是最为强大的&#xff0c;expect本来就是为实现自动交互功能而生&#xff0c;但是缺点是需要安装expect包&#xff0c;在嵌入式等环境下难以安装。

三个方法各有优劣&#xff0c;应用的好&#xff0c;都可以完成Linux Shell自动交互。

 

 

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

 

 

#!/usr/bin/expect -f

set password 密码

spawn scp 用户名&#64;目标机器ip:拷贝文件的路径 存放本地文件的路径
set timeout 300
expect "用户名&#64;目标机器ip&#39;s password:" #注意&#xff1a;这里的“用户名&#64;目标机器ip” 跟上面的一致
set timeout 300
send "$password/r"
set timeout 300
send "exit/r"

expect eof

 

 

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

linux下安装expect解决方法

 

需要两个安装程序
tcl8.4.13-src.tar.gz  下载:http://download.chinaunix.net/do ... rceID&#61;22&site&#61;1
expect-5.43.0.tar.gz    下载:http://download.chinaunix.net/do ... eID&#61;2845&site&#61;1

首先安装tcl8.4.13
Tcl 的 configure 脚本有一个语法错误&#xff0c;下面的命令可以纠正它&#xff1a;
sed -i "s/relid&#39;/relid/" configure
编译tcl
cd unix
./configure --prefix&#61;/ixdba.net
make
make install
需要的内容都拷贝到/tools目录,

安装完毕完先不要删除源码&#xff0c;以会安装expect还要用到

将/ixdba.net目录export到环境变量&#xff0c;

接着&#xff0c;就是编译expect了,解压gz包就不说了

./configure --prefix&#61;/tools --with-tcl&#61;/tools/lib --with-x&#61;no

如果报
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can&#39;t find Tcl private headers

就再添加一个头文件目录参数
--with-tclinclude&#61;../tcl8.4.11/generic
./configure --prefix&#61;/etc/expect --with-tcl&#61;/etc/lib --with-x&#61;no --with-tclinclude&#61;/usr/local/src/tcl8.4.13/generic
generic在tcl源码里

脚本运行正常&#xff0c;进行执行make进行编译
make
编译过程中未出现错误&#xff0c;执行安装&#xff1a;
make install

编译完成后会生在刚才tcl编译时生成的目录/ixdba.net生成expect命令,
此时在命令行执行expect应该可以执行了!

下面就可以做expect的工作了!

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

Expect [is a] software suite for automating interactive tools。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入&#xff0c;而这些命令和程序是期望从终端&#xff08;terminal&#xff09;得到输入&#xff0c;一般来说这些输入都需要手工输入进行的。

检查系统&#xff0c;发现tcl已经安装了。

[root&#64;rhel ~]# rpm -qa|grep tcl
tcl-8.4.13-3.fc6
tclx-8.4.0-5.fc6

后来才发现&#xff0c;因为expect需要重新编译后安装&#xff0c;那么就需要tcl的开发包。

rpm -ivh --force tcl-devel-8.4.13-3.fc6.i386.rpm

然后将expect-5.43包解开&#xff0c;开始读INSTALL文档&#xff0c;系统管理员告诉我&#xff0c;不用读&#xff0c;直接运行 ./configure --help开参数。确实好使&#xff0c;又土了一次 :-( 。

1.首先确定tcl开发包安装的位置
rpm -qpl tcl-devel-8.4.13-3.fc6.i386.rpm|more

2.然后根据参数&#xff0c;运行./configure
./configure --with-tcl&#61;/usr/lib --with-tclinclude&#61;/usr/include/tcl-private/generic

3.执行
make

4.执行
make install

完成第四步后&#xff0c;expect顺利安装成功。

 

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

linux安装expect终极解决方法

 

安装总结
需要两个安装程序
tcl8.4.11
expect-5.43
首先安装tcl8.4.11
Tcl 的 configure 脚本有一个语法错误&#xff0c;下面的命令可以纠正它&#xff1a;
sed -i "s/relid&#39;/relid/" configure
编译tcl
cd unix
./configure --prefix&#61;/tools
make
make install
需要的内容都拷贝到/tools目录,
&#xff01;&#xff01;&#xff01;&#xff01;安装完毕完先不要删除源码&#xff0c;以后还要用到
将头文件目录export到环境变量&#xff0c;
cd ..
export TCLPATH&#61;&#39;pwd&#39;
不晓得为什么我在configure时还是报找不到头文件的错误
建一个必须的符号链接
ln -sv tclsh8.4 /tools/bin/tclsh

好了&#xff0c;下面就是编译expect了
我用的是
./configure --prefix&#61;/tools --with-tcl&#61;/tools/lib --with-x&#61;no
如果报
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can&#39;t find Tcl private headers
再添加一个头文件目录参数
 --with-tclinclude&#61;../tcl8.4.11/generic
脚本运行正常&#xff0c;进行执行make进行编译
make
编译过程中未出现错误&#xff0c;执行安装&#xff1a;
make install

 

 

 

 

 

 

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
author-avatar
考试大试题网
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有