我刚刚开始使用bash&我正在尝试编写一个脚本来远程搜索服务器中的特定文件:(a)设备名称和(b)字符串。我的目标是让所有输出包含指定设备的'string'。当我尝试下面的脚本只是挂起。但是,当我直接在服务器上运行命令(“grep -i”router1“/var/log/router.log | grep -i”UPDOWN“)时,它可以工作。任何想法?任何想法?
#!/bin/bash
#
read -p "Enter username: " user
read -p "Enter device name: " dev
read -p "Enter string: " str
while read /home/user1/syslogs
do
ssh "$user"@server1234 'grep -i "$dev" /var/log/"$syslogs" 2> /dev/null | grep -i "$str"'
done
答案 0 :(得分:1)
您似乎误用了read
命令。您没有指定要作为参数读取的文件; read
始终从标准输入读取。目前还不清楚你想从文件中读取的值是什么,但你想要这样的东西:
read -p "Enter username: " user
read -p "Enter device name: " dev
read -p "Enter string: " str
while read fileName; do
# Also: I'm borrowing sputnick's solution to the nested quote problem.
ssh $user@server1234 <<EOF
grep -i "$dev" /var/log/$fileName 2>/dev/null | grep -i "$str"
EOF
done < /home/user1/syslogs
答案 1 :(得分:1)
消息Pseudo-terminal will not be allocated because stdin is not a terminal
是由于远程主机shell的stdin
正在从此文档重定向,并且没有指定远程主机执行的命令,i。即远程主机首先假设由于缺少命令而需要为交互式登录会话分配伪终端(参见ssh
手册页的概要:ssh ... [user@]hostname [command]
),但随后实现它的stdin
不是终端,因为它是从here文档重定向的。结果是远程主机拒绝分配伪终端。
给定案例中的解决方案是将shell指定为远程主机执行此文档中给出的命令的命令。
作为将shell指定为命令的替代方法,可以提前告知远程主机不需要使用-T
开关分配伪终端。
另一方面,仅当指定的命令需要远程主机上的交互式登录shell会话(例如-t
或top
)时,才需要vim
开关。
- ssh $user@server1234 <<EOF ...
+ ssh $user@server1234 /bin/sh <<EOF ...
+ ssh -T $user@server1234 <<EOF ...