我在while循环中使用ssh,但ssh完第一行后就退出了,使用了exec, & 等命令均不行,后来看到这篇文章的解释,才明白。
转载来自:http://blog.csdn.net/shrekmu/archive/2008/06/05/2513177.aspx,以示提醒备份。
转载如下:
最近在写一个自动更新的shell,可是发现如果在使用while循环从一个文件中读取ip地址,然后访问就只能读取第一行纪录。代码如下:
while read LINE
do
echo *******************************************$LINE
ssh 192.168.10.233 ls
done < data
但是如果使用for就没有这个问题,非常的奇怪,for的代码如下:
for LINE in `cat data`
do
echo *******************************************$LINE
ssh 192.168.10.233 ls
done
难道for和while竟然有这么大的差别,不可能吧。经过一番试验以后发现,原来并不是while的for的差别,而是while中使用重定向机制,data文件中的信息都已经读入并重定向给了整个while语句。所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,ssh语句正好回读取输入中的所有东西,下面这个shell能很好的说明这个问题:
while read LINE
do
echo *******************************************$LINE
ssh 192.168.10.233 cat
done < data
执行这个shell就会发现,ssh中的cat语句会打印出data文件中的其他纪录,这就导致调用玩ssh语句后,输入缓存中已经都被读完了,当read语句再读的时候当然也就读不到纪录,循环也就退出了。改进方法是,将ssh的输入重定向输入:
while read LINE
do
echo *******************************************$LINE
ssh 192.168.10.233 ls < /dev/null
done < data
这样,在while语句中也能顺利的执行ssh语句了。linux的重定向还真复杂。
分享到:
相关推荐
8. **控制流程**:`if`语句、`for`和`while`循环是SSH脚本中常用的控制流程结构,用于根据不同的条件或重复执行任务。 9. **远程文件操作**:使用`scp`和`sftp`命令可以在本地和远程主机之间安全地传输文件。例如,...
- **`for 变量 in "$@" 或 “$*”`**: 当在脚本中使用`$@`或`$*`时,`for`循环可以用来遍历传递给脚本的所有参数。`"$@"`在每个参数被引用时都会将其视为独立的单元,而`"$*"`则会将所有参数合并成一个字符串。 - **...
关于改变SSH服务状态,我们可以用简单的命令行指令实现,无需在脚本中使用循环: ```bash #!/bin/bash service sshd start # 启动SSH服务 service sshd stop # 停止SSH服务 service sshd restart # 重启SSH服务 ```...
4. **变量和控制结构**:Tcl提供了丰富的变量类型和控制结构,如条件语句(`if`)、循环(`for`、`while`)等,用于构建复杂的`Expect`脚本。 5. **错误处理**:`Expect`脚本可以包含错误处理部分,通过捕获异常或...
for 实现: 代码如下: #!/bin/bash set i=0 set j=0 for((i=0;i<10;)) ... echo “————-j is $j ——————-“ ...while实现: ... 您可能感兴趣的文章:Shell中的循环语句for、while、until实例讲解Shel
- **导入库**:介绍如何在Python中使用外部库,如NumPy和Matplotlib等。 - **编写基本程序**: - **函数编写**:讲解如何定义和调用函数。 - **数组操作**: - **创建NumPy数组**:使用NumPy库创建数组。 - **...
- **控制结构**:如if语句、switch语句、for循环、while循环和do-while循环,以及break和continue语句,控制程序的流程。 2. **面向对象编程** - **类与对象**:类是对象的模板,对象是类的实例。理解封装、继承...
scp命令可以结合循环结构(如for或while)来一次传输多个文件,而远程发送终端命令可能涉及到ssh命令的使用,通过ssh可以在远程主机上执行任意命令。 关于“线程解压”,这可能指的是在多线程环境下进行文件解压缩...
1. **基础语句**:Java的基础语句包括变量声明、赋值语句、条件语句(if-else)、循环语句(for、while、do-while)以及开关语句(switch)。这些语句是程序逻辑的基础,用于实现不同条件下的代码执行路径。 2. **...
基础练习可能包括变量声明、数据类型(如整型、浮点型、字符型和布尔型)、流程控制(如条件语句if-else和循环for、while)、方法定义和调用,以及类和对象的使用。 “一些基础的语句和数据的交互使用”涵盖了输入...
/bin/bash`作为脚本的解释器,`echo`打印输出,`read`读取用户输入,`if`和`else`实现条件判断,`for`和`while`进行循环操作。 8. 系统日志:`/var/log`目录下存放着各种系统日志,`less`或`grep`可以帮助查看和...
他们将学习到变量、条件语句(if-else)、循环(for、while)、函数以及如何执行外部命令等基础知识。 至于选做任务“Bing图片下载”,这可能是一个利用编程语言(如Python)和Linux命令行工具来实现自动下载Bing...
在Perl脚本中使用eval命令来强制变量替换 11-15. 使用set来改变脚本的位置参数 11-16. 重新分配位置参数 11-17. Unset一个变量 11-18. 使用export命令传递一个变量到一个内嵌awk的脚本中 11-19. 使用getopts命令来...
- 运算符与流程控制:了解各种运算符的使用,包括算术、比较和逻辑运算符,以及条件语句(if-else)和循环(for、while)。 - 方法与异常处理:学习如何定义和调用方法,以及异常处理机制。 - 集合框架:熟悉...
在Perl 脚本中使用eval 命令来强制变量替换 11-15. 使用set 来改变脚本的位置参数 11-16. 重新分配位置参数 11-17. Unset 一个变量 11-18. 使用export 命令传递一个变量到一个内嵌awk 的脚本中 11-19. 使用getopts ...
3. 流程控制:学习if语句、for循环、while循环和case语句,用于条件判断和迭代操作。 4. 函数:掌握如何定义和调用Shell函数,提高代码复用性。 5. 输入/输出重定向:理解标准输入、输出和错误输出,学会使用重定向...
书中可能涵盖变量、数据类型、控制流(if语句、for循环、while循环)、函数、模块等基础知识。 2. **文件操作**:Python在处理文件和目录方面提供了丰富的API,如open()、os模块、shutil模块等,这些在自动化运维中...
第六章讲解了循环控制语句,包括`if`(单分支和多分支条件判断)、`for`循环、`case`语句和`while`循环,这些都是编写复杂逻辑的必备知识。 最后,第七章提供了几个实战脚本示例,展示了如何利用Shell实现特定功能...
- **自定义循环变量**:使用for循环遍历一个自定义的变量列表,如`1 2 3 4 5`。 - **显示小棍子**:利用循环和转义序列`echo -ne "\033[1D$j"`实现光标左移,并显示小棍子(|)表示进度。 ### 5. 文件操作 - **读取...
2. **运算符与流程控制**:涵盖算术、比较、逻辑运算符,以及if语句、switch语句、for循环、while循环和do-while循环的使用。 3. **类与对象**:深入讲解类的定义、对象的创建与销毁,以及封装、继承和多态等面向...