Bash脚本通过SSH远程传递命令

时间:2012-11-21 13:06:54

标签: bash ssh grep find io-redirection

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

2 个答案:

答案 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会话(例如-ttop)时,才需要vim开关。

- ssh $user@server1234 <<EOF ...
+ ssh $user@server1234 /bin/sh <<EOF ...
+ ssh -T $user@server1234 <<EOF ...