我有一个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命令也没有帮助 谢谢
答案 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;