Linux shell脚本使用while循环执行ssh的注意事项
如果要使用ssh批量登录到其它系统上操作时,我们会采用循环的方式去处理,那么这里存在一个巨大坑,你必须要小心了。
一、场景还原:
我现在是想用一个脚本获取一定列表服务器的运行时间,首先我建立一个名字为ip.txt的IP列表(一个IP一行),再建好密钥实现不用密码直接登录。然后写脚本如下:
[code language= shell ]#!/bin/bash
while read ips;
do
echo ips;
doneips;
upt=`ssh root@ips uptime
echoupt;
done ip.txt[/code]
脚本只对第一个IP做了检测,就直接跳出来了。
二、问题分析:
while使用重定向机制,ip.txt文件中的信息都已经读入并重定向给了整个while语句,所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,ssh语句正好回读取输入中的所有东西。为了禁止ssh读所有东西增加一个 /dev/null,将ssh 的输入重定向输入。
三、解决策略:
1、使用for循环代表while,因为for没有一次把文件内容缓存获取过来,代码段修改如下:
[code language= shell ]for ips in `cat ip.txt`; do
echo {ips};
upt=`ssh root@{ips} uptime`;
echo upt;
done[/code]
2、若坚持使用while循环,那么需要对ssh增加-n参数,为什么增加了-n参数也可以解决问题呢?通过man ssh查看-n参数的说明:
Redirects stdin from /dev/null (actually, prevents reading from stdin)
这就和
修改后的代码如下:
[code language= shell ]#!/bin/bash
while read ips;
do
echoips;
upt=`ssh -n root@ips uptime
echoupt;
done ip.txt[/code]
本文链接:http://www.yunweipai.com/4339.html
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/53224.html
javashell相关文章
- Linux下启动进程的步骤指南(linux如何启动进程)
- 和删除Linux下实现同时读取文件和删除文件(linux同时读文件)
- 优化Linux性能优化:提高执行时间(linux执行时间)
- Linux远程访问:使用SSH登陆(linux远程登陆ssh)
- SSH连接Linux告急:调整分钟解决连接速度慢问题(ssh连接linux慢)
- Linux上部署Node实现更多功能(linux安装node)
- Linux安装SSH配置: 一步一步指引(linux安装ssh配置)
- Linux开启SSH安全远程访问(linux开启ssh)
- Linux基础知识测验:你掌握了多少?(linux基础命令测试题)
- Linux下快速安装依赖包的简单方法(linux依赖包安装)
- 解决Linux中的僵死进程(僵死进程linux)
- Linux下设置目录权限的技术(设置目录权限linux)
- 登陆 Linux 使用SSH登陆的方法简介(linux怎么ssh)
- 管理Linux下SSH远程管理实践(linux下的ssh)
- Linux系统中使用SSH的快捷方式(linux系统使用ssh)
- 使用cal命令查看Linux日历(cal命令linux)
- Linux系统U盘启动教程(linux的u盘启动)
- Linux运维:日常工作的前行之路(linux运维日常工作)
- 如何在Linux系统中扩展逻辑分区的方法(linux扩展逻辑分区)
- 学习 Linux 脚本编写的技巧和要点,提高工作效率(linux脚本编写)
- 探索Linux中PWD命令的神奇之处(linux中pwd命令)
- Linux破除循环之路(linux跳出循环)
- 安全Linux系统升级SSH安全保障(linux升级ssh)
- Linux服务器架设必备:SSH篇(linux服务器ssh)
- 的使用Linux系统下SSH工具的正确使用(linux下ssh工具)
- 展示SSH连接Linux应用的精彩之旅(ssh连接linux软件)
- 开启Linux操作系统的嵌入式输入法之旅(linux嵌入输入法)
- Linux下循环命令使用技巧(linux循环命令)
- 进行管理Linux下Root用户管理技巧(linux如何用root)