用于比较远程目录的Shell脚本

时间:2013-12-24 18:44:01

标签: linux bash shell ssh diff

我有一个shell脚本,用于比较目录内容。该脚本必须ssh到不同的服务器才能获得目录列表。当我运行下面的脚本时,我得到的服务器内容是我登录的/ tmp目录列表,而不是我尝试ssh到的服务器的内容。你能告诉我我做错了什么吗? 脚本中使用的配置文件如下(称为config.txt):

server1,server2,/tmp

脚本如下

#!/bin/sh
CONFIGFILE="config.txt"
IFS=","
while read a b c
do
    SERVER1=$a
    SERVER2=$b
    COMPDIR=$c
    `ssh user@$SERVER1 'ls -l $COMPDIR'`| sed -n '1!p' >> server1.txt
    `ssh user@$SERVER2 'ls -l $COMPDIR'`| sed -n '1!p' >> server2.txt
done < $CONFIGFILE

当我查看server1.txt和server2.txt的输出时,它们都完全相同 - 具有运行脚本的服务器的/ tmp内容(不是server1或2)。在命令行上执行ssh + dir列表工作正常。我也收到错误“由于stdin不是终端,因此不会分配伪终端”。将-t -t添加到ssh命令也没有帮助 谢谢

2 个答案:

答案 0 :(得分:0)

  

我有后退标记以执行命令。

执行命令不需要反引号 - 它们用于将命令的标准输出扩展到命令行。当然,您不希望将ssh命令的输出解释为命令。因此,它应该没有反引号就可以正常工作:

    ssh user@$SERVER1 "ls -l $COMPDIR" | sed -n '1!p' >>server1.txt
    ssh user@$SERVER2 "ls -l $COMPDIR" | sed -n '1!p' >>server2.txt

(假设使用双引号以允许扩展$COMPDIR)。

答案 1 :(得分:-1)

首先你需要生成密钥才能登录到没有密钥的远程

ssh-keygen  -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

然后尝试ssh而不传递

ssh remote-host

然后尝试在您的脚本中调用,但首先进行健全性检查

var1=$(ssh remote-host) die "Cannot connect to remote host" unless $var1;