1

我刚开始使用 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
4

2 回答 2

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
于 2012-11-21T13:38:59.080 回答
1

该消息Pseudo-terminal will not be allocated because stdin is not a terminal是由于stdin远程主机的 shell 正在从此处的文档重定向,并且没有指定远程主机执行的命令,即远程主机首先假设需要分配一个伪-terminal 由于缺少命令而用于交互式登录会话(请参阅ssh手册页的概要:) ,但随后意识到其外壳不是终端,因为它是从此处的文档重定向的。结果是远程主机拒绝分配一个伪终端。ssh ... [user@]hostname [command]stdin

在给定情况下的解决方案是只指定一个 shell 作为远程主机执行此处文档中给出的命令的命令。

作为将 shell 指定为命令的替代方法,可以预先告知远程主机不需要使用-T开关分配伪终端。

-t另一方面,仅当指定的命令需要远程主机上的交互式登录 shell 会话(例如topvim)时,才需要该开关。

- ssh $user@server1234 <<EOF ...
+ ssh $user@server1234 /bin/sh <<EOF ...
+ ssh -T $user@server1234 <<EOF ...
于 2013-12-19T16:37:14.103 回答