【发布时间】:2013-12-24 18:44:00
【问题描述】:
我有一个用来比较目录内容的 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 列表效果很好。我也收到错误“不会分配伪终端,因为标准输入不是终端”。将 -t -t 添加到 ssh 命令也无济于事 谢谢
【问题讨论】:
-
使用
dirdiff之类的东西,或者如果您愿意,有一个非常不错的 ViM 插件DirDiff。 -
@AlexejMagura,我不/不能安装任何插件。我的问题是 ssh 命令。它正在列出运行脚本的主机的 /tmp,而不是我打算在其上运行 ls 命令的远程主机
-
为什么 ssh 命令周围有反引号?
-
打开
set -vx以调试/跟踪您的脚本。您需要看到/tmp在发送到ssh user@host的cmd 中,这只是获取正确引用的问题。您发布的问题掩盖了您的问题,将其归结为某人可以从他们的 cmd 行执行的内容。祝你好运。 -
@shellter,在命令行上,ssh user@$SERVER1 'ls -l /tmp' 执行得很好。我还添加了密钥等,并且没有提示输入密码。我有反勾号以便执行命令。