我刚开始使用bash&我正试图编写一个脚本,根据以下内容远程搜索服务器中的特定文件:(a)设备名称和(b)字符串。我的目标是为指定的设备获取所有包含字符串的输出。当我尝试下面的脚本时,它挂起了。但是,当我直接在服务器上运行命令("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
您似乎错误地使用了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
消息Pseudo-terminal will not be allocated because stdin is not a terminal
是由于远程主机外壳的stdin
正在从here文档重定向,并且没有为远程主机指定要执行的命令,即,远程主机首先假设由于缺少命令,将需要为交互式登录会话分配一个伪终端(参见ssh
手册页的概要:ssh ... [user@]hostname [command]
),但随后意识到其外壳的stdin
不是终端,因为它是从here文档重定向的。结果是远程主机拒绝分配伪终端。
在给定的情况下,解决方案是只指定一个shell作为远程主机执行here文档中给出的命令的命令。
作为将shell指定为命令的替代方案,可以提前告知远程主机不需要使用-T
交换机来分配伪终端。
另一方面,只有当指定的命令期望在远程主机(如top
或vim
)上进行交互式登录shell会话时,才需要-t
开关。
- ssh $user@server1234 <<EOF ...
+ ssh $user@server1234 /bin/sh <<EOF ...
+ ssh -T $user@server1234 <<EOF ...