Ubuntu/Bash 中顺序 SSH 命令执行不起作用

Ubuntu/Bash 中顺序 SSH 命令执行不起作用

我的要求是,我需要一组需要在文本文件中执行的命令。我的 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

将解决您的问题。

相关内容