GVKun编程网logo

linux shell 三种自动交互 方法(shell实现自动交互)

2

对于linuxshell三种自动交互方法感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍shell实现自动交互,并为您提供关于Linux-常用shell简介及shell基本操作、Linux=有没

对于linux shell 三种自动交互 方法感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍shell实现自动交互,并为您提供关于Linux - 常用 shell 简介及 shell 基本操作、Linux =有没有类似“Java Shell”而不是其他Linux shell?、Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s、linux Shell 命令行-03-array Shell 数组的有用信息。

本文目录一览:

linux shell 三种自动交互 方法(shell实现自动交互)

linux shell 三种自动交互 方法(shell实现自动交互)

方法一

    自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考LINUX与UNIX SHELL编程指南 chapt 5.7):"command << delimiter  从标准输入中读入,直至遇到delimiter分界符。"

    重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。

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

#!/bin/bash

ftp -i -n 192.168.167.187 << EOF
user hzc 123456
pwd
cd test
pwd
close
bye
EOF

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

方法二

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

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

#!/bin/bash

(echo "curpassword"
sleep 1
echo "newpassword"
sleep 1
echo "newpassword")|passwd


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

方法三

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

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

#!/usr/bin/expect

spawn su root
expect "password: "
send "123456\r"
expect eof
exit

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

总结

    方法一(重定向)简单直观,也经常有实际应用,但是在自动交互领域功能有限。
    方法二(管道)也很简单直观,有时甚至不用sleep配合就能展现强大的自动交互实力,但是在某些时候也束手无策。
    方法三(expect)在功能上是最为强大的,expect本来就是为实现自动交互功能而生,但是缺点是需要安装expect包,在嵌入式等环境下难以安装。

 

Linux - 常用 shell 简介及 shell 基本操作

Linux - 常用 shell 简介及 shell 基本操作

1. 查询 shell 环境变量,切换 shell 种类

​​

表明目前使用的 shell 种类是 bash。

要想改变 shell 种类,在终端输入想要运行的 shell 名称即可。在切换 shell 种类的过程中,可能会操作失败,这是因为 ubuntu 没有自带安装想要切换的 shell 种类。

​​

2.shell 命令的基本格式

shell 的命令格式如下:

command -options [argument]

command:shell 命令的名称。

-options: 选项,同一个命令可能有很多不同的选项,用来完成不同的具体功能。

[argument]: 参数,作为 shell 命令的输入,有的 shell 命令可以没有参数,或者不带参数运行。

例如:

​​

ls  //查看当前目录下的文件及文件夹
ls -l  //查看当前目录下的文件及文件夹的详细信息
ls -l /home  //查看/home目录下的文件及文件夹的详细信息

 

3.shell 的常用特殊符号

(1)“*”

    是一个通用符号,可以表示任意一个字符(包括空字符)或多个字符组成的字符串。例如

ls -l /bin/e*  //查看/bin/目录下的所有以e开头的文件及文件夹的详细信息

 

​​

(2)“?”

    功能类似于 “*” 符号,但是只能表示单个字符,不能表示由多个字符组成的字符串。例如

ls -l /bin/e?  //查看/bin/目录下的所有以e开头的长度为2的文件及文件夹的详细信息

 

​​

(3)“[ ]”

指定范围,用来指定被显示的内容的范围。例如,在 /home/leon 目录下新建一个文件夹,名为 test, 在 test 文件夹下新建 5 个文件夹,名为 a、b、c、d、e。

cd /home/leon/test  //进入到该目录下cd /home/leon/test 
ls [a-c]  //仅查看名为a~c的文件及文件夹

 

​​​​

(4)“!”

      排除符号,用来指定被屏蔽显示内容的部分。需要与 “[]” 符号联合使用。例如

ls [a-c]  //仅查看名为a~c的文件及文件夹

 

​​

(5)“;”

分割符号,用于在一行输入多个命令时,分隔各个命令。例如

ls;ls -l  //查看当前目录下的文件及文件夹,然后查看他们的详细信息

