我的要求是,我需要一组需要在文本文件中执行的命令。我的 Shell 脚本必须读取每个命令,执行并将结果存储在单独的文件中。
以下是满足上述要求的代码片段。
while read command
do
echo 'Command :' $command >> "$OUTPUT_FILE"
redirect_pos=`expr index "$command" '>>'`
if [ `expr index "$command" '>>'` != 0 ];then
redirect_fn "$redirect_pos" "$command";
else
$command
state=$?
if [ $state != 0 ];then
echo "command failed." >> "$OUTPUT_FILE"
else
echo "executed successfully." >> "$OUTPUT_FILE"
fi
fi
echo >> "$OUTPUT_FILE"
done < "$INPUT_FILE"
样本Commands.txt
将会是这样的...
tar -rvf /var/tmp/logs.tar -C /var/tmp/ Commands_log.txt
gzip /var/tmp/logs.tar
rm -f /var/tmp/list.txt
对于需要在本地机器上执行的命令,这工作得很好。但是当我尝试执行以下 ssh 命令时,只有第一个命令被执行。
以下是我在文本文件中添加的一些 ssh 命令。
ssh uname@hostname1 tar -rvf /var/tmp/logs.tar -C /var/tmp/ Commands_log.txt
ssh uname@hostname2 gzip /var/tmp/logs.tar
ssh .. etc
当我在 cli 中执行此操作时,它运行正常。有人能帮我吗?
答案1
我不确定我是否正确理解了你的问题。但只需在本地生成脚本,通过 scp 复制它,然后使用 ssh 执行它应该会容易得多。
如果您希望仅使用 ssh 执行它,则应使用以下语法:
ssh localhost -C "echo test; echo blub"
编辑:好的,我终于在你的脚本中找到了问题。$command 在“while read”循环内运行你的“命令”,而当本地命令如“echo”或“tar -f”(-f 很重要,因为它接受一个 FILE 并且不来自 stdin 的输入)时,一切都运行正常。
另一方面,SSH 尝试创建一个“交互式”会话,将您的键盘输入转发到另一台机器。现在的问题是,它从您的“< $INPUT_FILE”重定向中读取所有“等待数据”,并将其发送到 ssh 主机。
您实际上可以看到这种行为。尝试添加以下命令:
ssh user@host tee flush.txt
Tee 现在将 $INPUT_FILE 的“剩余部分”重定向到远程主机文件“flush.txt”。因此,下次我们传递“done”时,就没有任何内容可供“read”使用了。
要修复此行为,您只需告诉 $command 从 /dev/null 之类的地方获取输入。
$command < /dev/null
将解决您的问题。