(6)“`”

命令替代符,这个符号总是成对出现,他们包含的内容在 shell 中表示一条命令,并且会被执行。例如

echo `ls -l`  //将命令“ls -l”的结果显示出来
echo ''ls -l''  //这里是单引号,表示显示“ls-l”这个字符串

(7)“#”

注释符号,以 “#” 开头的一行被当作是注释处理,不会被执行。

ls -l  //查看当前目录下的文件和文件夹的详细信息
# ls -l  //添加上“#”号,该命令被当作注释,不会被执行

4. 自动补全功能

输入 “who”, 然后按住 TAB 键,系统将发出警报声,此时可以继续输入,也可以在此按下 TAB 键,系统将列出说有 who 开头的命令。


5. 按方向键上和下可以选择曾经输入过的历史命令。

6.shell 别名机制

需要用到 “alias” 命令

mynet  //输入mynet,Linux中并无此命令
ifconfig  //ifconfig命令可以查看网络情况
alias mynet=ifconfig  //给ifconfig起个别名mynet
mynet  //mynet就可以生效了

Linux =有没有类似“Java Shell”而不是其他Linux shell?

Linux =有没有类似“Java Shell”而不是其他Linux shell?

我最了解的编程语言是 Java.目前,我必须编写相当多的“shell脚本”来自动化我的服务器.有没有像“Java Shell”这样的东西,所以我可以用Java编写shell脚本?

解决方法

你可以得到groovy并使用groovysh.我已经做了一些事情,但我发现perl或bash / sh对于管理脚本最有用.当您需要做的就是执行OS命令和搜索文本时,像Java这样的应用程序语言会增加很多开销.

Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s

Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s

linux Shell 命令行-03-array Shell 数组

linux Shell 命令行-03-array Shell 数组

拓展阅读

linux Shell 命令行-00-intro 入门介绍

linux Shell 命令行-02-var 变量

linux Shell 命令行-03-array 数组

linux Shell 命令行-04-operator 操作符

linux Shell 命令行-05-test 验证是否符合条件

linux Shell 命令行-06-flow control 流程控制

linux Shell 命令行-07-func 函数

linux Shell 命令行-08-file include 文件包含

linux Shell 命令行-09-redirect 重定向

定义

Shell 仅支持单维数组。

array=(值1 值2 ... 值n)
  • array.sh
#!/bin/sh

# 数组演示
array=(a b "c" d)

# 另一种定义数组的方式

array_two[0]=a
array_two[1]=b
array_two[2]="c"
array_two[3]=d

读取

您可以这样从数组中读取:

${array_name[index]}
  • read_array.sh
#!/bin/sh

# 从数组中读取

array=(a b c "d")
echo "第一个元素是 ${array[0]}"
echo "第二个元素是 ${array[1]}"
echo "第三个元素是 ${array[2]}"
echo "最后一个元素是 ${array[-1]}"
  • 运行
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# chmod +x read_array.sh 
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# ./read_array.sh 
第一个元素是 a
第二个元素是 b
第三个元素是 c
最后一个元素是 d

读取所有元素

我们可以使用 *@ 来获取数组中的所有元素。

  • read_all_array.sh
#!/bin/sh
# 读取数组中的所有元素

array=(a b c d)
echo "数组中的所有元素:${array[*]}"
echo "数组中的所有元素:${array[@]}"
  • 运行
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# chmod +x read_all_array.sh 
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# ./read_all_array.sh 
数组中的所有元素:a b c d
数组中的所有元素:a b c d

数组长度

我们可以使用 ${#array[*]}${#array[@]} 来获取数组的大小。

  • array_length.sh
!#/bin/sh
# 数组长度

array=(a b c d E)
echo "数组的大小为:${#array[*]}"
echo "数组的大小为:${#array[@]}"
  • 运行
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# chmod +x array_length.sh 
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# ./array_length.sh 
数组的大小为:5
数组的大小为:5

参考资料

https://www.runoob.com/linux/linux-shell.html

本文由博客一文多发平台 OpenWrite 发布!

今天关于linux shell 三种自动交互 方法shell实现自动交互的介绍到此结束,谢谢您的阅读,有关Linux - 常用 shell 简介及 shell 基本操作、Linux =有没有类似“Java Shell”而不是其他Linux shell?、Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s、linux Shell 命令行-03-array Shell 数组等更多相关知识的信息可以在本站进行查询。

本文标签: